aboutsummaryrefslogtreecommitdiff
path: root/node_modules/execa
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2017-08-14 05:01:11 +0200
committerFlorian Dold <florian.dold@gmail.com>2017-08-14 05:02:09 +0200
commit363723fc84f7b8477592e0105aeb331ec9a017af (patch)
tree29f92724f34131bac64d6a318dd7e30612e631c7 /node_modules/execa
parent5634e77ad96bfe1818f6b6ee70b7379652e5487f (diff)
downloadwallet-core-363723fc84f7b8477592e0105aeb331ec9a017af.tar.xz
node_modules
Diffstat (limited to 'node_modules/execa')
-rw-r--r--node_modules/execa/index.js44
-rw-r--r--node_modules/execa/lib/errname.js4
-rw-r--r--node_modules/execa/lib/stdio.js41
-rw-r--r--node_modules/execa/license20
-rw-r--r--node_modules/execa/node_modules/cross-spawn/CHANGELOG.md6
-rw-r--r--node_modules/execa/node_modules/cross-spawn/LICENSE19
-rw-r--r--node_modules/execa/node_modules/cross-spawn/README.md85
-rw-r--r--node_modules/execa/node_modules/cross-spawn/index.js59
-rw-r--r--node_modules/execa/node_modules/cross-spawn/lib/enoent.js73
-rw-r--r--node_modules/execa/node_modules/cross-spawn/lib/parse.js113
-rw-r--r--node_modules/execa/node_modules/cross-spawn/lib/util/escapeArgument.js30
-rw-r--r--node_modules/execa/node_modules/cross-spawn/lib/util/escapeCommand.js12
-rw-r--r--node_modules/execa/node_modules/cross-spawn/lib/util/hasEmptyArgumentBug.js18
-rw-r--r--node_modules/execa/node_modules/cross-spawn/lib/util/readShebang.js37
-rw-r--r--node_modules/execa/node_modules/cross-spawn/lib/util/resolveCommand.js31
l---------node_modules/execa/node_modules/cross-spawn/node_modules/.bin/which1
-rw-r--r--node_modules/execa/node_modules/cross-spawn/package.json53
-rw-r--r--node_modules/execa/package.json15
-rw-r--r--node_modules/execa/readme.md149
19 files changed, 768 insertions, 42 deletions
diff --git a/node_modules/execa/index.js b/node_modules/execa/index.js
index 0219cfa73..74ba8ee2d 100644
--- a/node_modules/execa/index.js
+++ b/node_modules/execa/index.js
@@ -9,12 +9,17 @@ const _getStream = require('get-stream');
const pFinally = require('p-finally');
const onExit = require('signal-exit');
const errname = require('./lib/errname');
+const stdio = require('./lib/stdio');
const TEN_MEGABYTES = 1000 * 1000 * 10;
function handleArgs(cmd, args, opts) {
let parsed;
+ if (opts && opts.env && opts.extendEnv !== false) {
+ opts.env = Object.assign({}, process.env, opts.env);
+ }
+
if (opts && opts.__winShell === true) {
delete opts.__winShell;
parsed = {
@@ -32,19 +37,23 @@ function handleArgs(cmd, args, opts) {
maxBuffer: TEN_MEGABYTES,
stripEof: true,
preferLocal: true,
+ localDir: parsed.options.cwd || process.cwd(),
encoding: 'utf8',
reject: true,
cleanup: true
}, parsed.options);
+ opts.stdio = stdio(opts);
+
if (opts.preferLocal) {
- opts.env = npmRunPath.env(opts);
+ opts.env = npmRunPath.env(Object.assign({}, opts, {cwd: opts.localDir}));
}
return {
cmd: parsed.command,
args: parsed.args,
- opts
+ opts,
+ parsed
};
}
@@ -153,7 +162,7 @@ module.exports = (cmd, args, opts) => {
timeoutId = setTimeout(() => {
timeoutId = null;
timedOut = true;
- spawned.kill(parsed.killSignal);
+ spawned.kill(parsed.opts.killSignal);
}, parsed.opts.timeout);
}
@@ -167,6 +176,13 @@ module.exports = (cmd, args, opts) => {
cleanupTimeout();
resolve({err});
});
+
+ if (spawned.stdin) {
+ spawned.stdin.on('error', err => {
+ cleanupTimeout();
+ resolve({err});
+ });
+ }
});
function destroy() {
@@ -198,7 +214,21 @@ module.exports = (cmd, args, opts) => {
if (err || code !== 0 || signal !== null) {
if (!err) {
- err = new Error(`Command failed: ${joinedCmd}\n${stderr}${stdout}`);
+ let output = '';
+
+ if (Array.isArray(parsed.opts.stdio)) {
+ if (parsed.opts.stdio[2] !== 'inherit') {
+ output += output.length > 0 ? stderr : `\n${stderr}`;
+ }
+
+ if (parsed.opts.stdio[1] !== 'inherit') {
+ output += `\n${stdout}`;
+ }
+ } else if (parsed.opts.stdio !== 'inherit') {
+ output = `\n${stderr}${stdout}`;
+ }
+
+ err = new Error(`Command failed: ${joinedCmd}${output}`);
err.code = code < 0 ? errname(code) : code;
}
@@ -233,7 +263,7 @@ module.exports = (cmd, args, opts) => {
};
}), destroy);
- crossSpawn._enoent.hookChildProcess(spawned, parsed);
+ crossSpawn._enoent.hookChildProcess(spawned, parsed.parsed);
handleInput(spawned, parsed.opts);
@@ -264,6 +294,10 @@ module.exports.sync = (cmd, args, opts) => {
const result = childProcess.spawnSync(parsed.cmd, parsed.args, parsed.opts);
+ if (result.error || result.status !== 0) {
+ throw (result.error || new Error(result.stderr === '' ? result.stdout : result.stderr));
+ }
+
result.stdout = handleOutput(parsed.opts, result.stdout);
result.stderr = handleOutput(parsed.opts, result.stderr);
diff --git a/node_modules/execa/lib/errname.js b/node_modules/execa/lib/errname.js
index a99d7500c..328f3e35d 100644
--- a/node_modules/execa/lib/errname.js
+++ b/node_modules/execa/lib/errname.js
@@ -12,7 +12,7 @@ try {
uv = process.binding('uv');
if (typeof uv.errname !== 'function') {
- throw new Error('uv.errname is not a function');
+ throw new TypeError('uv.errname is not a function');
}
} catch (err) {
console.error('execa/lib/errname: unable to establish process.binding(\'uv\')', err);
@@ -33,5 +33,5 @@ function errname(uv, code) {
module.exports = code => errname(uv, code);
-// used for testing the fallback behavior
+// Used for testing the fallback behavior
module.exports.__test__ = errname;
diff --git a/node_modules/execa/lib/stdio.js b/node_modules/execa/lib/stdio.js
new file mode 100644
index 000000000..a82d46838
--- /dev/null
+++ b/node_modules/execa/lib/stdio.js
@@ -0,0 +1,41 @@
+'use strict';
+const alias = ['stdin', 'stdout', 'stderr'];
+
+const hasAlias = opts => alias.some(x => Boolean(opts[x]));
+
+module.exports = opts => {
+ if (!opts) {
+ return null;
+ }
+
+ if (opts.stdio && hasAlias(opts)) {
+ throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${alias.map(x => `\`${x}\``).join(', ')}`);
+ }
+
+ if (typeof opts.stdio === 'string') {
+ return opts.stdio;
+ }
+
+ const stdio = opts.stdio || [];
+
+ if (!Array.isArray(stdio)) {
+ throw new TypeError(`Expected \`stdio\` to be of type \`string\` or \`Array\`, got \`${typeof stdio}\``);
+ }
+
+ const result = [];
+ const len = Math.max(stdio.length, alias.length);
+
+ for (let i = 0; i < len; i++) {
+ let value = null;
+
+ if (stdio[i] !== undefined) {
+ value = stdio[i];
+ } else if (opts[alias[i]] !== undefined) {
+ value = opts[alias[i]];
+ }
+
+ result[i] = value;
+ }
+
+ return result;
+};
diff --git a/node_modules/execa/license b/node_modules/execa/license
index 654d0bfe9..e7af2f771 100644
--- a/node_modules/execa/license
+++ b/node_modules/execa/license
@@ -1,21 +1,9 @@
-The MIT License (MIT)
+MIT License
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/execa/node_modules/cross-spawn/CHANGELOG.md b/node_modules/execa/node_modules/cross-spawn/CHANGELOG.md
new file mode 100644
index 000000000..f1298a82f
--- /dev/null
+++ b/node_modules/execa/node_modules/cross-spawn/CHANGELOG.md
@@ -0,0 +1,6 @@
+## 5.0.0 - 2016-10-30
+
+- Add support for `options.shell`
+- Improve parsing of shebangs by using [`shebang-command`](https://github.com/kevva/shebang-command) module
+- Refactor some code to make it more clear
+- Update README caveats
diff --git a/node_modules/execa/node_modules/cross-spawn/LICENSE b/node_modules/execa/node_modules/cross-spawn/LICENSE
new file mode 100644
index 000000000..db5e914de
--- /dev/null
+++ b/node_modules/execa/node_modules/cross-spawn/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2014 IndigoUnited
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/execa/node_modules/cross-spawn/README.md b/node_modules/execa/node_modules/cross-spawn/README.md
new file mode 100644
index 000000000..dde730df1
--- /dev/null
+++ b/node_modules/execa/node_modules/cross-spawn/README.md
@@ -0,0 +1,85 @@
+# cross-spawn
+
+[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Build status][appveyor-image]][appveyor-url] [![Dependency status][david-dm-image]][david-dm-url] [![Dev Dependency status][david-dm-dev-image]][david-dm-dev-url]
+
+[npm-url]:https://npmjs.org/package/cross-spawn
+[downloads-image]:http://img.shields.io/npm/dm/cross-spawn.svg
+[npm-image]:http://img.shields.io/npm/v/cross-spawn.svg
+[travis-url]:https://travis-ci.org/IndigoUnited/node-cross-spawn
+[travis-image]:http://img.shields.io/travis/IndigoUnited/node-cross-spawn/master.svg
+[appveyor-url]:https://ci.appveyor.com/project/satazor/node-cross-spawn
+[appveyor-image]:https://img.shields.io/appveyor/ci/satazor/node-cross-spawn/master.svg
+[david-dm-url]:https://david-dm.org/IndigoUnited/node-cross-spawn
+[david-dm-image]:https://img.shields.io/david/IndigoUnited/node-cross-spawn.svg
+[david-dm-dev-url]:https://david-dm.org/IndigoUnited/node-cross-spawn#info=devDependencies
+[david-dm-dev-image]:https://img.shields.io/david/dev/IndigoUnited/node-cross-spawn.svg
+
+A cross platform solution to node's spawn and spawnSync.
+
+
+## Installation
+
+`$ npm install cross-spawn`
+
+If you are using `spawnSync` on node 0.10 or older, you will also need to install `spawn-sync`:
+
+`$ npm install spawn-sync`
+
+
+## Why
+
+Node has issues when using spawn on Windows:
+
+- It ignores [PATHEXT](https://github.com/joyent/node/issues/2318)
+- It does not support [shebangs](http://pt.wikipedia.org/wiki/Shebang)
+- No `options.shell` support on node < v6
+- It does not allow you to run `del` or `dir`
+
+All these issues are handled correctly by `cross-spawn`.
+There are some known modules, such as [win-spawn](https://github.com/ForbesLindesay/win-spawn), that try to solve this but they are either broken or provide faulty escaping of shell arguments.
+
+
+## Usage
+
+Exactly the same way as node's [`spawn`](https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options) or [`spawnSync`](https://nodejs.org/api/child_process.html#child_process_child_process_spawnsync_command_args_options), so it's a drop in replacement.
+
+
+```js
+var spawn = require('cross-spawn');
+
+// Spawn NPM asynchronously
+var child = spawn('npm', ['list', '-g', '-depth', '0'], { stdio: 'inherit' });
+
+// Spawn NPM synchronously
+var results = spawn.sync('npm', ['list', '-g', '-depth', '0'], { stdio: 'inherit' });
+```
+
+
+## Caveats
+
+#### `options.shell` as an alternative to `cross-spawn`
+
+Starting from node v6, `spawn` has a `shell` option that allows you run commands from within a shell. This new option solves most of the problems that `cross-spawn` attempts to solve, but:
+
+- It's not supported in node < v6
+- It has no support for shebangs on Windows
+- You must manually escape the command and arguments which is very error prone, specially when passing user input
+
+If you are using the `shell` option to spawn a command in a cross platform way, consider using `cross-spawn` instead. You have been warned.
+
+
+#### Shebangs
+
+While `cross-spawn` handles shebangs on Windows, its support is limited: e.g.: it doesn't handle arguments after the path, e.g.: `#!/bin/bash -e`.
+
+Remember to always test your code on Windows!
+
+
+## Tests
+
+`$ npm test`
+
+
+## License
+
+Released under the [MIT License](http://www.opensource.org/licenses/mit-license.php).
diff --git a/node_modules/execa/node_modules/cross-spawn/index.js b/node_modules/execa/node_modules/cross-spawn/index.js
new file mode 100644
index 000000000..7814a9692
--- /dev/null
+++ b/node_modules/execa/node_modules/cross-spawn/index.js
@@ -0,0 +1,59 @@
+'use strict';
+
+var cp = require('child_process');
+var parse = require('./lib/parse');
+var enoent = require('./lib/enoent');
+
+var cpSpawnSync = cp.spawnSync;
+
+function spawn(command, args, options) {
+ var parsed;
+ var spawned;
+
+ // Parse the arguments
+ parsed = parse(command, args, options);
+
+ // Spawn the child process
+ spawned = cp.spawn(parsed.command, parsed.args, parsed.options);
+
+ // Hook into child process "exit" event to emit an error if the command
+ // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16
+ enoent.hookChildProcess(spawned, parsed);
+
+ return spawned;
+}
+
+function spawnSync(command, args, options) {
+ var parsed;
+ var result;
+
+ if (!cpSpawnSync) {
+ try {
+ cpSpawnSync = require('spawn-sync'); // eslint-disable-line global-require
+ } catch (ex) {
+ throw new Error(
+ 'In order to use spawnSync on node 0.10 or older, you must ' +
+ 'install spawn-sync:\n\n' +
+ ' npm install spawn-sync --save'
+ );
+ }
+ }
+
+ // Parse the arguments
+ parsed = parse(command, args, options);
+
+ // Spawn the child process
+ result = cpSpawnSync(parsed.command, parsed.args, parsed.options);
+
+ // Analyze if the command does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16
+ result.error = result.error || enoent.verifyENOENTSync(result.status, parsed);
+
+ return result;
+}
+
+module.exports = spawn;
+module.exports.spawn = spawn;
+module.exports.sync = spawnSync;
+
+module.exports._parse = parse;
+module.exports._enoent = enoent;
diff --git a/node_modules/execa/node_modules/cross-spawn/lib/enoent.js b/node_modules/execa/node_modules/cross-spawn/lib/enoent.js
new file mode 100644
index 000000000..d0a193aec
--- /dev/null
+++ b/node_modules/execa/node_modules/cross-spawn/lib/enoent.js
@@ -0,0 +1,73 @@
+'use strict';
+
+var isWin = process.platform === 'win32';
+var resolveCommand = require('./util/resolveCommand');
+
+var isNode10 = process.version.indexOf('v0.10.') === 0;
+
+function notFoundError(command, syscall) {
+ var err;
+
+ err = new Error(syscall + ' ' + command + ' ENOENT');
+ err.code = err.errno = 'ENOENT';
+ err.syscall = syscall + ' ' + command;
+
+ return err;
+}
+
+function hookChildProcess(cp, parsed) {
+ var originalEmit;
+
+ if (!isWin) {
+ return;
+ }
+
+ originalEmit = cp.emit;
+ cp.emit = function (name, arg1) {
+ var err;
+
+ // If emitting "exit" event and exit code is 1, we need to check if
+ // the command exists and emit an "error" instead
+ // See: https://github.com/IndigoUnited/node-cross-spawn/issues/16
+ if (name === 'exit') {
+ err = verifyENOENT(arg1, parsed, 'spawn');
+
+ if (err) {
+ return originalEmit.call(cp, 'error', err);
+ }
+ }
+
+ return originalEmit.apply(cp, arguments);
+ };
+}
+
+function verifyENOENT(status, parsed) {
+ if (isWin && status === 1 && !parsed.file) {
+ return notFoundError(parsed.original, 'spawn');
+ }
+
+ return null;
+}
+
+function verifyENOENTSync(status, parsed) {
+ if (isWin && status === 1 && !parsed.file) {
+ return notFoundError(parsed.original, 'spawnSync');
+ }
+
+ // If we are in node 10, then we are using spawn-sync; if it exited
+ // with -1 it probably means that the command does not exist
+ if (isNode10 && status === -1) {
+ parsed.file = isWin ? parsed.file : resolveCommand(parsed.original);
+
+ if (!parsed.file) {
+ return notFoundError(parsed.original, 'spawnSync');
+ }
+ }
+
+ return null;
+}
+
+module.exports.hookChildProcess = hookChildProcess;
+module.exports.verifyENOENT = verifyENOENT;
+module.exports.verifyENOENTSync = verifyENOENTSync;
+module.exports.notFoundError = notFoundError;
diff --git a/node_modules/execa/node_modules/cross-spawn/lib/parse.js b/node_modules/execa/node_modules/cross-spawn/lib/parse.js
new file mode 100644
index 000000000..10a013625
--- /dev/null
+++ b/node_modules/execa/node_modules/cross-spawn/lib/parse.js
@@ -0,0 +1,113 @@
+'use strict';
+
+var resolveCommand = require('./util/resolveCommand');
+var hasEmptyArgumentBug = require('./util/hasEmptyArgumentBug');
+var escapeArgument = require('./util/escapeArgument');
+var escapeCommand = require('./util/escapeCommand');
+var readShebang = require('./util/readShebang');
+
+var isWin = process.platform === 'win32';
+var skipShellRegExp = /\.(?:com|exe)$/i;
+
+// Supported in Node >= 6 and >= 4.8
+var supportsShellOption = parseInt(process.version.substr(1).split('.')[0], 10) >= 6 ||
+ parseInt(process.version.substr(1).split('.')[0], 10) === 4 && parseInt(process.version.substr(1).split('.')[1], 10) >= 8;
+
+function parseNonShell(parsed) {
+ var shebang;
+ var needsShell;
+ var applyQuotes;
+
+ if (!isWin) {
+ return parsed;
+ }
+
+ // Detect & add support for shebangs
+ parsed.file = resolveCommand(parsed.command);
+ parsed.file = parsed.file || resolveCommand(parsed.command, true);
+ shebang = parsed.file && readShebang(parsed.file);
+
+ if (shebang) {
+ parsed.args.unshift(parsed.file);
+ parsed.command = shebang;
+ needsShell = hasEmptyArgumentBug || !skipShellRegExp.test(resolveCommand(shebang) || resolveCommand(shebang, true));
+ } else {
+ needsShell = hasEmptyArgumentBug || !skipShellRegExp.test(parsed.file);
+ }
+
+ // If a shell is required, use cmd.exe and take care of escaping everything correctly
+ if (needsShell) {
+ // Escape command & arguments
+ applyQuotes = (parsed.command !== 'echo'); // Do not quote arguments for the special "echo" command
+ parsed.command = escapeCommand(parsed.command);
+ parsed.args = parsed.args.map(function (arg) {
+ return escapeArgument(arg, applyQuotes);
+ });
+
+ // Make use of cmd.exe
+ parsed.args = ['/d', '/s', '/c', '"' + parsed.command + (parsed.args.length ? ' ' + parsed.args.join(' ') : '') + '"'];
+ parsed.command = process.env.comspec || 'cmd.exe';
+ parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped
+ }
+
+ return parsed;
+}
+
+function parseShell(parsed) {
+ var shellCommand;
+
+ // If node supports the shell option, there's no need to mimic its behavior
+ if (supportsShellOption) {
+ return parsed;
+ }
+
+ // Mimic node shell option, see: https://github.com/nodejs/node/blob/b9f6a2dc059a1062776133f3d4fd848c4da7d150/lib/child_process.js#L335
+ shellCommand = [parsed.command].concat(parsed.args).join(' ');
+
+ if (isWin) {
+ parsed.command = typeof parsed.options.shell === 'string' ? parsed.options.shell : process.env.comspec || 'cmd.exe';
+ parsed.args = ['/d', '/s', '/c', '"' + shellCommand + '"'];
+ parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped
+ } else {
+ if (typeof parsed.options.shell === 'string') {
+ parsed.command = parsed.options.shell;
+ } else if (process.platform === 'android') {
+ parsed.command = '/system/bin/sh';
+ } else {
+ parsed.command = '/bin/sh';
+ }
+
+ parsed.args = ['-c', shellCommand];
+ }
+
+ return parsed;
+}
+
+// ------------------------------------------------
+
+function parse(command, args, options) {
+ var parsed;
+
+ // Normalize arguments, similar to nodejs
+ if (args && !Array.isArray(args)) {
+ options = args;
+ args = null;
+ }
+
+ args = args ? args.slice(0) : []; // Clone array to avoid changing the original
+ options = options || {};
+
+ // Build our parsed object
+ parsed = {
+ command: command,
+ args: args,
+ options: options,
+ file: undefined,
+ original: command,
+ };
+
+ // Delegate further parsing to shell or non-shell
+ return options.shell ? parseShell(parsed) : parseNonShell(parsed);
+}
+
+module.exports = parse;
diff --git a/node_modules/execa/node_modules/cross-spawn/lib/util/escapeArgument.js b/node_modules/execa/node_modules/cross-spawn/lib/util/escapeArgument.js
new file mode 100644
index 000000000..367263f66
--- /dev/null
+++ b/node_modules/execa/node_modules/cross-spawn/lib/util/escapeArgument.js
@@ -0,0 +1,30 @@
+'use strict';
+
+function escapeArgument(arg, quote) {
+ // Convert to string
+ arg = '' + arg;
+
+ // If we are not going to quote the argument,
+ // escape shell metacharacters, including double and single quotes:
+ if (!quote) {
+ arg = arg.replace(/([()%!^<>&|;,"'\s])/g, '^$1');
+ } else {
+ // Sequence of backslashes followed by a double quote:
+ // double up all the backslashes and escape the double quote
+ arg = arg.replace(/(\\*)"/g, '$1$1\\"');
+
+ // Sequence of backslashes followed by the end of the string
+ // (which will become a double quote later):
+ // double up all the backslashes
+ arg = arg.replace(/(\\*)$/, '$1$1');
+
+ // All other backslashes occur literally
+
+ // Quote the whole thing:
+ arg = '"' + arg + '"';
+ }
+
+ return arg;
+}
+
+module.exports = escapeArgument;
diff --git a/node_modules/execa/node_modules/cross-spawn/lib/util/escapeCommand.js b/node_modules/execa/node_modules/cross-spawn/lib/util/escapeCommand.js
new file mode 100644
index 000000000..d9c25b265
--- /dev/null
+++ b/node_modules/execa/node_modules/cross-spawn/lib/util/escapeCommand.js
@@ -0,0 +1,12 @@
+'use strict';
+
+var escapeArgument = require('./escapeArgument');
+
+function escapeCommand(command) {
+ // Do not escape if this command is not dangerous..
+ // We do this so that commands like "echo" or "ifconfig" work
+ // Quoting them, will make them unaccessible
+ return /^[a-z0-9_-]+$/i.test(command) ? command : escapeArgument(command, true);
+}
+
+module.exports = escapeCommand;
diff --git a/node_modules/execa/node_modules/cross-spawn/lib/util/hasEmptyArgumentBug.js b/node_modules/execa/node_modules/cross-spawn/lib/util/hasEmptyArgumentBug.js
new file mode 100644
index 000000000..9f2eba635
--- /dev/null
+++ b/node_modules/execa/node_modules/cross-spawn/lib/util/hasEmptyArgumentBug.js
@@ -0,0 +1,18 @@
+'use strict';
+
+// See: https://github.com/IndigoUnited/node-cross-spawn/pull/34#issuecomment-221623455
+function hasEmptyArgumentBug() {
+ var nodeVer;
+
+ if (process.platform !== 'win32') {
+ return false;
+ }
+
+ nodeVer = process.version.substr(1).split('.').map(function (num) {
+ return parseInt(num, 10);
+ });
+
+ return (nodeVer[0] === 0 && nodeVer[1] < 12);
+}
+
+module.exports = hasEmptyArgumentBug();
diff --git a/node_modules/execa/node_modules/cross-spawn/lib/util/readShebang.js b/node_modules/execa/node_modules/cross-spawn/lib/util/readShebang.js
new file mode 100644
index 000000000..2cf3541c9
--- /dev/null
+++ b/node_modules/execa/node_modules/cross-spawn/lib/util/readShebang.js
@@ -0,0 +1,37 @@
+'use strict';
+
+var fs = require('fs');
+var LRU = require('lru-cache');
+var shebangCommand = require('shebang-command');
+
+var shebangCache = new LRU({ max: 50, maxAge: 30 * 1000 }); // Cache just for 30sec
+
+function readShebang(command) {
+ var buffer;
+ var fd;
+ var shebang;
+
+ // Check if it is in the cache first
+ if (shebangCache.has(command)) {
+ return shebangCache.get(command);
+ }
+
+ // Read the first 150 bytes from the file
+ buffer = new Buffer(150);
+
+ try {
+ fd = fs.openSync(command, 'r');
+ fs.readSync(fd, buffer, 0, 150, 0);
+ fs.closeSync(fd);
+ } catch (e) { /* empty */ }
+
+ // Attempt to extract shebang (null is returned if not a shebang)
+ shebang = shebangCommand(buffer.toString());
+
+ // Store the shebang in the cache
+ shebangCache.set(command, shebang);
+
+ return shebang;
+}
+
+module.exports = readShebang;
diff --git a/node_modules/execa/node_modules/cross-spawn/lib/util/resolveCommand.js b/node_modules/execa/node_modules/cross-spawn/lib/util/resolveCommand.js
new file mode 100644
index 000000000..b7a949097
--- /dev/null
+++ b/node_modules/execa/node_modules/cross-spawn/lib/util/resolveCommand.js
@@ -0,0 +1,31 @@
+'use strict';
+
+var path = require('path');
+var which = require('which');
+var LRU = require('lru-cache');
+
+var commandCache = new LRU({ max: 50, maxAge: 30 * 1000 }); // Cache just for 30sec
+
+function resolveCommand(command, noExtension) {
+ var resolved;
+
+ noExtension = !!noExtension;
+ resolved = commandCache.get(command + '!' + noExtension);
+
+ // Check if its resolved in the cache
+ if (commandCache.has(command)) {
+ return commandCache.get(command);
+ }
+
+ try {
+ resolved = !noExtension ?
+ which.sync(command) :
+ which.sync(command, { pathExt: path.delimiter + (process.env.PATHEXT || '') });
+ } catch (e) { /* empty */ }
+
+ commandCache.set(command + '!' + noExtension, resolved);
+
+ return resolved;
+}
+
+module.exports = resolveCommand;
diff --git a/node_modules/execa/node_modules/cross-spawn/node_modules/.bin/which b/node_modules/execa/node_modules/cross-spawn/node_modules/.bin/which
new file mode 120000
index 000000000..8bc48ab0f
--- /dev/null
+++ b/node_modules/execa/node_modules/cross-spawn/node_modules/.bin/which
@@ -0,0 +1 @@
+../../../../../which/bin/which \ No newline at end of file
diff --git a/node_modules/execa/node_modules/cross-spawn/package.json b/node_modules/execa/node_modules/cross-spawn/package.json
new file mode 100644
index 000000000..7c10c9720
--- /dev/null
+++ b/node_modules/execa/node_modules/cross-spawn/package.json
@@ -0,0 +1,53 @@
+{
+ "name": "cross-spawn",
+ "version": "5.1.0",
+ "description": "Cross platform child_process#spawn and child_process#spawnSync",
+ "main": "index.js",
+ "scripts": {
+ "test": "node test/prepare && mocha --bail test/test",
+ "lint": "eslint '{*.js,lib/**/*.js,test/**/*.js}'"
+ },
+ "bugs": {
+ "url": "https://github.com/IndigoUnited/node-cross-spawn/issues/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/IndigoUnited/node-cross-spawn.git"
+ },
+ "files": [
+ "index.js",
+ "lib"
+ ],
+ "keywords": [
+ "spawn",
+ "spawnSync",
+ "windows",
+ "cross",
+ "platform",
+ "path",
+ "ext",
+ "path-ext",
+ "path_ext",
+ "shebang",
+ "hashbang",
+ "cmd",
+ "execute"
+ ],
+ "author": "IndigoUnited <hello@indigounited.com> (http://indigounited.com)",
+ "license": "MIT",
+ "dependencies": {
+ "lru-cache": "^4.0.1",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ },
+ "devDependencies": {
+ "@satazor/eslint-config": "^3.0.0",
+ "eslint": "^3.0.0",
+ "expect.js": "^0.3.0",
+ "glob": "^7.0.0",
+ "mkdirp": "^0.5.1",
+ "mocha": "^3.0.2",
+ "once": "^1.4.0",
+ "rimraf": "^2.5.0"
+ }
+}
diff --git a/node_modules/execa/package.json b/node_modules/execa/package.json
index e53f99235..41d934ddd 100644
--- a/node_modules/execa/package.json
+++ b/node_modules/execa/package.json
@@ -1,6 +1,6 @@
{
"name": "execa",
- "version": "0.5.1",
+ "version": "0.7.0",
"description": "A better `child_process`",
"license": "MIT",
"repository": "sindresorhus/execa",
@@ -44,8 +44,8 @@
"local"
],
"dependencies": {
- "cross-spawn": "^4.0.0",
- "get-stream": "^2.2.0",
+ "cross-spawn": "^5.0.1",
+ "get-stream": "^3.0.0",
"is-stream": "^1.1.0",
"npm-run-path": "^2.0.0",
"p-finally": "^1.0.0",
@@ -56,9 +56,10 @@
"ava": "*",
"cat-names": "^1.0.2",
"coveralls": "^2.11.9",
- "delay": "^1.3.1",
+ "delay": "^2.0.0",
"is-running": "^2.0.0",
- "nyc": "^8.3.0",
+ "nyc": "^11.0.2",
+ "tempfile": "^2.0.0",
"xo": "*"
},
"nyc": {
@@ -67,13 +68,9 @@
"lcov"
],
"exclude": [
- "node_modules",
"**/fixtures/**",
"**/test.js",
"**/test/**"
]
- },
- "xo": {
- "esnext": true
}
}
diff --git a/node_modules/execa/readme.md b/node_modules/execa/readme.md
index 16189acb2..18c808aa6 100644
--- a/node_modules/execa/readme.md
+++ b/node_modules/execa/readme.md
@@ -64,8 +64,6 @@ execa.shell('exit 3').catch(error => {
Execute a file.
-Same options as [`child_process.execFile`](https://nodejs.org/api/child_process.html#child_process_child_process_execfile_file_args_options_callback).
-
Think of this as a mix of `child_process.execFile` and `child_process.spawn`.
Returns a [`child_process` instance](https://nodejs.org/api/child_process.html#child_process_class_childprocess), which is enhanced to also be a `Promise` for a result `Object` with `stdout` and `stderr` properties.
@@ -82,8 +80,6 @@ Same as `execa()`, but returns only `stderr`.
Execute a command through the system shell. Prefer `execa()` whenever possible, as it's both faster and safer.
-Same options as [`child_process.exec`](https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback).
-
Returns a [`child_process` instance](https://nodejs.org/api/child_process.html#child_process_class_childprocess).
The `child_process` instance is enhanced to also be promise for a result object with `stdout` and `stderr` properties.
@@ -92,21 +88,78 @@ The `child_process` instance is enhanced to also be promise for a result object
Execute a file synchronously.
-Same options as [`child_process.execFileSync`](https://nodejs.org/api/child_process.html#child_process_child_process_execfilesync_file_args_options), except the default encoding is `utf8` instead of `buffer`.
-
Returns the same result object as [`child_process.spawnSync`](https://nodejs.org/api/child_process.html#child_process_child_process_spawnsync_command_args_options).
+This method throws an `Error` if the command fails.
+
### execa.shellSync(file, [options])
Execute a command synchronously through the system shell.
-Same options as [`child_process.execSync`](https://nodejs.org/api/child_process.html#child_process_child_process_execsync_command_options), except the default encoding is `utf8` instead of `buffer`.
-
Returns the same result object as [`child_process.spawnSync`](https://nodejs.org/api/child_process.html#child_process_child_process_spawnsync_command_args_options).
### options
-Additional options:
+Type: `Object`
+
+#### cwd
+
+Type: `string`<br>
+Default: `process.cwd()`
+
+Current working directory of the child process.
+
+#### env
+
+Type: `Object`<br>
+Default: `process.env`
+
+Environment key-value pairs. Extends automatically from `process.env`. Set `extendEnv` to `false` if you don't want this.
+
+#### extendEnv
+
+Type: `boolean`<br>
+Default: `true`
+
+Set to `false` if you don't want to extend the environment variables when providing the `env` property.
+
+#### argv0
+
+Type: `string`
+
+Explicitly set the value of `argv[0]` sent to the child process. This will be set to `command` or `file` if not specified.
+
+#### stdio
+
+Type: `Array` `string`<br>
+Default: `pipe`
+
+Child's [stdio](https://nodejs.org/api/child_process.html#child_process_options_stdio) configuration.
+
+#### detached
+
+Type: `boolean`
+
+Prepare child to run independently of its parent process. Specific behavior [depends on the platform](https://nodejs.org/api/child_process.html#child_process_options_detached).
+
+#### uid
+
+Type: `number`
+
+Sets the user identity of the process.
+
+#### gid
+
+Type: `number`
+
+Sets the group identity of the process.
+
+#### shell
+
+Type: `boolean` `string`<br>
+Default: `false`
+
+If `true`, runs `command` inside of a shell. Uses `/bin/sh` on UNIX and `cmd.exe` on Windows. A different shell can be specified as a string. The shell should understand the `-c` switch on UNIX or `/d /s /c` on Windows.
#### stripEof
@@ -123,9 +176,16 @@ Default: `true`
Prefer locally installed binaries when looking for a binary to execute.<br>
If you `$ npm install foo`, you can then `execa('foo')`.
+#### localDir
+
+Type: `string`<br>
+Default: `process.cwd()`
+
+Preferred path to find locally installed binaries in (use with `preferLocal`).
+
#### input
-Type: `string` `Buffer` `ReadableStream`
+Type: `string` `Buffer` `stream.Readable`
Write some input to the `stdin` of your binary.<br>
Streams are not allowed when using the synchronous methods.
@@ -144,6 +204,75 @@ Default: `true`
Keep track of the spawned process and `kill` it when the parent process exits.
+#### encoding
+
+Type: `string`<br>
+Default: `utf8`
+
+Specify the character encoding used to decode the `stdout` and `stderr` output.
+
+#### timeout
+
+Type: `number`<br>
+Default: `0`
+
+If timeout is greater than `0`, the parent will send the signal identified by the `killSignal` property (the default is `SIGTERM`) if the child runs longer than timeout milliseconds.
+
+#### maxBuffer
+
+Type: `number`<br>
+Default: `10000000` (10MB)
+
+Largest amount of data in bytes allowed on `stdout` or `stderr`.
+
+#### killSignal
+
+Type: `string` `number`<br>
+Default: `SIGTERM`
+
+Signal value to be used when the spawned process will be killed.
+
+#### stdin
+
+Type: `string` `number` `Stream` `undefined` `null`<br>
+Default: `pipe`
+
+Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio).
+
+#### stdout
+
+Type: `string` `number` `Stream` `undefined` `null`<br>
+Default: `pipe`
+
+Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio).
+
+#### stderr
+
+Type: `string` `number` `Stream` `undefined` `null`<br>
+Default: `pipe`
+
+Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio).
+
+
+## Tips
+
+### Save and pipe output from a child process
+
+Let's say you want to show the output of a child process in real-time while also saving it to a variable.
+
+```js
+const execa = require('execa');
+const getStream = require('get-stream');
+
+const stream = execa('echo', ['foo']).stdout;
+
+stream.pipe(process.stdout);
+
+getStream(stream).then(value => {
+ console.log('child output:', value);
+});
+```
+
## License