From 6f51e4a10912f6ac65d1f1335dd3e16f454b5e09 Mon Sep 17 00:00:00 2001 From: John Gee Date: Mon, 12 Jul 2021 12:05:43 +1200 Subject: [PATCH] Feature/argument arg explicit (#1567) * Add new methods * Add chain test * Add tests for Argument.required * Add typings for argRequired and argOptional --- lib/argument.js | 16 ++++++++++++++++ tests/argument.chain.test.js | 12 ++++++++++++ tests/argument.required.test.js | 34 +++++++++++++++++++++++++++++++++ typings/index.d.ts | 9 +++++++++ typings/index.test-d.ts | 6 ++++++ 5 files changed, 77 insertions(+) create mode 100644 tests/argument.required.test.js diff --git a/lib/argument.js b/lib/argument.js index ac37ce476..41548b690 100644 --- a/lib/argument.js +++ b/lib/argument.js @@ -109,6 +109,22 @@ class Argument { }; return this; }; + + /** + * Make option-argument required. + */ + argRequired() { + this.required = true; + return this; + } + + /** + * Make option-argument optional. + */ + argOptional() { + this.required = false; + return this; + } } /** diff --git a/tests/argument.chain.test.js b/tests/argument.chain.test.js index 55f855772..dbc7947c2 100644 --- a/tests/argument.chain.test.js +++ b/tests/argument.chain.test.js @@ -18,4 +18,16 @@ describe('Argument methods that should return this for chaining', () => { const result = argument.choices(['a']); expect(result).toBe(argument); }); + + test('when call .argRequired() then returns this', () => { + const argument = new Argument(''); + const result = argument.argRequired(); + expect(result).toBe(argument); + }); + + test('when call .argOptional() then returns this', () => { + const argument = new Argument(''); + const result = argument.argOptional(); + expect(result).toBe(argument); + }); }); diff --git a/tests/argument.required.test.js b/tests/argument.required.test.js new file mode 100644 index 000000000..40c47c54d --- /dev/null +++ b/tests/argument.required.test.js @@ -0,0 +1,34 @@ +const commander = require('../'); + +// Low-level tests of setting Argument.required. +// Higher level tests of optional/required arguments elsewhere. + +test('when name with surrounding <> then argument required', () => { + const argument = new commander.Argument(''); + expect(argument.required).toBe(true); +}); + +test('when name with surrounding [] then argument optional', () => { + const argument = new commander.Argument('[name]'); + expect(argument.required).toBe(false); +}); + +test('when name without surrounding brackets then argument required', () => { + // default behaviour, allowed from Commander 8 + const argument = new commander.Argument('name'); + expect(argument.required).toBe(true); +}); + +test('when call .argRequired() then argument required', () => { + const argument = new commander.Argument('name'); + argument.required = false; + argument.argRequired(); + expect(argument.required).toBe(true); +}); + +test('when call .argOptional() then argument optional', () => { + const argument = new commander.Argument('name'); + argument.required = true; + argument.argOptional(); + expect(argument.required).toBe(false); +}); diff --git a/typings/index.d.ts b/typings/index.d.ts index 24bd9cf82..2889e30e0 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -63,6 +63,15 @@ export class Argument { */ choices(values: string[]): this; + /** + * Make option-argument required. + */ + argRequired(): this; + + /** + * Make option-argument optional. + */ + argOptional(): this; } export class Option { diff --git a/typings/index.test-d.ts b/typings/index.test-d.ts index 66432ccd7..237fb37ee 100644 --- a/typings/index.test-d.ts +++ b/typings/index.test-d.ts @@ -395,6 +395,12 @@ expectType(baseArgument.argParser((value: string, previous: // choices expectType(baseArgument.choices(['a', 'b'])); +// argRequired +expectType(baseArgument.argRequired()); + +// argOptional +expectType(baseArgument.argOptional()); + // createArgument expectType(program.createArgument('')); expectType(program.createArgument('', 'description'));