From 2967726673496ae6cf35904cb4e83013c6e2ccd3 Mon Sep 17 00:00:00 2001 From: Remy Sharp Date: Sun, 4 Oct 2020 16:44:26 +0100 Subject: [PATCH] fix: package.main with -- arguments (#1773) * 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. * fix: protect against missing opts --- lib/config/load.js | 4 +++- lib/monitor/run.js | 2 ++ lib/monitor/watch.js | 2 +- test/config/load.test.js | 23 +++++++++++++++++++ .../fixtures/packages/main-and-start/index.js | 0 .../packages/main-and-start/package.json | 6 +++++ 6 files changed, 35 insertions(+), 2 deletions(-) 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/lib/monitor/watch.js b/lib/monitor/watch.js index be77c29a..1ef14086 100644 --- a/lib/monitor/watch.js +++ b/lib/monitor/watch.js @@ -177,7 +177,7 @@ function filterAndRestart(files) { // if there's no matches, then test to see if the changed file is the // running script, if so, let's allow a restart - if (config.options.execOptions.script) { + if (config.options.execOptions && config.options.execOptions.script) { const script = path.resolve(config.options.execOptions.script); if (matched.result.length === 0 && script) { const length = script.length; 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" + } +}