@coveo/semantic-monorepo-tools
Version:
A library of helper functions to do SemVer2 compliant releases from Conventional Commits in monorepos
55 lines (47 loc) • 1.42 kB
text/typescript
import { Debugger } from "debug";
import { spawn, SpawnOptions } from "node:child_process";
import defaultLogger from "./logger.js";
interface Options extends SpawnOptions {
encoding?: "ascii" | "utf8" | "utf-8";
}
type spawnOutputs = {
stdout: string;
stderr: string;
};
export default function (
command: string,
args: string[],
logger: Debugger = defaultLogger,
options: Options = {},
): Promise<{ stdout: string; stderr: string }> {
const loggableArgs = args.join(" ");
logger?.('executing "%s %s"', command, loggableArgs);
let stdout = "";
let stderr = "";
const { encoding, ...spawnOptions } = {
encoding: "utf-8",
shell: process.platform === "win32" ? "powershell" : undefined,
...options,
};
return new Promise<spawnOutputs>((resolve, reject) => {
const childProcess = spawn(command, args, spawnOptions);
childProcess.stdout.on("data", (data) => {
logger?.(`STDOUT: ${data}`);
stdout += data.toString(encoding);
});
childProcess.stderr.on("data", (data) => {
logger?.(`STDERR: ${data}`);
stderr += data.toString(encoding);
});
childProcess.on("close", (code, signal) => {
logger?.(
`${command} ${loggableArgs} finished with code ${code} and signal '${signal}'`,
);
if (code) {
reject({ stdout, stderr });
} else {
resolve({ stdout, stderr });
}
});
});
}