UNPKG

maests

Version:

An executable compiler for creating Maestro's yaml-flows with typescript.

88 lines (87 loc) 3.33 kB
import { parseModule } from "magicast"; import { createYamlOutPath, jiti } from "./utils.mjs"; import { fileURLToPath } from "url"; import { dirname, join } from "path"; import { build } from "esbuild"; import { readFileSync } from "fs"; import * as ts from "typescript"; const rewriteRunScriptPlugin = () => ({ name: "rewrite-run-script", setup(build2) { build2.onLoad({ filter: /.*/ }, async (args) => { let code = readFileSync(args.path, "utf-8"); const _imports = parseModule(code).imports, imports = JSON.parse(JSON.stringify(_imports)), rewriteMap = Object.fromEntries( Object.entries(imports).map(([key, value]) => { value.from.startsWith(".") && (value.from = join(dirname(args.path), value.from)); let path = jiti.esmResolve(value.from, { try: !0 }); return path && (path = fileURLToPath(path)), [key, path]; }) ); return code = rewriteRunScript(code, rewriteMap), { contents: code, loader: "ts" }; }); } }), rewriteCode = async (fullFlowPath) => { const yamlOutPath = createYamlOutPath(fullFlowPath); let code = await build({ entryPoints: [fullFlowPath], bundle: !0, packages: "external", platform: "node", write: !1, target: "esnext", plugins: [rewriteRunScriptPlugin()], format: "esm" }).then((bundled) => bundled.outputFiles[0].text); return code = `import { writeYaml } from 'maests/write-yaml' ` + code + ` writeYaml("${yamlOutPath}")`, code; }, rewriteRunScript = (code, rewriteMap) => { const sourceFile = ts.createSourceFile( "tempFile.ts", code, ts.ScriptTarget.Latest, !0 ), transformer = (context) => { const visit = (node) => { if (ts.isCallExpression(node)) { const expression = node.expression; if (ts.isPropertyAccessExpression(expression) && ts.isIdentifier(expression.expression) && expression.expression.text === "M" && expression.name.text === "runScript" && node.arguments.length > 0 && ts.isIdentifier(node.arguments[0])) { const argName = node.arguments[0].text, newArguments = [ ts.factory.createStringLiteral(rewriteMap[argName]), ts.factory.createStringLiteral(argName) ]; return ts.factory.updateCallExpression( node, expression, node.typeArguments, newArguments ); } } return ts.visitEachChild(node, visit, context); }; return (node) => ts.visitNode(node, visit); }, result = ts.transform(sourceFile, [transformer]), printer = ts.createPrinter(), transformedSourceFile = result.transformed[0]; return printer.printFile(transformedSourceFile); }, deleteExport = (code) => { const sourceFile = ts.createSourceFile( "tempFile.ts", code, ts.ScriptTarget.Latest, !0 ), transformer = (context) => { const visit = (node) => { if (!(ts.isExportDeclaration(node) || ts.isExportAssignment(node))) return ts.visitEachChild(node, visit, context); }; return (node) => ts.visitNode(node, visit); }, result = ts.transform(sourceFile, [transformer]), printer = ts.createPrinter(), transformedSourceFile = result.transformed[0]; return printer.printFile(transformedSourceFile); }; export { deleteExport, rewriteCode };