maests
Version:
An executable compiler for creating Maestro's yaml-flows with typescript.
88 lines (87 loc) • 3.33 kB
JavaScript
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
};