diff --git a/package.json b/package.json index 9196015..7f76b3b 100644 --- a/package.json +++ b/package.json @@ -4,12 +4,9 @@ "version": "1.0.0", "workspaces": ["apps/*"], "scripts": { - "dev": "concurrently -n API,WEB -c blue,green \"npm run dev -w @mitwirkung/api\" \"npm run dev -w @mitwirkung/web\"", + "dev": "node scripts/dev.mjs", "build": "npm run build -w @mitwirkung/api && npm run build -w @mitwirkung/web", "test": "npm run test -w @mitwirkung/api", "start": "npm run start -w @mitwirkung/api" - }, - "devDependencies": { - "concurrently": "^9.1.2" } } diff --git a/scripts/dev.mjs b/scripts/dev.mjs new file mode 100644 index 0000000..843889b --- /dev/null +++ b/scripts/dev.mjs @@ -0,0 +1,25 @@ +import { spawn } from "node:child_process"; + +const commands = [ + ["API", ["run", "dev", "-w", "@mitwirkung/api"]], + ["WEB", ["run", "dev", "-w", "@mitwirkung/web"]], +]; + +const children = commands.map(([name, args]) => { + const child = spawn("npm", args, { stdio: ["inherit", "pipe", "pipe"] }); + const forward = (stream, target) => stream.on("data", (data) => { + for (const line of data.toString().split("\n")) { + if (line) target.write(`[${name}] ${line}\n`); + } + }); + forward(child.stdout, process.stdout); + forward(child.stderr, process.stderr); + return child; +}); + +const stop = () => children.forEach((child) => child.kill("SIGTERM")); +process.on("SIGINT", stop); +process.on("SIGTERM", stop); + +const results = await Promise.all(children.map((child) => new Promise((resolve) => child.on("exit", resolve)))); +process.exit(results.some((code) => code !== 0 && code !== null) ? 1 : 0);