in src/superspawn.js [70:151]
exports.spawn = function (cmd, args, opts) {
return new Promise((resolve, reject) => {
args = args || [];
opts = opts || {};
const spawnOpts = {};
if (iswin32) {
cmd = resolveWindowsExe(cmd);
// If we couldn't find the file, likely we'll end up failing,
// but for things like "del", cmd will do the trick.
if (path.extname(cmd) !== '.exe' && cmd.indexOf(' ') !== -1) {
// We need to use /s to ensure that spaces are parsed properly with cmd spawned content
args = [['/s', '/c', '"' + [cmd].concat(args).map(function (a) { if (/^[^"].* .*[^"]/.test(a)) return '"' + a + '"'; return a; }).join(' ') + '"'].join(' ')];
cmd = 'cmd';
spawnOpts.windowsVerbatimArguments = true;
} else if (!fs.existsSync(cmd)) {
// We need to use /s to ensure that spaces are parsed properly with cmd spawned content
args = ['/s', '/c', cmd].concat(args);
}
}
const pipeOutput = opts.stdio === 'inherit';
if (opts.stdio === 'ignore') {
spawnOpts.stdio = 'ignore';
} else if (pipeOutput) {
spawnOpts.stdio = [process.stdin, 'pipe', process.stderr];
} else {
spawnOpts.stdio = [process.stdin, 'pipe', 'pipe'];
}
if (opts.cwd) {
spawnOpts.cwd = opts.cwd;
}
if (opts.env) {
spawnOpts.env = extend(extend({}, process.env), opts.env);
}
if (opts.printCommand) {
console.log('Running command: ' + maybeQuote(cmd) + ' ' + args.map(maybeQuote).join(' '));
}
const child = child_process.spawn(cmd, args, spawnOpts);
let capturedOut = '';
let capturedErr = '';
if (child.stdout) {
child.stdout.setEncoding('utf8');
child.stdout.on('data', function (data) {
capturedOut += data;
if (pipeOutput) {
process.stdout.write(data);
}
});
}
if (child.stderr) {
child.stderr.setEncoding('utf8');
child.stderr.on('data', function (data) {
capturedErr += data;
});
}
child.on('close', whenDone);
child.on('error', whenDone);
function whenDone (arg) {
child.removeListener('close', whenDone);
child.removeListener('error', whenDone);
const code = typeof arg === 'number' ? arg : arg && arg.code;
if (code === 0) {
resolve(capturedOut.trim());
} else {
let errMsg = cmd + ': Command failed with exit code ' + code;
if (capturedErr) {
errMsg += ' Error output:\n' + capturedErr.trim();
}
const err = new Error(errMsg);
err.code = code;
err.output = capturedOut.trim();
reject(err);
}
}
});
};