From bc66354d91e4191276995dd688e5151cf87dbc48 Mon Sep 17 00:00:00 2001 From: Remy Sharp Date: Sun, 4 Oct 2020 12:52:43 +0100 Subject: [PATCH] fix: package.main with -- arguments Fixes #1758 The combination of using a package.main (which sets the script position to index zero) and using the -- stop slurp meant that the arguments had the script appended to the end instead of prepended to the start. The net result meant that when the script was forked, it would drop the first user arg. See diff for details of the fix - a simple check against null. --- lib/config/load.js | 4 +++- lib/monitor/run.js | 2 ++ test/config/load.test.js | 23 +++++++++++++++++++ .../fixtures/packages/main-and-start/index.js | 0 .../packages/main-and-start/package.json | 6 +++++ 5 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/packages/main-and-start/index.js create mode 100644 test/fixtures/packages/main-and-start/package.json diff --git a/lib/config/load.js b/lib/config/load.js index ddec54fd..bd5a03d8 100644 --- a/lib/config/load.js +++ b/lib/config/load.js @@ -74,7 +74,9 @@ function load(settings, options, config, callback) { } // if the script is found as a result of not being on the command // line, then we move any of the pre double-dash args in execArgs - const n = options.scriptPosition || options.args.length; + const n = options.scriptPosition === null ? + options.args.length : options.scriptPosition; + options.execArgs = (options.execArgs || []) .concat(options.args.splice(0, n)); options.scriptPosition = null; diff --git a/lib/monitor/run.js b/lib/monitor/run.js index dce4638a..8dc10b31 100644 --- a/lib/monitor/run.js +++ b/lib/monitor/run.js @@ -97,6 +97,8 @@ function run(options) { utils.version.major > 4 // only fork if node version > 4 if (shouldFork) { + // this assumes the first argument is the script and slices it out, since + // we're forking var forkArgs = cmd.args.slice(1); var env = utils.merge(options.execOptions.env, process.env); stdio.push('ipc'); diff --git a/test/config/load.test.js b/test/config/load.test.js index 083572d1..623f2ca5 100644 --- a/test/config/load.test.js +++ b/test/config/load.test.js @@ -298,4 +298,27 @@ describe('config load', function () { done(); }) }); + + it('should support pkg.main and keep user args on args', done => { + process.chdir(path.resolve(pwd, 'test/fixtures/packages/main-and-start')); + const settings = { scriptPosition: 0, script: null, args: [ 'first', 'second' ] }; + const options = { ignore: [], watch: [], monitor: [] }; + const config = { + run: false, + system: { cwd: '/Users/remy/dev/nodemon/issues/1758' }, + required: false, + dirs: [], + timeout: 1000, + options: { ignore: [], watch: [], monitor: [] }, + lastStarted: 0, + loaded: [] + } + + load(settings, options, config, res => { + assert.deepEqual(res.execOptions.args, ['first', 'second']); + done(); + }) + }); + + }); diff --git a/test/fixtures/packages/main-and-start/index.js b/test/fixtures/packages/main-and-start/index.js new file mode 100644 index 00000000..e69de29b diff --git a/test/fixtures/packages/main-and-start/package.json b/test/fixtures/packages/main-and-start/package.json new file mode 100644 index 00000000..f249d171 --- /dev/null +++ b/test/fixtures/packages/main-and-start/package.json @@ -0,0 +1,6 @@ +{ + "main": "./index.js", + "scripts": { + "start": "node index.js" + } +}