107 lines
3.1 KiB
JavaScript
107 lines
3.1 KiB
JavaScript
import { build } from "bun";
|
|
import { copyFile, mkdir, writeFile, readFile, rm } from "node:fs/promises";
|
|
import { join, resolve } from "node:path";
|
|
|
|
const __dirname = new URL(".", import.meta.url).pathname;
|
|
const ROOT_DIR = resolve(__dirname);
|
|
const SRC_DIR = resolve(ROOT_DIR, "src");
|
|
|
|
await rm("./dist", { recursive: true, force: true });
|
|
await mkdir("./dist/browser", { recursive: true });
|
|
await mkdir("./dist/node-esm", { recursive: true });
|
|
await mkdir("./dist/node-cjs", { recursive: true });
|
|
|
|
const wasmBinary = await readFile("./wasm/d2.wasm");
|
|
const wasmExecJs = await readFile("./wasm/wasm_exec.js", "utf8");
|
|
|
|
await writeFile(
|
|
join(SRC_DIR, "wasm-loader.browser.js"),
|
|
`export const wasmBinary = Uint8Array.from(atob("${Buffer.from(wasmBinary).toString(
|
|
"base64"
|
|
)}"), c => c.charCodeAt(0));
|
|
export const wasmExecJs = ${JSON.stringify(wasmExecJs)};`
|
|
);
|
|
|
|
const commonConfig = {
|
|
minify: true,
|
|
};
|
|
|
|
async function buildDynamicFiles(platform) {
|
|
const platformContent =
|
|
platform === "node"
|
|
? `export * from "./platform.node.js";`
|
|
: `export * from "./platform.browser.js";`;
|
|
|
|
const platformPath = join(SRC_DIR, "platform.js");
|
|
await writeFile(platformPath, platformContent);
|
|
|
|
const workerSource =
|
|
platform === "node"
|
|
? join(SRC_DIR, "worker.node.js")
|
|
: join(SRC_DIR, "worker.browser.js");
|
|
|
|
const workerTarget = join(SRC_DIR, "worker.js");
|
|
const workerContent = await readFile(workerSource, "utf8");
|
|
await writeFile(workerTarget, workerContent);
|
|
}
|
|
|
|
async function buildAndCopy(buildType) {
|
|
const configs = {
|
|
browser: {
|
|
outdir: resolve(ROOT_DIR, "dist/browser"),
|
|
splitting: false,
|
|
format: "esm",
|
|
target: "browser",
|
|
platform: "browser",
|
|
entrypoints: [resolve(SRC_DIR, "index.js")],
|
|
},
|
|
"node-esm": {
|
|
outdir: resolve(ROOT_DIR, "dist/node-esm"),
|
|
splitting: true,
|
|
format: "esm",
|
|
target: "node",
|
|
platform: "node",
|
|
entrypoints: [resolve(SRC_DIR, "index.js"), resolve(SRC_DIR, "worker.js")],
|
|
},
|
|
"node-cjs": {
|
|
outdir: resolve(ROOT_DIR, "dist/node-cjs"),
|
|
splitting: false,
|
|
format: "cjs",
|
|
target: "node",
|
|
platform: "node",
|
|
entrypoints: [resolve(SRC_DIR, "index.js"), resolve(SRC_DIR, "worker.js")],
|
|
},
|
|
};
|
|
|
|
const config = configs[buildType];
|
|
await buildDynamicFiles(config.platform);
|
|
|
|
const result = await build({
|
|
...commonConfig,
|
|
...config,
|
|
});
|
|
|
|
if (!result.outputs || result.outputs.length === 0) {
|
|
throw new Error(
|
|
`No outputs generated for ${buildType} build. Result: ${JSON.stringify(result)}`
|
|
);
|
|
}
|
|
|
|
if (buildType !== "browser") {
|
|
await copyFile(resolve(ROOT_DIR, "wasm/d2.wasm"), join(config.outdir, "d2.wasm"));
|
|
await copyFile(
|
|
resolve(ROOT_DIR, "wasm/wasm_exec.js"),
|
|
join(config.outdir, "wasm_exec.js")
|
|
);
|
|
await copyFile(resolve(ROOT_DIR, "src/elk.js"), join(config.outdir, "elk.js"));
|
|
}
|
|
}
|
|
|
|
try {
|
|
await buildAndCopy("browser");
|
|
await buildAndCopy("node-esm");
|
|
await buildAndCopy("node-cjs");
|
|
} catch (error) {
|
|
console.error("Build failed:", error);
|
|
process.exit(1);
|
|
}
|