63 lines
1.6 KiB
JavaScript
Executable File
63 lines
1.6 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
|
|
import esbuild from "esbuild";
|
|
import { readFile, unlink, writeFile } from "fs/promises";
|
|
import path from "path";
|
|
|
|
import yargs from "yargs";
|
|
import { hideBin } from "yargs/helpers";
|
|
|
|
async function compile(filePath, sourceMap) {
|
|
let tempFile = "out.js";
|
|
let js = await esbuild.build({
|
|
entryPoints: [filePath],
|
|
bundle: true,
|
|
format: "iife",
|
|
globalName: "mod",
|
|
platform: "neutral",
|
|
sourcemap: sourceMap ? "inline" : false,
|
|
minify: true,
|
|
outfile: tempFile,
|
|
});
|
|
|
|
let jsCode = (await readFile(tempFile)).toString();
|
|
jsCode = jsCode.replace(/^var mod ?= ?/, "");
|
|
await unlink(tempFile);
|
|
return jsCode;
|
|
}
|
|
|
|
async function bundle(manifestPath, sourceMaps) {
|
|
const rootPath = path.dirname(manifestPath);
|
|
const manifest = JSON.parse((await readFile(manifestPath)).toString());
|
|
|
|
for (let [name, def] of Object.entries(manifest.functions)) {
|
|
let jsFunctionName = def.functionName,
|
|
filePath = path.join(rootPath, def.path);
|
|
if (filePath.indexOf(":") !== -1) {
|
|
[filePath, jsFunctionName] = filePath.split(":");
|
|
} else if (!jsFunctionName) {
|
|
jsFunctionName = "default";
|
|
}
|
|
|
|
def.code = await compile(filePath, sourceMaps);
|
|
def.path = filePath;
|
|
def.functionName = jsFunctionName;
|
|
}
|
|
return manifest;
|
|
}
|
|
async function run() {
|
|
let args = await yargs(hideBin(process.argv))
|
|
.option("debug", {
|
|
type: "boolean",
|
|
})
|
|
.parse();
|
|
|
|
let generatedManifest = await bundle(args._[0], !!args.debug);
|
|
writeFile(args._[1], JSON.stringify(generatedManifest, null, 2));
|
|
}
|
|
|
|
run().catch((e) => {
|
|
console.error(e);
|
|
process.exit(1);
|
|
});
|