Skip to content

Commit 4b41e35

Browse files
committed
feat: allow not to flatten duplicate array types
Lets you disable flattening of multiple array type values ``` yargsParser('-x a b -x c d', {array: ['x]}) // => {x: ['a', 'b', 'c', 'd']} // all flattened ``` ``` yargsParser('-x a b -x c d', {array: ['x], configuration:{'flatten-duplicate-arrays': false}}) // => {x: [['a', 'b'], ['c', 'd']]} // multiple nested arrays ```
1 parent d23b473 commit 4b41e35

File tree

2 files changed

+47
-3
lines changed

2 files changed

+47
-3
lines changed

index.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ function parse (args, opts) {
1616
'dot-notation': true,
1717
'parse-numbers': true,
1818
'boolean-negation': true,
19-
'duplicate-arguments-array': true
19+
'duplicate-arguments-array': true,
20+
'flatten-duplicate-arrays': true
2021
}, opts.configuration)
2122
var defaults = opts.default || {}
2223
var configObjects = opts.configObjects || []
@@ -311,15 +312,25 @@ function parse (args, opts) {
311312
// e.g., --foo apple banana cat becomes ["apple", "banana", "cat"]
312313
function eatArray (i, key, args) {
313314
var start = i + 1
315+
var argsToSet = []
316+
var multipleArrayFlag = i > 0
314317
for (var ii = i + 1; ii < args.length; ii++) {
315318
if (/^-/.test(args[ii]) && !negative.test(args[ii])) {
316319
if (ii === start) {
317320
setArg(key, defaultForType('array'))
318321
}
322+
multipleArrayFlag = true
319323
break
320324
}
321325
i = ii
322-
setArg(key, args[ii])
326+
argsToSet.push(args[ii])
327+
}
328+
if (multipleArrayFlag && !configuration['flatten-duplicate-arrays']) {
329+
setArg(key, argsToSet)
330+
} else {
331+
argsToSet.forEach(function (arg) {
332+
setArg(key, arg)
333+
})
323334
}
324335

325336
return i
@@ -540,7 +551,7 @@ function parse (args, opts) {
540551
if (value === increment) {
541552
o[key] = increment(o[key])
542553
} else if (o[key] === undefined && checkAllAliases(key, flags.arrays)) {
543-
o[key] = Array.isArray(value) ? value : [value]
554+
o[key] = Array.isArray(value) && configuration['flatten-duplicate-arrays'] ? value : [value]
544555
} else if (o[key] === undefined || checkAllAliases(key, flags.bools) || checkAllAliases(keys.join('.'), flags.bools) || checkAllAliases(key, flags.counts)) {
545556
o[key] = value
546557
} else if (Array.isArray(o[key])) {

test/yargs-parser.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1954,6 +1954,39 @@ describe('yargs-parser', function () {
19541954
parsed['x'].should.equal('b')
19551955
})
19561956
})
1957+
1958+
describe('flatten duplicate arrays', function () {
1959+
it('flattens duplicate array type', function () {
1960+
var parsed = parser('-x a b -x c d', {
1961+
array: ['x'],
1962+
configuration: {
1963+
'flatten-duplicate-arrays': true
1964+
}
1965+
})
1966+
1967+
parsed['x'].should.deep.equal(['a', 'b', 'c', 'd'])
1968+
})
1969+
it('nests duplicate array types', function () {
1970+
var parsed = parser('-x a b -x c d', {
1971+
array: ['x'],
1972+
configuration: {
1973+
'flatten-duplicate-arrays': false
1974+
}
1975+
})
1976+
1977+
parsed['x'].should.deep.equal([['a', 'b'], ['c', 'd']])
1978+
})
1979+
it('doesn\'t nests single arrays', function () {
1980+
var parsed = parser('-x a b', {
1981+
array: ['x'],
1982+
configuration: {
1983+
'flatten-duplicate-arrays': false
1984+
}
1985+
})
1986+
1987+
parsed['x'].should.deep.equal(['a', 'b'])
1988+
})
1989+
})
19571990
})
19581991

19591992
// addresses: https://github.com/yargs/yargs-parser/issues/41

0 commit comments

Comments
 (0)