UNPKG

npm-run-script

Version:

emulate the `npm run-script` using stdio

93 lines (67 loc) 2.77 kB
'use strict'; 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'];