svelte-draft
Version:
Develop svelte app in typedraft
174 lines (173 loc) • 7.31 kB
JavaScript
;
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;
}