Skip to content

Commit 9d3fdca

Browse files
agilgur5lukeed
andauthored
fix: do not mutate process.argv (#36)
* (fix): don't mutate process.argv with arr.splice - 1.7.1 introduced some arr.splice's into the code, which caused mutations in process.argv, affecting downstream code - set arr to a clone of process.argv instead so it can be freely mutated after - explicitly call the parameter processArgv so code is written more carefully when dealing with it - add a test to ensure process.argv is not mutated * chore: truncate * chore: add & improve tests Co-authored-by: Luke Edwards <[email protected]>
1 parent ff2ed46 commit 9d3fdca

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

lib/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ class Sade {
106106
}
107107

108108
parse(arr, opts={}) {
109+
arr = arr.slice(); // copy
109110
let offset=2, tmp, idx, isVoid, cmd;
110111
let alias = { h:'help', v:'version' };
111112
let argv = mri(arr.slice(offset), { alias });

test/index.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,70 @@ test('prog.action (multi optional)', t => {
212212
(c=true) && run(); // +4 tests
213213
});
214214

215+
test('prog.parse :: safe :: default', t => {
216+
let ctx = sade('foo').command('build', '', { default: true });
217+
218+
let argv1 = ['', '', 'build'];
219+
let foo = ctx.parse(argv1, { lazy: true });
220+
t.deepEqual(argv1, ['', '', 'build'], '~> argv unchanged');
221+
t.deepEqual(foo.args, [{ _: [] }], '~> args correct');
222+
223+
let argv2 = ['', ''];
224+
let bar = ctx.parse(argv2, { lazy: true });
225+
t.deepEqual(argv2, ['', ''], '~> argv unchanged');
226+
t.deepEqual(bar.args, [{ _: [] }], '~> args correct');
227+
228+
t.end();
229+
});
230+
231+
test('prog.parse :: safe :: alias', t => {
232+
let ctx = sade('foo').command('build').alias('b');
233+
234+
let argv1 = ['', '', 'build'];
235+
let foo = ctx.parse(argv1, { lazy: true });
236+
t.deepEqual(argv1, ['', '', 'build'], '~> argv unchanged');
237+
t.deepEqual(foo.args, [{ _: [] }], '~> args correct');
238+
239+
let argv2 = ['', '', 'b'];
240+
let bar = ctx.parse(argv2, { lazy: true });
241+
t.deepEqual(argv2, ['', '', 'b'], '~> argv unchanged');
242+
t.deepEqual(bar.args, [{ _: [] }], '~> args correct');
243+
244+
t.end();
245+
});
246+
247+
test('prog.parse :: safe :: default :: flags', t => {
248+
let ctx = sade('foo').command('build <dir>', '', { default: true });
249+
250+
let argv1 = ['', '', '-r', 'dotenv', 'build', 'public', '--fresh'];
251+
let foo = ctx.parse(argv1, { lazy: true });
252+
t.deepEqual(argv1, ['', '', '-r', 'dotenv', 'build', 'public', '--fresh'], '~> argv unchanged');
253+
t.deepEqual(foo.args, ['public', { _: [], r: 'dotenv', fresh: true }], '~> args correct');
254+
255+
let argv2 = ['', '', '-r', 'dotenv', 'public', '--fresh'];
256+
let bar = ctx.parse(argv2, { lazy: true });
257+
t.deepEqual(argv2, ['', '', '-r', 'dotenv', 'public', '--fresh'], '~> argv unchanged');
258+
t.deepEqual(bar.args, ['public', { _: [], r: 'dotenv', fresh: true }], '~> args correct');
259+
260+
t.end();
261+
});
262+
263+
test('prog.parse :: safe :: alias :: flags', t => {
264+
let ctx = sade('foo').command('build <dir>').alias('b');
265+
266+
let argv1 = ['', '', '-r', 'dotenv', 'build', 'public', '--fresh'];
267+
let foo = ctx.parse(argv1, { lazy: true });
268+
t.deepEqual(argv1, ['', '', '-r', 'dotenv', 'build', 'public', '--fresh'], '~> argv unchanged');
269+
t.deepEqual(foo.args, ['public', { _: [], r: 'dotenv', fresh: true }], '~> args correct');
270+
271+
let argv2 = ['', '', '-r', 'dotenv', 'b', 'public', '--fresh'];
272+
let bar = ctx.parse(argv2, { lazy: true });
273+
t.deepEqual(argv2, ['', '', '-r', 'dotenv', 'b', 'public', '--fresh'], '~> argv unchanged');
274+
t.deepEqual(bar.args, ['public', { _: [], r: 'dotenv', fresh: true }], '~> args correct');
275+
276+
t.end();
277+
});
278+
215279
test('prog.parse :: lazy', t => {
216280
t.plan(14);
217281

0 commit comments

Comments
 (0)