Skip to content

Commit

Permalink
Add strict error for unknown option
Browse files Browse the repository at this point in the history
  • Loading branch information
shadowspawn committed Jun 24, 2023
1 parent 4fc976f commit e1fa9f6
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 3 deletions.
14 changes: 11 additions & 3 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,13 +77,18 @@ module.exports = function (args, opts) {

var argv = { _: [] };

function argDefined(key, arg) {
return (flags.allBools && (/^--[^=]+$/).test(arg))
|| flags.strings[key]
function keyDefined(key) {
return flags.strings[key]
|| flags.bools[key]
|| aliases[key];
}

function argDefined(key, arg) {
// legacy test for whether to call unknownFn
return (flags.allBools && (/^--[^=]+$/).test(arg))
|| keyDefined(key);
}

function setKey(obj, keys, value) {
var o = obj;
for (var i = 0; i < keys.length - 1; i++) {
Expand Down Expand Up @@ -132,6 +137,9 @@ module.exports = function (args, opts) {
if (isBooleanKey(key) && typeof val === 'string' && !(/^(true|false)$/).test(val)) {
throw new Error('Unexpected option value for option "' + key + '"');
}
if (!keyDefined(key)) {
throw new Error('Unknown option "' + key + '"');
}
}

// coercion
Expand Down
36 changes: 36 additions & 0 deletions test/strict.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ function throwsWhenStrict(args, parseOptions, testOptions) {

var kMissingString = /Missing option value/;
var kBooleanWithValue = /Unexpected option value/;
var kUnknownOption = /Unknown option/;

test('strict missing option value: long string option used alone', function (t) {
throwsWhenStrict(['--str'], { string: ['str'] }, { t: t, expected: kMissingString });
Expand Down Expand Up @@ -88,9 +89,44 @@ test('strict unexpected option value: short boolean option given value', functio
});
t.end();
});

test('strict unexpected option value: short boolean option given value', function (t) {
t.doesNotThrow(function () {
parse(['--b=false'], { boolean: ['b'] });
});
t.end();
});

test('strict unknown option: unknown option', function (t) {
throwsWhenStrict(['-u'], { }, { t: t, expected: kUnknownOption });
throwsWhenStrict(['--long'], { }, { t: t, expected: kUnknownOption });
throwsWhenStrict(['-u=x'], { }, { t: t, expected: kUnknownOption });
throwsWhenStrict(['--long=x'], { }, { t: t, expected: kUnknownOption });
t.end();
});

test('strict unknown option: opt.boolean is known', function (t) {
t.doesNotThrow(function () {
parse(['--bool'], { boolean: ['bool'], strict: true });
parse(['-b'], { boolean: ['b'], strict: true });
});
t.end();
});

test('strict unknown option: opt.string is known', function (t) {
t.doesNotThrow(function () {
parse(['--str', 'SSS'], { string: ['str'], strict: true });
parse(['-s', 'SSS'], { string: ['s'], strict: true });
});
t.end();
});

test('strict unknown option: opt.alias is known', function (t) {
t.doesNotThrow(function () {
var options = { alias: { aaa: ['a', 'AAA'] }, strict: true };
parse(['--aaa'], options);
parse(['-a'], options);
parse(['--AAA'], options);
});
t.end();
});

0 comments on commit e1fa9f6

Please sign in to comment.