UNPKG

svelte-draft

Version:
174 lines (173 loc) 7.31 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const fs_extra_1 = require("fs-extra"); const traverse = require("filewalker"); const watch = require("node-watch"); const src_1 = require("../src"); const typedraft_1 = require("typedraft"); const core_1 = require("@babel/core"); const TypescriptPreset = require("@babel/preset-typescript"); function TraverseDirectory(path, callback, onTraverseEnd = () => { }) { const action = (relative, stats, absolute) => callback(relative, absolute); traverse(path).on("file", action).on("done", onTraverseEnd).walk(); } function InspectDirectory(path, config) { ComposeDirectory(path, config); //@ts-ignore watch(path, { recursive: true }, (event, name) => { if (name.endsWith(".tsx")) { console.log(event, name); try { ComposeFile(name, config); } catch (error) { console.log(error.message); } } }); } exports.InspectDirectory = InspectDirectory; function InspectFile(path, config) { ComposeFile(path, config); //@ts-ignore watch(path, (event, name) => { if (name.endsWith(".tsx")) { console.log(event, name); try { ComposeFile(name, config); } catch (error) { console.log(error.message); } } }); } exports.InspectFile = InspectFile; function ComposeDirectory(path, config, onTraverseEnd = () => { }) { TraverseDirectory(path, (relative, absolute) => { if (absolute.endsWith(".tsx") || absolute.endsWith(".ts")) { try { ComposeFile(absolute, config); } catch (error) { console.log(`compose file failed: ${error.message}, source: ${relative}`); } } }, onTraverseEnd); } exports.ComposeDirectory = ComposeDirectory; function CrossoutDirectory(path) { TraverseDirectory(path, (relative, absolute) => { if (absolute.endsWith(".tsx")) { fs_extra_1.removeSync(absolute.replace(".tsx", ".svelte")); } else if (absolute.endsWith(".ts")) { fs_extra_1.removeSync(absolute.replace(".ts", ".js")); } }); } exports.CrossoutDirectory = CrossoutDirectory; function ComposeFile(source, config) { if (source.endsWith(".js.tsx") || source.endsWith(".ts")) { const code = TranscribeTypeDraftSync(source, config); fs_extra_1.outputFileSync(source.replace(source.endsWith(".js.tsx") ? ".js.tsx" : ".ts", ".js"), code, "utf8"); } else if (source.endsWith(".tsx")) { const component = TranscribeSvelteDraftSync(source, config); fs_extra_1.outputFileSync(source.replace(".tsx", ".svelte"), component, "utf8"); } } exports.ComposeFile = ComposeFile; function TranscribeTypeDraftAsync(source, config) { return __awaiter(this, void 0, void 0, function* () { const code = yield fs_extra_1.readFile(source, "utf8"); const transcriber = new typedraft_1.Transcriber(code); AddDSLs(transcriber, config); const ts_code = transcriber.Transcribe(); const js_code = yield core_1.transformAsync(ts_code, { filename: "script.tsx", ast: true, presets: [[TypescriptPreset, { jsxPragma: "preserve", isTSX: true, allExtensions: true }]], }); return js_code.code; }); } exports.TranscribeTypeDraftAsync = TranscribeTypeDraftAsync; function TranscribeTypeDraftSync(source, config) { const code = fs_extra_1.readFileSync(source, "utf8"); const transcriber = new typedraft_1.Transcriber(code); AddDSLs(transcriber, config); const ts_code = transcriber.Transcribe(); const js_code = core_1.transformSync(ts_code, { filename: "script.tsx", ast: true, presets: [[TypescriptPreset, { jsxPragma: "preserve", isTSX: true, allExtensions: true }]], }).code; return js_code; } exports.TranscribeTypeDraftSync = TranscribeTypeDraftSync; function TranscribeSvelteDraftAsync(source, config) { return __awaiter(this, void 0, void 0, function* () { // const code = yield fs_extra_1.readFile(source, "utf8"); const { import_section, script_section, template_section, module_context } = Transcribe(code, config); // const style_path = source.replace(".tsx", ".css"); const style_section = (yield fs_extra_1.pathExists(style_path)) ? yield fs_extra_1.readFile(style_path, "utf8") : ""; // const component = AssembleComponent(import_section, script_section, template_section, style_section, module_context); return component; }); } exports.TranscribeSvelteDraftAsync = TranscribeSvelteDraftAsync; function TranscribeSvelteDraftSync(source, config) { // const code = fs_extra_1.readFileSync(source, "utf8"); const { import_section, script_section, template_section, module_context } = Transcribe(code, config); // const style = source.replace(".tsx", ".css"); const style_section = fs_extra_1.existsSync(style) ? fs_extra_1.readFileSync(style, "utf8") : ""; // const component = AssembleComponent(import_section, script_section, template_section, style_section, module_context); return component; } exports.TranscribeSvelteDraftSync = TranscribeSvelteDraftSync; function Transcribe(code, config) { const transcriber = new src_1.SvelteTranscriber(code); AddDSLs(transcriber, config); const module_context = transcriber.ExtractModuleContext(); const { import_section, script_section, template_section } = transcriber.TranscribeToSections(); return { import_section, script_section, template_section, module_context }; } function AddDSLs(transcriber, config) { config.DSLs.forEach(({ name, dsl }) => transcriber.AddDSL(name, dsl())); } function AssembleComponent(import_section, script_section, template_section, style_section, module_context) { const module_context_section = module_context ? `<script context="module">\n${module_context}\n</script>` : ""; const component = [ module_context_section, "<script>", import_section, "\n", script_section, "</script>", "\n", template_section, "\n", "<style>", style_section, "</style>", ].join("\n"); return component; }