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 ddec54f..bd5a03d 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 dce4638..8dc10b3 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 be77c29..1ef1408 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 083572d..623f2ca 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 0000000..e69de29 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 0000000..f249d17 --- /dev/null +++ b/test/fixtures/packages/main-and-start/package.json @@ -0,0 +1,6 @@ +{ + "main": "./index.js", + "scripts": { + "start": "node index.js" + } +}