interface ChildProcessInfo { name: string; process: Bun.Subprocess; } const env = { ...process.env, BACKEND_PORT: process.env.PORT ?? "3000", }; const children: ChildProcessInfo[] = [ { name: "server", process: Bun.spawn(["bun", "run", "dev:server"], { env, stdout: "inherit", stderr: "inherit", }), }, { name: "web", process: Bun.spawn(["bun", "run", "dev:web"], { env, stdout: "inherit", stderr: "inherit", }), }, ]; const stopChildren = () => { for (const child of children) { child.process.kill(); } }; process.on("SIGINT", () => { stopChildren(); process.exit(130); }); process.on("SIGTERM", () => { stopChildren(); process.exit(143); }); const firstExit = await Promise.race( children.map(async (child) => ({ name: child.name, code: await child.process.exited })), ); stopChildren(); if (firstExit.code !== 0) { console.error(`${firstExit.name} exited with code ${firstExit.code}`); process.exit(firstExit.code ?? 1); }