1
0
silverbullet/packages/plugos/compile.ts

56 lines
1.5 KiB
TypeScript
Raw Normal View History

2022-04-25 17:46:08 +00:00
import esbuild from "esbuild";
import { readFile, unlink, writeFile } from "fs/promises";
import path from "path";
export async function compile(
filePath: string,
2022-05-11 09:49:27 +00:00
functionName: string | undefined = undefined,
2022-04-25 17:46:08 +00:00
debug: boolean = false,
excludeModules: string[] = [],
meta = false
): Promise<string> {
2022-05-11 09:49:27 +00:00
let outFile = path.resolve(path.dirname(filePath), "_out.tmp");
2022-04-25 17:46:08 +00:00
let inFile = filePath;
if (functionName) {
// Generate a new file importing just this one function and exporting it
2022-05-11 09:49:27 +00:00
inFile = path.resolve(path.dirname(filePath), "_in.ts");
2022-04-25 17:46:08 +00:00
await writeFile(
inFile,
2022-05-11 09:49:27 +00:00
`import {${functionName}} from "./${path.basename(
filePath
)}";export default ${functionName};`
2022-04-25 17:46:08 +00:00
);
}
2022-05-11 09:49:27 +00:00
// console.log("In:", inFile);
// console.log("Outfile:", outFile);
2022-04-25 17:46:08 +00:00
// TODO: Figure out how to make source maps work correctly with eval() code
let result = await esbuild.build({
entryPoints: [path.basename(inFile)],
bundle: true,
format: "iife",
globalName: "mod",
platform: "browser",
sourcemap: false, //sourceMap ? "inline" : false,
minify: !debug,
outfile: outFile,
metafile: true,
external: excludeModules,
absWorkingDir: path.resolve(path.dirname(inFile)),
});
if (meta) {
let text = await esbuild.analyzeMetafile(result.metafile);
console.log("Bundle info for", functionName, text);
}
let jsCode = (await readFile(outFile)).toString();
await unlink(outFile);
if (inFile !== filePath) {
await unlink(inFile);
}
return `(() => { ${jsCode}
return mod;})()`;
}