Skip to content

Commit 8344d6e

Browse files
fix(command): accept ignoreArgv (#19)
1 parent 460a935 commit 8344d6e

File tree

5 files changed

+85
-7
lines changed

5 files changed

+85
-7
lines changed

src/command.ts

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { TypeFlagOptions } from 'type-flag';
12
import type {
23
CallbackFunction,
34
Flags,
@@ -37,6 +38,11 @@ export type CommandOptions<Parameters = string[]> = {
3738
Options to configure the help documentation. Pass in `false` to disable handling `--help, -h`.
3839
*/
3940
help?: false | HelpOptions;
41+
42+
/**
43+
* Which argv elements to ignore from parsing
44+
*/
45+
ignoreArgv?: TypeFlagOptions['ignore'];
4046
};
4147

4248
export function command<

tests/specs/command.ts

+46
Original file line numberDiff line numberDiff line change
@@ -269,5 +269,51 @@ export default testSuite(({ describe }) => {
269269
expect(callback.called).toBe(true);
270270
});
271271
});
272+
273+
describe('ignoreArgv', ({ test }) => {
274+
test('ignore after arguments', () => {
275+
const callback = spy();
276+
const argv = ['commandA', '--unknown', 'arg', '--help'];
277+
278+
let receivedArgument = false;
279+
const commandA = command({
280+
name: 'commandA',
281+
flags: {
282+
flagA: String,
283+
},
284+
ignoreArgv(type) {
285+
if (receivedArgument) {
286+
return true;
287+
}
288+
if (type === 'argument') {
289+
receivedArgument = true;
290+
return true;
291+
}
292+
},
293+
}, (parsed) => {
294+
expect<(string | boolean)[]>(parsed.unknownFlags.unknown).toStrictEqual([true]);
295+
callback();
296+
});
297+
298+
const parsed = cli(
299+
{
300+
commands: [
301+
commandA,
302+
],
303+
},
304+
undefined,
305+
argv,
306+
);
307+
308+
expect(parsed.command).toBe('commandA');
309+
310+
// Narrow type
311+
if (parsed.command === 'commandA') {
312+
expect<(string | boolean)[]>(parsed.unknownFlags.unknown).toStrictEqual([true]);
313+
}
314+
315+
expect(callback.called).toBe(true);
316+
});
317+
});
272318
});
273319
});

tests/specs/flags.ts

+33
Original file line numberDiff line numberDiff line change
@@ -120,5 +120,38 @@ export default testSuite(({ describe }) => {
120120
expect(mocked.processExit.calls).toStrictEqual([[0]]);
121121
});
122122
});
123+
124+
describe('ignoreArgv', ({ test }) => {
125+
test('ignore after arguments', () => {
126+
const argv = ['--unknown', 'arg', '--help'];
127+
128+
let receivedArgument = false;
129+
const parsed = cli(
130+
{
131+
ignoreArgv(type) {
132+
if (receivedArgument) {
133+
return true;
134+
}
135+
if (type === 'argument') {
136+
receivedArgument = true;
137+
return true;
138+
}
139+
},
140+
},
141+
(p) => {
142+
expect(argv).toStrictEqual(['arg', '--help']);
143+
expect(p.unknownFlags).toStrictEqual({
144+
unknown: [true],
145+
});
146+
},
147+
argv,
148+
);
149+
150+
expect(argv).toStrictEqual(['arg', '--help']);
151+
expect(parsed.unknownFlags).toStrictEqual({
152+
unknown: [true],
153+
});
154+
});
155+
});
123156
});
124157
});

tests/tsconfig.json

-4
This file was deleted.

tsconfig.json

-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,4 @@
55
"esModuleInterop": true,
66
"module": "Node16"
77
},
8-
"include": [
9-
"src",
10-
],
118
}

0 commit comments

Comments
 (0)