singularity-forge/scripts/dev.js
2026-05-05 14:46:18 +02:00

53 lines
1.2 KiB
JavaScript

#!/usr/bin/env node
/**
* Dev supervisor — runs tsc --watch and watch-resources.js in parallel.
*
* Both processes terminate together when either exits or when the parent
* receives SIGINT/SIGTERM. This avoids the problem with shell backgrounding
* (`&`) where the watcher can outlive tsc and orphan.
*/
import { spawn } from "node:child_process";
import { createRequire } from "node:module";
import { resolve } from "node:path";
const __dirname = import.meta.dirname;
const root = resolve(__dirname, "..");
const require = createRequire(import.meta.url);
const tscBin = require.resolve("typescript/bin/tsc");
const procs = [
spawn("node", [resolve(__dirname, "watch-resources.js")], {
cwd: root,
stdio: "inherit",
}),
spawn(process.execPath, [tscBin, "--watch"], {
cwd: root,
stdio: "inherit",
}),
];
function cleanup() {
for (const p of procs) {
try {
p.kill();
} catch {}
}
}
// If either child exits, kill the other and exit with its code
for (const p of procs) {
p.on("exit", (code) => {
cleanup();
process.exit(code ?? 1);
});
}
// Forward signals to children
for (const sig of ["SIGINT", "SIGTERM"]) {
process.on(sig, () => {
cleanup();
process.exit(0);
});
}