Skip to content

Commit

Permalink
feat: allow multiple arrays to be provided, rather than always combin…
Browse files Browse the repository at this point in the history
…ing (#71)
  • Loading branch information
laggingreflex authored and bcoe committed Nov 27, 2016
1 parent 8267340 commit 0f0fb2d
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 4 deletions.
22 changes: 18 additions & 4 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ function parse (args, opts) {
'camel-case-expansion': true,
'dot-notation': true,
'parse-numbers': true,
'boolean-negation': true
'boolean-negation': true,
'duplicate-arguments-array': true,
'flatten-duplicate-arrays': true
}, opts.configuration)
var defaults = opts.default || {}
var configObjects = opts.configObjects || []
Expand Down Expand Up @@ -310,15 +312,25 @@ function parse (args, opts) {
// e.g., --foo apple banana cat becomes ["apple", "banana", "cat"]
function eatArray (i, key, args) {
var start = i + 1
var argsToSet = []
var multipleArrayFlag = i > 0
for (var ii = i + 1; ii < args.length; ii++) {
if (/^-/.test(args[ii]) && !negative.test(args[ii])) {
if (ii === start) {
setArg(key, defaultForType('array'))
}
multipleArrayFlag = true
break
}
i = ii
setArg(key, args[ii])
argsToSet.push(args[ii])
}
if (multipleArrayFlag && !configuration['flatten-duplicate-arrays']) {
setArg(key, argsToSet)
} else {
argsToSet.forEach(function (arg) {
setArg(key, arg)
})
}

return i
Expand Down Expand Up @@ -539,13 +551,15 @@ function parse (args, opts) {
if (value === increment) {
o[key] = increment(o[key])
} else if (o[key] === undefined && checkAllAliases(key, flags.arrays)) {
o[key] = Array.isArray(value) ? value : [value]
o[key] = Array.isArray(value) && configuration['flatten-duplicate-arrays'] ? value : [value]
} else if (o[key] === undefined || checkAllAliases(key, flags.bools) || checkAllAliases(keys.join('.'), flags.bools) || checkAllAliases(key, flags.counts)) {
o[key] = value
} else if (Array.isArray(o[key])) {
o[key].push(value)
} else {
} else if (configuration['duplicate-arguments-array']) {
o[key] = [ o[key], value ]
} else {
o[key] = value
}
}

Expand Down
54 changes: 54 additions & 0 deletions test/yargs-parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -1933,6 +1933,60 @@ describe('yargs-parser', function () {
expect(parsed.dice).to.equal(undefined)
})
})

describe('duplicate arguments array', function () {
it('adds duplicate argument to array', function () {
var parsed = parser('-x a -x b', {
configuration: {
'duplicate-arguments-array': true
}
})

parsed['x'].should.deep.equal(['a', 'b'])
})
it('keeps only last argument', function () {
var parsed = parser('-x a -x b', {
configuration: {
'duplicate-arguments-array': false
}
})

parsed['x'].should.equal('b')
})
})

describe('flatten duplicate arrays', function () {
it('flattens duplicate array type', function () {
var parsed = parser('-x a b -x c d', {
array: ['x'],
configuration: {
'flatten-duplicate-arrays': true
}
})

parsed['x'].should.deep.equal(['a', 'b', 'c', 'd'])
})
it('nests duplicate array types', function () {
var parsed = parser('-x a b -x c d', {
array: ['x'],
configuration: {
'flatten-duplicate-arrays': false
}
})

parsed['x'].should.deep.equal([['a', 'b'], ['c', 'd']])
})
it('doesn\'t nests single arrays', function () {
var parsed = parser('-x a b', {
array: ['x'],
configuration: {
'flatten-duplicate-arrays': false
}
})

parsed['x'].should.deep.equal(['a', 'b'])
})
})
})

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

0 comments on commit 0f0fb2d

Please sign in to comment.