ifcurl/forgejo/build.js

55 lines
1.8 KiB
JavaScript
Raw Permalink Normal View History

#!/usr/bin/env node
// Bundles viewer JS dependencies and copies web-ifc WASM files into
// custom/public/assets/ so the viewer works without any CDN access.
//
// Run: npm install && npm run build
// Re-run whenever package.json dependency versions change.
import esbuild from "esbuild";
import fs from "fs";
import path from "path";
import { fileURLToPath } from "url";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const outdir = path.join(__dirname, "custom/public/assets");
// Bundle three + @thatopen/components + jszip into a single ESM file.
// viewer.html imports { THREE, OBC, JSZip } from this bundle.
await esbuild.build({
entryPoints: [path.join(__dirname, "viewer-deps-entry.js")],
bundle: true,
format: "esm",
outfile: path.join(outdir, "viewer-deps.js"),
minify: true,
logLevel: "info",
});
// Bundle the fragments worker as a self-contained ESM (all deps inlined).
// viewer.html fetches this and passes the text as a blob URL to fragments.init().
const workerEntry = path.join(
__dirname,
"node_modules/@thatopen/fragments/dist/Worker/worker.mjs"
);
await esbuild.build({
entryPoints: [workerEntry],
bundle: true,
format: "esm",
outfile: path.join(outdir, "fragments-worker.js"),
minify: true,
logLevel: "info",
});
// Copy web-ifc WASM files (loaded at runtime by web-ifc when parsing IFC).
const wasmSrc = path.join(__dirname, "node_modules/web-ifc");
for (const name of ["web-ifc.wasm", "web-ifc-mt.wasm"]) {
const src = path.join(wasmSrc, name);
const dst = path.join(outdir, name);
if (fs.existsSync(src)) {
fs.copyFileSync(src, dst);
const size = (fs.statSync(dst).size / 1024 / 1024).toFixed(1);
console.log(`copied ${name} (${size} MB)`);
} else {
console.warn(`WARNING: ${name} not found in node_modules/web-ifc`);
}
}