Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# node-dev

## v6.1.0 / 2020-10-15

- Manually wrangle node args so that we can handle `--` args coming before `-` args (Fixes #236)

## v6.0.0 / 2020-10-14

- Support ESModules in node v12.11.1+ using `get-source-loader.mjs` and `resolve-loader.mjs` for earlier versions (Fixes #212)
Expand Down
30 changes: 22 additions & 8 deletions lib/cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,22 @@ function resolvePath(unresolvedPath) {
return path.resolve(process.cwd(), unresolvedPath);
}

const doubleDash = s => /^--/.test(s);
const dash = s => /^-[^-]*$/.test(s);

function getFirstNonOptionArgIndex(args) {
for (let i = 2; i < args.length; i += 1) {
if (args[i][0] != '-') return i;
if (!doubleDash(args[i]) && !dash(args[i]) && !dash(args[i - 1] || '')) return i;
}

return args.length;
return args.length - 1;
}

module.exports = argv => {
const nodeArgs = [];
const unknownArgs = [];

const scriptIndex = getFirstNonOptionArgIndex(argv);

const script = argv[scriptIndex];
const scriptArgs = argv.slice(scriptIndex + 1);
const devArgs = argv.slice(2, scriptIndex);
Expand All @@ -29,15 +33,25 @@ module.exports = argv => {
boolean: ['clear', 'dedupe', 'fork', 'notify', 'poll', 'respawn', 'vm'],
string: ['graceful_ipc', 'ignore', 'timestamp'],
default: getConfig(script),
unknown: function (arg) {
const argKeys = Object.keys(minimist([arg]));
unknown: arg => {
const key = Object.keys(minimist([arg]))[1];

if (configKeys.some(k => argKeys.includes(k))) {
return true;
if (!configKeys.includes(key)) {
unknownArgs.push({ arg, key });
}
}
});

nodeArgs.push(arg);
const nodeArgs = unknownArgs.reduce((out, { arg, key }) => {
out.push(arg);
if (typeof opts[key] !== 'boolean' && !arg.includes('=')) {
out.push(opts[key]);
}
return out;
}, []);

unknownArgs.forEach(({ key }) => {
delete opts[key];
});

opts.ignore = [...Array.isArray(opts.ignore) ? opts.ignore : [opts.ignore]].map(resolvePath);
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "node-dev",
"version": "6.0.0",
"version": "6.1.0",
"description": "Restarts your app when files are modified",
"keywords": [
"restart",
Expand Down
30 changes: 30 additions & 0 deletions test/cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,33 @@ tap.test('cli overrides .node-dev.json from false to true', t => {
t.is(notify, true);
t.done();
});

tap.test('-r ts-node/register --inspect test/fixture/server.js', t => {
const argv = 'node bin/node-dev -r ts-node/register --inspect test/fixture/server.js'.split(' ');
const { nodeArgs } = cli(argv);
t.ok(nodeArgs.includes('--inspect'));
t.ok(nodeArgs.includes('-r'));
t.done();
});

tap.test('--inspect -r ts-node/register test/fixture/server.js', t => {
const argv = 'node bin/node-dev --inspect -r ts-node/register test/fixture/server.js'.split(' ');
const { nodeArgs } = cli(argv);
t.ok(nodeArgs.includes('--inspect'));
t.ok(nodeArgs.includes('-r'));
t.done();
});

tap.test('--expose_gc gc.js foo', t => {
const argv = 'node bin/node-dev --expose_gc test/fixture/gc.js foo'.split(' ');
const { nodeArgs } = cli(argv);
t.ok(nodeArgs.includes('--expose_gc'));
t.done();
});

tap.test('--require=coffeescript/register server.coffee', t => {
const argv = 'node bin/node-dev --require=coffeescript/register test/fixture/server.coffee'.split(' ');
const { nodeArgs } = cli(argv);
t.ok(nodeArgs.includes('--require=coffeescript/register'));
t.done();
});