@beenotung/tslib
Version:
utils library in Typescript
98 lines (97 loc) • 2.86 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SpawnError = exports.exec = void 0;
exports.spawn = spawn;
exports.spawnAndWait = spawnAndWait;
const tslib_1 = require("tslib");
const child_process_1 = require("child_process");
const util = tslib_1.__importStar(require("util"));
exports.exec = util.promisify(child_process_1.exec);
class SpawnError extends Error {
stdout;
stderr;
processError;
code;
constructor(stdout, stderr) {
super();
this.stdout = stdout;
this.stderr = stderr;
}
}
exports.SpawnError = SpawnError;
function spawn(options) {
let { cmd, args } = options;
if (!args) {
args = cmd.split(' ');
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
cmd = args.shift();
}
let stdout = '';
let stderr = '';
return new Promise((resolve, reject) => {
const child = (0, child_process_1.spawn)(cmd, args, options.options);
child.stdout.setEncoding('utf8');
child.stdout.on('data', data => {
stdout += data.toString();
if (options.on_stdout) {
options.on_stdout(data);
}
else {
process.stdout.write(data.toString());
}
});
child.stderr.setEncoding('utf8');
child.stderr.on('data', data => {
stderr += data.toString();
if (options.on_stderr) {
options.on_stderr(data);
}
else {
process.stderr.write(data.toString());
}
});
child.on('error', err => {
const error = new SpawnError(stdout, stderr);
error.processError = err;
if (options.on_error) {
options.on_error(error);
}
reject(error);
});
child.on('close', code => {
if (code) {
const error = new SpawnError(stdout, stderr);
error.code = code;
if (options.on_error) {
options.on_error(error);
}
reject(error);
}
else {
resolve(code);
}
});
});
}
/**
* spawn a child process and return the stdout and stderr in promise
*
* the console is not used to output the stdout and stderr
*/
async function spawnAndWait(options) {
let stdout = '';
let stderr = '';
let error = null;
const code = await spawn({
cmd: options.cmd,
args: options.args,
options: options.options,
on_stdout: chunk => (stdout += chunk),
on_stderr: chunk => (stderr += chunk),
on_error: err => (error = err),
});
if (error) {
throw error;
}
return { code, stdout, stderr };
}