From 279cc83e9e49717860dbf5a27380116df3538e79 Mon Sep 17 00:00:00 2001 From: Lloyd Brookes Date: Sat, 28 Jan 2017 21:52:10 +0000 Subject: [PATCH] for non-multiple defaultOptions, the first parsed value is now taken - not the last --- lib/output.js | 14 +++++++++++++- test/default-option.js | 26 +++++++++++++++++++++++++- test/unknown-options.js | 16 ++++++++++++++++ 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/lib/output.js b/lib/output.js index 1a921d2..b3bcd0d 100644 --- a/lib/output.js +++ b/lib/output.js @@ -37,7 +37,19 @@ class Output { : value /* lookup the definition.. if no optionArg (--option) was supplied, use the defaultOption */ - const def = t.isDefined(optionArg) ? this.definitions.get(optionArg) : this.definitions.getDefault() + let def + if (t.isDefined(optionArg)) { + def = this.definitions.get(optionArg) + } else { + def = this.definitions.getDefault() + if (def) { + /* if it's not a `multiple` and the defaultOption has already been set, move on */ + if (!def.multiple && t.isDefined(this.output[def.name])) { + if (t.isDefined(value)) this.unknown.push(value) + return true + } + } + } /* if there's no definition or defaultOption, do nothing and continue */ if (!def) { diff --git a/test/default-option.js b/test/default-option.js index 9f3b226..df67be2 100644 --- a/test/default-option.js +++ b/test/default-option.js @@ -11,7 +11,7 @@ runner.test('defaultOption: string', function () { ] const argv = [ 'file1', 'file2' ] a.deepStrictEqual(commandLineArgs(optionDefinitions, { argv }), { - files: 'file2' + files: 'file1' }) }) @@ -73,3 +73,27 @@ runner.test('defaultOption: floating args present but no defaultOption', functio { one: true } ) }) + +runner.test('defaultOption: non-multiple should take first value', function () { + const optionDefinitions = [ + { name: 'file', defaultOption: true } + ] + const argv = [ 'file1', 'file2' ] + a.deepStrictEqual(commandLineArgs(optionDefinitions, { argv }), { + file: 'file1' + }) +}) + +runner.test('defaultOption: non-multiple should take first value 2', function () { + const optionDefinitions = [ + { name: 'file', defaultOption: true }, + { name: 'one', type: Boolean }, + { name: 'two', type: Boolean } + ] + const argv = [ '--two', 'file1', '--one', 'file2' ] + a.deepStrictEqual(commandLineArgs(optionDefinitions, { argv }), { + file: 'file1', + two: true, + one: true + }) +}) diff --git a/test/unknown-options.js b/test/unknown-options.js index 4877a8a..664a18b 100644 --- a/test/unknown-options.js +++ b/test/unknown-options.js @@ -58,3 +58,19 @@ runner.test('unknown option: multiple', function () { _unknown: [ 'file1', '-t', '--two', '3', 'file3', '-a', '-b' ] }) }) + +runner.test('unknown options: rejected defaultOption values end up in _unknown', function () { + const definitions = [ + { name: 'foo', type: String }, + { name: 'verbose', alias: 'v', type: Boolean }, + { name: 'libs', type: String, defaultOption: true } + ] + const argv = [ '--foo', 'bar', '-v', 'libfn', '--libarg', 'val1', '-r' ] + const options = commandLineArgs(definitions, { argv, partial: true }) + a.deepStrictEqual(options, { + foo: 'bar', + verbose: true, + libs: 'libfn', + _unknown: [ '--libarg', 'val1', '-r' ] + }) +})