src/utils/exec.ts (34 lines of code) (raw):
import childProcess from "child_process";
// copied from https://github.com/aws/aws-cdk/blob/eda1640fcaf6375d7edc5f8edcb5d69c82d130a1/packages/aws-cdk/lib/init.ts#L381-L404
export async function execute(cmd: string, args: string[], { cwd }: { cwd: string }): Promise<string> {
const child = childProcess.spawn(cmd, args, {
cwd,
shell: true,
stdio: ["ignore", "pipe", "inherit"],
});
let stdout = "";
// eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access -- ???
child.stdout.on("data", (chunk) => (stdout += chunk.toString()));
return new Promise<string>((ok, fail) => {
child.once("error", (err) => fail(err));
child.once("exit", (status) => {
if (status === 0) {
return ok(stdout.trim());
} else {
process.stderr.write(stdout);
return fail(new Error(`${cmd} exited with status ${status ?? "unknown"}`));
}
});
});
}
export function executeSync(cmd: string, args: string[], { cwd }: { cwd: string }): string {
const { stdout, status } = childProcess.spawnSync(cmd, args, {
cwd,
shell: true,
stdio: ["ignore", "pipe", "inherit"],
});
if (status === 0) {
return stdout.toString().trim();
} else {
process.stderr.write(stdout);
throw new Error(`${cmd} exited with status ${status ?? "unknown"}`);
}
}