npm-run-script
Version:
emulate the `npm run-script` using stdio
93 lines (67 loc) • 2.77 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; // dependencies
var _semver = require('semver');
var _semver2 = _interopRequireDefault(_semver);
var _npmRunPath = require('npm-run-path');
var _npmRunPath2 = _interopRequireDefault(_npmRunPath);
var _shellQuote = require('shell-quote');
var _crossSpawn = require('cross-spawn');
var _crossSpawn2 = _interopRequireDefault(_crossSpawn);
var _child_process = require('child_process');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); }
// private
var isLatest = _semver2.default.gt(process.version, '5.6.0');
/**
* @module npmRunScript
* @param {string} command - an executable shell command
* @param {object} [options={}] - a child_process options
* @returns {child_process} child - the child_process instance
*/
exports.default = function (command) {
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var opts = _extends({
stdio: 'inherit',
env: _extends({}, process.env, {
PATH: (0, _npmRunPath2.default)()
}),
maxBuffer: 1024 * 1024 * 10 }, options);
var parsedCommand = (0, _shellQuote.parse)(command);
var notShellCommand = parsedCommand.reduce(function (can, op) {
return can && typeof op === 'string';
}, true);
if (parsedCommand[0] === 'exit') {
notShellCommand = false;
}
var child = void 0;
if (notShellCommand) {
var _parsedCommand = _toArray(parsedCommand);
var file = _parsedCommand[0];
var args = _parsedCommand.slice(1);
child = (0, _crossSpawn2.default)(file, args, opts);
} else if (isLatest) {
// child_process.spawn {shell} available at version gt 5.6
// fix: abigailjs/abigail#4
child = (0, _crossSpawn2.default)(command, _extends({}, opts, { shell: true }));
} else {
child = (0, _child_process.exec)(command, opts);
// TODO https://github.com/nodejs/node/issues/2333
if (opts.stdio === 'inherit') {
var flush = function flush() {
child.stdin.unpipe(process.stdin);
child.stdout.unpipe(process.stdout);
child.stderr.unpipe(process.stderr);
};
child.stdin.pipe(process.stdin);
child.stdout.pipe(process.stdout);
child.stderr.pipe(process.stderr);
child.once('error', flush);
child.once('exit', flush);
}
}
return child;
};
module.exports = exports['default'];