@beenotung/tslib
Version:
utils library in Typescript
64 lines (63 loc) • 2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
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);
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();
}
return new Promise((resolve, reject) => {
const child = (0, child_process_1.spawn)(cmd, args, options.options);
child.stdout.setEncoding('utf8');
child.stdout.on('data', options.on_stdout || (data => process.stdout.write(data.toString())));
child.stderr.setEncoding('utf8');
child.stderr.on('data', options.on_stderr || (data => process.stderr.write(data.toString())));
child.on('error', err => {
if (options.on_error) {
options.on_error(err);
}
else {
console.error(err);
process.exit(1);
}
});
child.on('close', code => {
if (code) {
reject(code);
}
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 };
}