Skip to content

Commit 7d42572

Browse files
juergbabcoe
authored andcommitted
fix: boolean arrays with default values (#185)
1 parent c5a1db0 commit 7d42572

File tree

2 files changed

+47
-25
lines changed

2 files changed

+47
-25
lines changed

index.js

+23-25
Original file line numberDiff line numberDiff line change
@@ -156,15 +156,15 @@ function parse (args, opts) {
156156
args.splice(i + 1, 0, m[2])
157157
i = eatNargs(i, m[1], args)
158158
// arrays format = '--f=a b c'
159-
} else if (checkAllAliases(m[1], flags.arrays) && args.length > i + 1) {
159+
} else if (checkAllAliases(m[1], flags.arrays)) {
160160
args.splice(i + 1, 0, m[2])
161161
i = eatArray(i, m[1], args)
162162
} else {
163163
setArg(m[1], m[2])
164164
}
165165
} else if (arg.match(negatedBoolean) && configuration['boolean-negation']) {
166166
key = arg.match(negatedBoolean)[1]
167-
setArg(key, false)
167+
setArg(key, checkAllAliases(key, flags.arrays) ? [false] : false)
168168

169169
// -- seperated by space.
170170
} else if (arg.match(/^--.+/) || (
@@ -177,7 +177,7 @@ function parse (args, opts) {
177177
if (checkAllAliases(key, flags.nargs) !== false) {
178178
i = eatNargs(i, key, args)
179179
// array format = '--foo a b c'
180-
} else if (checkAllAliases(key, flags.arrays) && args.length > i + 1) {
180+
} else if (checkAllAliases(key, flags.arrays)) {
181181
i = eatArray(i, key, args)
182182
} else {
183183
next = args[i + 1]
@@ -230,7 +230,7 @@ function parse (args, opts) {
230230
args.splice(i + 1, 0, value)
231231
i = eatNargs(i, key, args)
232232
// array format = '-f=a b c'
233-
} else if (checkAllAliases(key, flags.arrays) && args.length > i + 1) {
233+
} else if (checkAllAliases(key, flags.arrays)) {
234234
args.splice(i + 1, 0, value)
235235
i = eatArray(i, key, args)
236236
} else {
@@ -271,7 +271,7 @@ function parse (args, opts) {
271271
if (checkAllAliases(key, flags.nargs) !== false) {
272272
i = eatNargs(i, key, args)
273273
// array format = '-f a b c'
274-
} else if (checkAllAliases(key, flags.arrays) && args.length > i + 1) {
274+
} else if (checkAllAliases(key, flags.arrays)) {
275275
i = eatArray(i, key, args)
276276
} else {
277277
next = args[i + 1]
@@ -376,30 +376,27 @@ function parse (args, opts) {
376376
// following it... YUM!
377377
// e.g., --foo apple banana cat becomes ["apple", "banana", "cat"]
378378
function eatArray (i, key, args) {
379-
var start = i + 1
380-
var argsToSet = []
381-
var multipleArrayFlag = i > 0
382-
for (var ii = i + 1; ii < args.length; ii++) {
383-
if (/^-/.test(args[ii]) && !negative.test(args[ii])) {
384-
if (ii === start) {
385-
setArg(key, defaultForType('array'))
386-
}
387-
multipleArrayFlag = true
388-
break
379+
let argsToSet = []
380+
let next = args[i + 1]
381+
382+
if (checkAllAliases(key, flags.bools) && !(/^(true|false)$/.test(next))) {
383+
argsToSet.push(true)
384+
} else if (isUndefined(next) || (/^-/.test(next) && !negative.test(next))) {
385+
// for keys without value ==> argsToSet remains an empty []
386+
// set user default value, if available
387+
if (defaults.hasOwnProperty(key)) {
388+
argsToSet.push(defaults[key])
389389
}
390-
i = ii
391-
argsToSet.push(args[ii])
392-
}
393-
if (multipleArrayFlag) {
394-
setArg(key, argsToSet.map(function (arg) {
395-
return processValue(key, arg)
396-
}))
397390
} else {
398-
argsToSet.forEach(function (arg) {
399-
setArg(key, arg)
400-
})
391+
for (var ii = i + 1; ii < args.length; ii++) {
392+
next = args[ii]
393+
if (/^-/.test(next) && !negative.test(next)) break
394+
i = ii
395+
argsToSet.push(processValue(key, next))
396+
}
401397
}
402398

399+
setArg(key, argsToSet)
403400
return i
404401
}
405402

@@ -791,6 +788,7 @@ function parse (args, opts) {
791788

792789
if (checkAllAliases(key, flags.strings)) type = 'string'
793790
else if (checkAllAliases(key, flags.numbers)) type = 'number'
791+
else if (checkAllAliases(key, flags.bools)) type = 'boolean'
794792
else if (checkAllAliases(key, flags.arrays)) type = 'array'
795793

796794
return type

test/yargs-parser.js

+24
Original file line numberDiff line numberDiff line change
@@ -1492,6 +1492,14 @@ describe('yargs-parser', function () {
14921492
result.should.have.property('b').and.deep.equal([])
14931493
})
14941494

1495+
it('should place default of argument in array, when default provided', function () {
1496+
var result = parser(['-b'], {
1497+
array: 'b',
1498+
default: { 'b': 33 }
1499+
})
1500+
result.should.have.property('b').and.deep.equal([33])
1501+
})
1502+
14951503
it('should place value of argument in array, when one argument provided', function () {
14961504
var result = parser(['-b', '33'], {
14971505
array: ['b']
@@ -1618,6 +1626,22 @@ describe('yargs-parser', function () {
16181626
result.should.have.property('x').that.is.an('array').and.to.deep.equal([true, false])
16191627
})
16201628

1629+
it('should respect type `boolean` without value for arrays', function () {
1630+
var result = parser(['-x', '-x'], {
1631+
array: [{ key: 'x', boolean: true }],
1632+
configuration: { 'flatten-duplicate-arrays': false }
1633+
})
1634+
result.x.should.deep.equal([[true], [true]])
1635+
})
1636+
1637+
it('should respect `boolean negation` for arrays', function () {
1638+
var result = parser(['--no-bool', '--no-bool'], {
1639+
array: [{ key: 'bool', boolean: true }],
1640+
configuration: { 'flatten-duplicate-arrays': false }
1641+
})
1642+
result.bool.should.deep.equal([[false], [false]])
1643+
})
1644+
16211645
it('should respect the type `number` option for arrays', function () {
16221646
var result = parser(['-x=5', '2'], {
16231647
array: [{ key: 'x', number: true }]

0 commit comments

Comments
 (0)