66 lines
2.6 KiB
JavaScript
66 lines
2.6 KiB
JavaScript
|
|
#!/usr/bin/env node
|
||
|
|
// Build the standalone editor for PRODUCTION and serve it with `vite preview`
|
||
|
|
// — the server the web e2e suite runs against (playwright-web.config.ts), so
|
||
|
|
// the tests exercise the minified production bundle instead of the dev server.
|
||
|
|
//
|
||
|
|
// node scripts/build-preview.mjs
|
||
|
|
//
|
||
|
|
// Steps:
|
||
|
|
// 1. link-wasm.mjs: sync output/ artifacts into tests/apps/kicad and (re)make
|
||
|
|
// the public/wasm symlink — preview serves /wasm through it (vite.config's
|
||
|
|
// serveWasm plugin), NOT from dist/.
|
||
|
|
// 2. `pnpm run build` at the web/ workspace root (turbo orders the workspace
|
||
|
|
// deps: shared, sync-client, then standalone). The public/wasm symlink is
|
||
|
|
// stashed aside during the build — same move as scripts/deploy/
|
||
|
|
// build-demo.mjs — because vite would otherwise copy the whole artifact
|
||
|
|
// tree (100s of MB) into dist/. VITE_* env must be set by the caller at
|
||
|
|
// BUILD time (prod bundles bake them in; the dev server read them live).
|
||
|
|
// 3. exec `vite preview` as the persistent server (the playwright webServer
|
||
|
|
// health-checks the URL and kills the process tree on teardown).
|
||
|
|
|
||
|
|
import { execFileSync, spawn } from "node:child_process";
|
||
|
|
import { existsSync, lstatSync, renameSync } from "node:fs";
|
||
|
|
import * as path from "node:path";
|
||
|
|
import { fileURLToPath } from "node:url";
|
||
|
|
|
||
|
|
const scriptDir = path.dirname(fileURLToPath(import.meta.url));
|
||
|
|
const standalone = path.resolve(scriptDir, "..");
|
||
|
|
const webRoot = path.resolve(standalone, "..");
|
||
|
|
const publicWasm = path.join(standalone, "public", "wasm");
|
||
|
|
const stash = path.join(standalone, "public", ".wasm.e2e-stashed");
|
||
|
|
|
||
|
|
const isLink = (p) => {
|
||
|
|
try {
|
||
|
|
return lstatSync(p).isSymbolicLink();
|
||
|
|
} catch {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
// 1. Sync artifacts + (re)create the symlink.
|
||
|
|
execFileSync("node", [path.join(scriptDir, "link-wasm.mjs")], {
|
||
|
|
stdio: "inherit",
|
||
|
|
});
|
||
|
|
|
||
|
|
// 2. Build with the symlink stashed out of public/ (restore even on failure —
|
||
|
|
// a dangling stash would make the next dev run serve nothing at /wasm).
|
||
|
|
const hadWasm = existsSync(publicWasm) || isLink(publicWasm);
|
||
|
|
if (hadWasm) renameSync(publicWasm, stash);
|
||
|
|
try {
|
||
|
|
execFileSync("pnpm", ["run", "build"], { cwd: webRoot, stdio: "inherit" });
|
||
|
|
} finally {
|
||
|
|
if (hadWasm) renameSync(stash, publicWasm);
|
||
|
|
}
|
||
|
|
|
||
|
|
// 3. Serve dist/ (vite.config preview: STANDALONE_PORT, strictPort, COOP/COEP;
|
||
|
|
// the serveWasm plugin provides /wasm from the restored symlink).
|
||
|
|
const preview = spawn("pnpm", ["exec", "vite", "preview"], {
|
||
|
|
cwd: standalone,
|
||
|
|
stdio: "inherit",
|
||
|
|
});
|
||
|
|
preview.on("exit", (code, signal) => {
|
||
|
|
process.exit(signal ? 1 : (code ?? 1));
|
||
|
|
});
|
||
|
|
for (const sig of ["SIGINT", "SIGTERM"]) {
|
||
|
|
process.on(sig, () => preview.kill(sig));
|
||
|
|
}
|