import { spawn } from "node:child_process"; /** * @param {string} command * @param {string[]} args * @param {string} [cwd] * @returns {Promise} */ export default function (command, args, cwd) { if (typeof command !== "string" || command.length === 0) throw new Error("Command must be a string and not empty"); if (args == null) args = []; else if (!Array.isArray(args) || args.some((arg) => typeof arg !== "string")) throw new Error("Args must be an array of strings"); return new Promise((resolve, reject) => { const child = spawn(command, args, { cwd, shell: true, stdio: "inherit" }); process.on("SIGTERM", () => child.kill("SIGTERM")); process.on("SIGINT", () => child.kill("SIGINT")); process.on("SIGBREAK", () => child.kill("SIGBREAK")); process.on("SIGHUP", () => child.kill("SIGHUP")); child.on("error", reject); child.on("exit", (code, signal) => { if (code === null) code = signal === "SIGINT" ? 0 : 1; if (code === 0) { resolve(); } else { reject(code); } }); }); }