175 lines
16 KiB
JavaScript
175 lines
16 KiB
JavaScript
"use strict";
|
|
|
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.exec = exec;
|
|
exports.default = void 0;
|
|
|
|
require("source-map-support/register");
|
|
|
|
var _child_process = require("child_process");
|
|
|
|
var _shellQuote = require("shell-quote");
|
|
|
|
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
|
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
|
|
var _helpers = require("./helpers");
|
|
|
|
const MAX_BUFFER_SIZE = 100 * 1024 * 1024;
|
|
|
|
async function exec(cmd, args = [], opts = {}) {
|
|
const rep = (0, _shellQuote.quote)([cmd, ...args]);
|
|
opts = Object.assign({
|
|
timeout: null,
|
|
encoding: 'utf8',
|
|
killSignal: 'SIGTERM',
|
|
cwd: undefined,
|
|
env: process.env,
|
|
ignoreOutput: false,
|
|
stdio: 'inherit',
|
|
isBuffer: false,
|
|
shell: undefined,
|
|
logger: undefined,
|
|
maxStdoutBufferSize: MAX_BUFFER_SIZE,
|
|
maxStderrBufferSize: MAX_BUFFER_SIZE
|
|
}, opts);
|
|
return await new _bluebird.default((resolve, reject) => {
|
|
let proc = (0, _child_process.spawn)(cmd, args, {
|
|
cwd: opts.cwd,
|
|
env: opts.env,
|
|
shell: opts.shell
|
|
});
|
|
let stdoutArr = [],
|
|
stderrArr = [],
|
|
timer = null;
|
|
proc.on('error', err => {
|
|
if (err.errno === 'ENOENT') {
|
|
err = (0, _helpers.formatEnoent)(err, cmd, opts.cwd);
|
|
}
|
|
|
|
reject(err);
|
|
});
|
|
|
|
if (proc.stdin) {
|
|
proc.stdin.on('error', err => {
|
|
reject(new Error(`Standard input '${err.syscall}' error: ${err.stack}`));
|
|
});
|
|
}
|
|
|
|
const handleStream = (streamType, streamProps) => {
|
|
if (!proc[streamType]) {
|
|
return;
|
|
}
|
|
|
|
proc[streamType].on('error', err => {
|
|
reject(new Error(`${_lodash.default.capitalize(streamType)} '${err.syscall}' error: ${err.stack}`));
|
|
});
|
|
|
|
if (opts.ignoreOutput) {
|
|
proc[streamType].on('data', () => {});
|
|
return;
|
|
}
|
|
|
|
const {
|
|
chunks,
|
|
maxSize
|
|
} = streamProps;
|
|
let size = 0;
|
|
proc[streamType].on('data', chunk => {
|
|
chunks.push(chunk);
|
|
size += chunk.length;
|
|
|
|
while (chunks.length > 1 && size >= maxSize) {
|
|
size -= chunks[0].length;
|
|
chunks.shift();
|
|
}
|
|
|
|
if (opts.logger && _lodash.default.isFunction(opts.logger.debug)) {
|
|
opts.logger.debug(chunk.toString());
|
|
}
|
|
});
|
|
};
|
|
|
|
handleStream('stdout', {
|
|
maxSize: opts.maxStdoutBufferSize,
|
|
chunks: stdoutArr
|
|
});
|
|
handleStream('stderr', {
|
|
maxSize: opts.maxStderrBufferSize,
|
|
chunks: stderrArr
|
|
});
|
|
|
|
function getStdio(isBuffer) {
|
|
let stdout, stderr;
|
|
|
|
if (isBuffer) {
|
|
stdout = Buffer.concat(stdoutArr);
|
|
stderr = Buffer.concat(stderrArr);
|
|
} else {
|
|
stdout = Buffer.concat(stdoutArr).toString(opts.encoding);
|
|
stderr = Buffer.concat(stderrArr).toString(opts.encoding);
|
|
}
|
|
|
|
return {
|
|
stdout,
|
|
stderr
|
|
};
|
|
}
|
|
|
|
proc.on('close', code => {
|
|
if (timer) {
|
|
clearTimeout(timer);
|
|
}
|
|
|
|
let {
|
|
stdout,
|
|
stderr
|
|
} = getStdio(opts.isBuffer);
|
|
|
|
if (code === 0) {
|
|
resolve({
|
|
stdout,
|
|
stderr,
|
|
code
|
|
});
|
|
} else {
|
|
let err = new Error(`Command '${rep}' exited with code ${code}`);
|
|
err = Object.assign(err, {
|
|
stdout,
|
|
stderr,
|
|
code
|
|
});
|
|
reject(err);
|
|
}
|
|
});
|
|
|
|
if (opts.timeout) {
|
|
timer = setTimeout(() => {
|
|
let {
|
|
stdout,
|
|
stderr
|
|
} = getStdio(opts.isBuffer);
|
|
let err = new Error(`Command '${rep}' timed out after ${opts.timeout}ms`);
|
|
err = Object.assign(err, {
|
|
stdout,
|
|
stderr,
|
|
code: null
|
|
});
|
|
reject(err);
|
|
proc.kill(opts.killSignal);
|
|
}, opts.timeout);
|
|
}
|
|
});
|
|
}
|
|
|
|
var _default = exec;
|
|
exports.default = _default;require('source-map-support').install();
|
|
|
|
|
|
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9leGVjLmpzIl0sIm5hbWVzIjpbIk1BWF9CVUZGRVJfU0laRSIsImV4ZWMiLCJjbWQiLCJhcmdzIiwib3B0cyIsInJlcCIsIk9iamVjdCIsImFzc2lnbiIsInRpbWVvdXQiLCJlbmNvZGluZyIsImtpbGxTaWduYWwiLCJjd2QiLCJ1bmRlZmluZWQiLCJlbnYiLCJwcm9jZXNzIiwiaWdub3JlT3V0cHV0Iiwic3RkaW8iLCJpc0J1ZmZlciIsInNoZWxsIiwibG9nZ2VyIiwibWF4U3Rkb3V0QnVmZmVyU2l6ZSIsIm1heFN0ZGVyckJ1ZmZlclNpemUiLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsInByb2MiLCJzdGRvdXRBcnIiLCJzdGRlcnJBcnIiLCJ0aW1lciIsIm9uIiwiZXJyIiwiZXJybm8iLCJzdGRpbiIsIkVycm9yIiwic3lzY2FsbCIsInN0YWNrIiwiaGFuZGxlU3RyZWFtIiwic3RyZWFtVHlwZSIsInN0cmVhbVByb3BzIiwiXyIsImNhcGl0YWxpemUiLCJjaHVua3MiLCJtYXhTaXplIiwic2l6ZSIsImNodW5rIiwicHVzaCIsImxlbmd0aCIsInNoaWZ0IiwiaXNGdW5jdGlvbiIsImRlYnVnIiwidG9TdHJpbmciLCJnZXRTdGRpbyIsInN0ZG91dCIsInN0ZGVyciIsIkJ1ZmZlciIsImNvbmNhdCIsImNvZGUiLCJjbGVhclRpbWVvdXQiLCJzZXRUaW1lb3V0Iiwia2lsbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsZUFBZSxHQUFHLE1BQU0sSUFBTixHQUFhLElBQXJDOztBQUVBLGVBQWVDLElBQWYsQ0FBcUJDLEdBQXJCLEVBQTBCQyxJQUFJLEdBQUcsRUFBakMsRUFBcUNDLElBQUksR0FBRyxFQUE1QyxFQUFnRDtBQUU5QyxRQUFNQyxHQUFHLEdBQUcsdUJBQU0sQ0FBQ0gsR0FBRCxFQUFNLEdBQUdDLElBQVQsQ0FBTixDQUFaO0FBSUFDLEVBQUFBLElBQUksR0FBR0Us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QUFBQ04sVUFBQUEsTUFBRDtBQUFTQyxVQUFBQTtBQUFULFlBQW1CRixRQUFRLENBQUMvQyxJQUFJLENBQUNhLFFBQU4sQ0FBL0I7QUFDQSxZQUFJYSxHQUFHLEdBQUcsSUFBSUcsS0FBSixDQUFXLFlBQVc1QixHQUFJLHFCQUFvQkQsSUFBSSxDQUFDSSxPQUFRLElBQTNELENBQVY7QUFDQXNCLFFBQUFBLEdBQUcsR0FBR3hCLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjdUIsR0FBZCxFQUFtQjtBQUFDc0IsVUFBQUEsTUFBRDtBQUFTQyxVQUFBQSxNQUFUO0FBQWlCRyxVQUFBQSxJQUFJLEVBQUU7QUFBdkIsU0FBbkIsQ0FBTjtBQUNBaEMsUUFBQUEsTUFBTSxDQUFDTSxHQUFELENBQU47QUFHQUwsUUFBQUEsSUFBSSxDQUFDa0MsSUFBTCxDQUFVdkQsSUFBSSxDQUFDTSxVQUFmO0FBQ0QsT0FSaUIsRUFRZk4sSUFBSSxDQUFDSSxPQVJVLENBQWxCO0FBU0Q7QUFDRixHQXBHWSxDQUFiO0FBcUdEOztlQUdjUCxJIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tY2FsbGJhY2tzICovXG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBxdW90ZSB9IGZyb20gJ3NoZWxsLXF1b3RlJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBmb3JtYXRFbm9lbnQgfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5jb25zdCBNQVhfQlVGRkVSX1NJWkUgPSAxMDAgKiAxMDI0ICogMTAyNDtcblxuYXN5bmMgZnVuY3Rpb24gZXhlYyAoY21kLCBhcmdzID0gW10sIG9wdHMgPSB7fSkge1xuICAvLyBnZXQgYSBxdW90ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbW1hbmQgZm9yIGVycm9yIHN0cmluZ3NcbiAgY29uc3QgcmVwID0gcXVvdGUoW2NtZCwgLi4uYXJnc10pO1xuXG4gIC8vIGV4dGVuZCBkZWZhdWx0IG9wdGlvbnM7IHdlJ3JlIGJhc2ljYWxseSByZS1pbXBsZW1lbnRpbmcgZXhlYydzIG9wdGlvbnNcbiAgLy8gZm9yIHVzZSBoZXJlIHdpdGggc3Bhd24gdW5kZXIgdGhlIGhvb2RcbiAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHRpbWVvdXQ6IG51bGwsXG4gICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICBraWxsU2lnbmFsOiAnU0lHVEVSTScsXG4gICAgY3dkOiB1bmRlZmluZWQsXG4gICAgZW52OiBwcm9jZXNzLmVudixcbiAgICBpZ25vcmVPdXRwdXQ6IGZhbHNlLFxuICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgaXNCdWZmZXI6IGZhbHNlLFxuICAgIHNoZWxsOiB1bmRlZmluZWQsXG4gICAgbG9nZ2VyOiB1bmRlZmluZWQsXG4gICAgbWF4U3Rkb3V0QnVmZmVyU2l6ZTogTUFYX0JVRkZFUl9TSVpFLFxuICAgIG1heFN0ZGVyckJ1ZmZlclNpemU6IE1BWF9CVUZGRVJfU0laRSxcbiAgfSwgb3B0cyk7XG5cbiAgLy8gdGhpcyBpcyBhbiBhc3luYyBmdW5jdGlvbiwgc28gcmV0dXJuIGEgcHJvbWlzZVxuICByZXR1cm4gYXdhaXQgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIC8vIHNwYXduIHRoZSBjaGlsZCBwcm9jZXNzIHdpdGggb3B0aW9uczsgd2UgZG9uJ3QgY3VycmVudGx5IGV4cG9zZSBhbnkgb2ZcbiAgICAvLyB0aGUgb3RoZXIgJ3NwYXduJyBvcHRpb25zIHRocm91Z2ggdGhlIEFQSVxuICAgIGxldCBwcm9jID0gc3Bhd24oY21kLCBhcmdzLCB7Y3dkOiBvcHRzLmN3ZCwgZW52OiBvcHRzLmVudiwgc2hlbGw6IG9wdHMuc2hlbGx9KTtcbiAgICBsZXQgc3Rkb3V0QXJyID0gW10sIHN0ZGVyckFyciA9IFtdLCB0aW1lciA9IG51bGw7XG5cbiAgICAvLyBpZiB0aGUgcHJvY2VzcyBlcnJvcnMgb3V0LCByZWplY3QgdGhlIHByb21pc2VcbiAgICBwcm9jLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIuZXJybm8gPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIGVyciA9IGZvcm1hdEVub2VudChlcnIsIGNtZCwgb3B0cy5jd2QpO1xuICAgICAgfVxuICAgICAgcmVqZWN0KGVycik7XG4gICAgfSk7XG4gICAgaWYgKHByb2Muc3RkaW4pIHtcbiAgICAgIHByb2Muc3RkaW4ub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBTdGFuZGFyZCBpbnB1dCAnJHtlcnIuc3lzY2FsbH0nIGVycm9yOiAke2Vyci5zdGFja31gKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgaGFuZGxlU3RyZWFtID0gKHN0cmVhbVR5cGUsIHN0cmVhbVByb3BzKSA9PiB7XG4gICAgICBpZiAoIXByb2Nbc3RyZWFtVHlwZV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwcm9jW3N0cmVhbVR5cGVdLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgJHtfLmNhcGl0YWxpemUoc3RyZWFtVHlwZSl9ICcke2Vyci5zeXNjYWxsfScgZXJyb3I6ICR7ZXJyLnN0YWNrfWApKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0cy5pZ25vcmVPdXRwdXQpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy80MjM2XG4gICAgICAgIHByb2Nbc3RyZWFtVHlwZV0ub24oJ2RhdGEnLCAoKSA9PiB7fSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8ga2VlcCB0cmFjayBvZiB0aGUgc3RyZWFtIGlmIHdlIGRvbid0IHdhbnQgdG8gaWdub3JlIGl0XG4gICAgICBjb25zdCB7Y2h1bmtzLCBtYXhTaXplfSA9IHN0cmVhbVByb3BzO1xuICAgICAgbGV0IHNpemUgPSAwO1xuICAgICAgcHJvY1tzdHJlYW1UeXBlXS5vbignZGF0YScsIChjaHVuaykgPT4ge1xuICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgIHNpemUgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICB3aGlsZSAoY2h1bmtzLmxlbmd0aCA+IDEgJiYgc2l6ZSA+PSBtYXhTaXplKSB7XG4gICAgICAgICAgc2l6ZSAtPSBjaHVua3NbMF0ubGVuZ3RoO1xuICAgICAgICAgIGNodW5rcy5zaGlmdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLmxvZ2dlciAmJiBfLmlzRnVuY3Rpb24ob3B0cy5sb2dnZXIuZGVidWcpKSB7XG4gICAgICAgICAgb3B0cy5sb2dnZXIuZGVidWcoY2h1bmsudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgaGFuZGxlU3RyZWFtKCdzdGRvdXQnLCB7XG4gICAgICBtYXhTaXplOiBvcHRzLm1heFN0ZG91dEJ1ZmZlclNpemUsXG4gICAgICBjaHVua3M6IHN0ZG91dEFycixcbiAgICB9KTtcbiAgICBoYW5kbGVTdHJlYW0oJ3N0ZGVycicsIHtcbiAgICAgIG1heFNpemU6IG9wdHMubWF4U3RkZXJyQnVmZmVyU2l6ZSxcbiAgICAgIGNodW5rczogc3RkZXJyQXJyLFxuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gZ2V0U3RkaW8gKGlzQnVmZmVyKSB7XG4gICAgICBsZXQgc3Rkb3V0LCBzdGRlcnI7XG4gICAgICBpZiAoaXNCdWZmZXIpIHtcbiAgICAgICAgc3Rkb3V0ID0gQnVmZmVyLmNvbmNhdChzdGRvdXRBcnIpO1xuICAgICAgICBzdGRlcnIgPSBCdWZmZXIuY29uY2F0KHN0ZGVyckFycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGRvdXQgPSBCdWZmZXIuY29uY2F0KHN0ZG91dEFycikudG9TdHJpbmcob3B0cy5lbmNvZGluZyk7XG4gICAgICAgIHN0ZGVyciA9IEJ1ZmZlci5jb25jYXQoc3RkZXJyQXJyKS50b1N0cmluZyhvcHRzLmVuY29kaW5nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7c3Rkb3V0LCBzdGRlcnJ9O1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSBwcm9jZXNzIGVuZHMsIGVpdGhlciByZXNvbHZlIG9yIHJlamVjdCB0aGUgcHJvbWlzZSBiYXNlZCBvbiB0aGVcbiAgICAvLyBleGl0IGNvZGUgb2YgdGhlIHByb2Nlc3MuIGVpdGhlciB3YXksIGF0dGFjaCBzdGRvdXQsIHN0ZGVyciwgYW5kIGNvZGUuXG4gICAgLy8gQWxzbyBjbGVhbiB1cCB0aGUgdGltZXIgaWYgaXQgZXhpc3RzXG4gICAgcHJvYy5vbignY2xvc2UnLCAoY29kZSkgPT4ge1xuICAgICAgaWYgKHRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB9XG4gICAgICBsZXQge3N0ZG91dCwgc3RkZXJyfSA9IGdldFN0ZGlvKG9wdHMuaXNCdWZmZXIpO1xuICAgICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgICAgcmVzb2x2ZSh7c3Rkb3V0LCBzdGRlcnIsIGNvZGV9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBlcnIgPSBuZXcgRXJyb3IoYENvbW1hbmQgJyR7cmVwfScgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCk7XG4gICAgICAgIGVyciA9IE9iamVjdC5hc3NpZ24oZXJyLCB7c3Rkb3V0LCBzdGRlcnIsIGNvZGV9KTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBpZiB3ZSBzZXQgYSB0aW1lb3V0IG9uIHRoZSBjaGlsZCBwcm9jZXNzLCBjdXQgaW50byB0aGUgZXhlY3V0aW9uIGFuZFxuICAgIC8vIHJlamVjdCBpZiB0aGUgdGltZW91dCBpcyByZWFjaGVkLiBBdHRhY2ggdGhlIHN0ZG91dC9zdGRlcnIgd2UgY3VycmVudGx5XG4gICAgLy8gaGF2ZSBpbiBjYXNlIGl0J3MgaGVscGZ1bCBpbiBkZWJ1Z2dpbmdcbiAgICBpZiAob3B0cy50aW1lb3V0KSB7XG4gICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBsZXQge3N0ZG91dCwgc3RkZXJyfSA9IGdldFN0ZGlvKG9wdHMuaXNCdWZmZXIpO1xuICAgICAgICBsZXQgZXJyID0gbmV3IEVycm9yKGBDb21tYW5kICcke3JlcH0nIHRpbWVkIG91dCBhZnRlciAke29wdHMudGltZW91dH1tc2ApO1xuICAgICAgICBlcnIgPSBPYmplY3QuYXNzaWduKGVyciwge3N0ZG91dCwgc3RkZXJyLCBjb2RlOiBudWxsfSk7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAvLyByZWplY3QgYW5kIFRIRU4ga2lsbCB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMgd2l0aCB0aGUgaGFuZGxlcnNcbiAgICAgICAgLy8gYWJvdmVcbiAgICAgICAgcHJvYy5raWxsKG9wdHMua2lsbFNpZ25hbCk7XG4gICAgICB9LCBvcHRzLnRpbWVvdXQpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCB7IGV4ZWMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4ZWM7XG4iXSwiZmlsZSI6ImxpYi9leGVjLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
|