eng/scripts/helpers.js (72 lines of code) (raw):
// @ts-check
const { spawn, spawnSync } = require("child_process");
const { resolve } = require("path");
const repoRoot = resolve(__dirname, "../..");
const prettier = resolve(
repoRoot,
"packages/extensions/core/node_modules/.bin/prettier"
);
const tsc = resolve(repoRoot, "packages/extensions/core/node_modules/.bin/tsc");
const isCmdOnWindows = ["rush", "npm", "code", "code-insiders", tsc, prettier];
function run(command, args, options) {
console.log();
console.log(`> ${command} ${args.join(" ")}`);
options = {
stdio: "inherit",
sync: true,
throwOnNonZeroExit: true,
...options,
};
if (process.platform === "win32" && isCmdOnWindows.includes(command)) {
command += ".cmd";
}
const proc = (options.sync ? spawnSync : spawn)(command, args, options);
if (proc.error) {
if (options.ignoreCommandNotFound && proc.error.code === "ENOENT") {
console.log(`Skipped: Command \`${command}\` not found.`);
} else {
throw proc.error;
}
} else if (
options.throwOnNonZeroExit &&
proc.status !== undefined &&
proc.status !== 0
) {
throw new CommandFailedError(
`Command \`${command} ${args.join(" ")}\` failed with exit code ${
proc.status
}`,
proc
);
}
return proc;
}
class CommandFailedError extends Error {
constructor(msg, proc) {
super(msg);
this.proc = proc;
}
}
function runPrettier(...args) {
run(
prettier,
[
...args,
"--config",
".prettierrc.yml",
"--ignore-path",
".prettierignore",
"**/*.{ts,js,cjs,mjs,json,yml,yaml,cadl,md}",
],
{
cwd: repoRoot,
}
);
}
module.exports = {
repoRoot,
prettier,
tsc,
run,
runPrettier,
CommandFailedError,
};