61 lines
2.0 KiB
TypeScript
61 lines
2.0 KiB
TypeScript
import { spawnSync } from "node:child_process";
|
|
import { rm } from "node:fs/promises";
|
|
import process from "node:process";
|
|
|
|
import { INSTALLED_RUNTIME_CAPABILITIES } from "../src/features/installed-runtime-capabilities.ts";
|
|
|
|
/**
|
|
* §17.2.2. Deterministic two-pass build.
|
|
*
|
|
* The Service Worker needs the exact hashed asset list at compile time, so the
|
|
* order is fixed:
|
|
*
|
|
* 1. clean dist and .generated/frontend-runtime
|
|
* 2. generate contractSet and build-info source
|
|
* 3. Vite app build (emptyOutDir = true)
|
|
* 4. scan app dist and generate the static asset source
|
|
* 5. ACTIVE only: Vite Service Worker build (emptyOutDir = false)
|
|
* 6. generate Release Manifest V2 and the build manifest
|
|
*
|
|
* Steps 4 and 5 are skipped for `REMOVE_REGISTRATION`, `PURGE_OWNED_RESOURCES`
|
|
* and `null`: those modes never run an active worker build.
|
|
*/
|
|
|
|
const selection = INSTALLED_RUNTIME_CAPABILITIES.serviceWorker;
|
|
const buildsActiveWorker = selection?.mode === "ACTIVE";
|
|
|
|
function run(command: string, args: readonly string[]): void {
|
|
const result = spawnSync(command, [...args], {
|
|
stdio: "inherit",
|
|
env: process.env,
|
|
});
|
|
if (result.status !== 0) {
|
|
process.stderr.write(`build step failed: ${command} ${args.join(" ")}\n`);
|
|
process.exit(result.status ?? 1);
|
|
}
|
|
}
|
|
|
|
// 1. clean
|
|
await rm("dist", { recursive: true, force: true });
|
|
await rm(".generated/frontend-runtime", { recursive: true, force: true });
|
|
|
|
// 2. contract set + build info
|
|
run("node", ["scripts/generate-contract-set.ts"]);
|
|
|
|
// 3. app build
|
|
run("npx", ["vite", "build"]);
|
|
|
|
if (buildsActiveWorker) {
|
|
// 4. hashed asset inventory
|
|
run("node", ["scripts/generate-service-worker-assets.ts", "dist"]);
|
|
// 5. service worker build
|
|
run("npx", ["vite", "build", "--config", "vite.service-worker.config.ts"]);
|
|
} else {
|
|
process.stdout.write(
|
|
`service worker mode ${selection?.mode ?? "null"}: skipping worker build\n`,
|
|
);
|
|
}
|
|
|
|
// 6. release + build manifest
|
|
run("node", ["scripts/generate-build-manifest.ts"]);
|