50 lines
1.1 KiB
JavaScript
50 lines
1.1 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
import { spawn } from "node:child_process";
|
|
|
|
const args = process.argv.slice(2);
|
|
const env = { ...process.env };
|
|
|
|
let separatorIndex = args.indexOf("--");
|
|
let commandStart = separatorIndex >= 0 ? separatorIndex + 1 : 0;
|
|
|
|
for (let i = 0; i < (separatorIndex >= 0 ? separatorIndex : args.length); i++) {
|
|
const arg = args[i];
|
|
const eq = arg.indexOf("=");
|
|
if (eq <= 0) {
|
|
commandStart = i;
|
|
separatorIndex = -1;
|
|
break;
|
|
}
|
|
env[arg.slice(0, eq)] = arg.slice(eq + 1);
|
|
}
|
|
|
|
const commandArgs = args.slice(commandStart);
|
|
if (commandArgs.length === 0) {
|
|
process.stderr.write(
|
|
"with-env: expected a command after environment assignments\n",
|
|
);
|
|
process.exit(1);
|
|
}
|
|
|
|
const [command, ...childArgs] = commandArgs;
|
|
const child = spawn(command, childArgs, {
|
|
stdio: "inherit",
|
|
env,
|
|
shell: process.platform === "win32",
|
|
});
|
|
|
|
child.on("exit", (code, signal) => {
|
|
if (signal) {
|
|
process.kill(process.pid, signal);
|
|
return;
|
|
}
|
|
process.exit(code ?? 0);
|
|
});
|
|
|
|
child.on("error", (error) => {
|
|
process.stderr.write(
|
|
`with-env: failed to run ${command}: ${error.message}\n`,
|
|
);
|
|
process.exit(1);
|
|
});
|