From 6a8e9acd7db3a2165b559621f2ff23a71481d6f6 Mon Sep 17 00:00:00 2001 From: ehmicky Date: Sun, 30 Jun 2019 06:12:04 -0700 Subject: [PATCH] Do not read streams more than once (#330) --- index.js | 5 ++++- package.json | 1 + test/test.js | 6 ++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index 3e3b125720..ef012681ff 100644 --- a/index.js +++ b/index.js @@ -4,6 +4,7 @@ const childProcess = require('child_process'); const crossSpawn = require('cross-spawn'); const stripFinalNewline = require('strip-final-newline'); const npmRunPath = require('npm-run-path'); +const onetime = require('onetime'); const makeError = require('./lib/error'); const normalizeStdio = require('./lib/stdio'); const {spawnedKill, spawnedCancel, setupTimeout, setExitHandler} = require('./lib/kill'); @@ -144,13 +145,15 @@ const execa = (file, args, options) => { }; }; + const handlePromiseOnce = onetime(handlePromise); + crossSpawn._enoent.hookChildProcess(spawned, parsed.parsed); handleInput(spawned, parsed.options.input); spawned.all = makeAllStream(spawned); - return mergePromise(spawned, handlePromise); + return mergePromise(spawned, handlePromiseOnce); }; module.exports = execa; diff --git a/package.json b/package.json index 49c3db1410..57e69814c0 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^3.0.0", + "onetime": "^5.1.0", "p-finally": "^2.0.0", "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" diff --git a/test/test.js b/test/test.js index 315419fdbb..4f0519a891 100644 --- a/test/test.js +++ b/test/test.js @@ -138,6 +138,12 @@ test('child_process.spawnSync() errors are propagated with a correct shape', t = t.true(failed); }); +test('do not try to consume streams twice', async t => { + const cp = execa('noop', ['foo']); + t.is((await cp).stdout, 'foo'); + t.is((await cp).stdout, 'foo'); +}); + test('use relative path with \'..\' chars', async t => { const pathViaParentDir = path.join('..', path.basename(path.dirname(__dirname)), 'test', 'fixtures', 'noop'); const {stdout} = await execa(pathViaParentDir, ['foo']);