From d23b473c8224a7bda26efce4133d2d419a4d698b Mon Sep 17 00:00:00 2001 From: laggingreflex Date: Sat, 12 Nov 2016 20:34:11 +0530 Subject: [PATCH 1/2] feat: allow disabling duplicate-arguments-array Lets you disable "duplicates" behaviour ``` yargsParser('-x 1 -x 2') // => {x: [1, 2]} ``` ``` yargsParser('-x 1 -x 2', {configuration:{'duplicate-arguments-array': false}}) // => {x: 2} ``` --- index.js | 7 +++++-- test/yargs-parser.js | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 0d3ed26a..46a3fa18 100644 --- a/index.js +++ b/index.js @@ -15,7 +15,8 @@ function parse (args, opts) { 'camel-case-expansion': true, 'dot-notation': true, 'parse-numbers': true, - 'boolean-negation': true + 'boolean-negation': true, + 'duplicate-arguments-array': true }, opts.configuration) var defaults = opts.default || {} var configObjects = opts.configObjects || [] @@ -544,8 +545,10 @@ function parse (args, opts) { 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 } } diff --git a/test/yargs-parser.js b/test/yargs-parser.js index 8529d859..6f84e7d1 100644 --- a/test/yargs-parser.js +++ b/test/yargs-parser.js @@ -1933,6 +1933,27 @@ 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') + }) + }) }) // addresses: https://github.com/yargs/yargs-parser/issues/41 From 4b41e353a493ca8aa54d307f121f350d75b4afde Mon Sep 17 00:00:00 2001 From: laggingreflex Date: Sat, 12 Nov 2016 20:34:11 +0530 Subject: [PATCH 2/2] 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 ``` --- index.js | 17 ++++++++++++++--- test/yargs-parser.js | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index 46a3fa18..1031bf02 100644 --- a/index.js +++ b/index.js @@ -16,7 +16,8 @@ function parse (args, opts) { 'dot-notation': true, 'parse-numbers': true, 'boolean-negation': true, - 'duplicate-arguments-array': true + 'duplicate-arguments-array': true, + 'flatten-duplicate-arrays': true }, opts.configuration) var defaults = opts.default || {} var configObjects = opts.configObjects || [] @@ -311,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 @@ -540,7 +551,7 @@ 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])) { diff --git a/test/yargs-parser.js b/test/yargs-parser.js index 6f84e7d1..0e1778a9 100644 --- a/test/yargs-parser.js +++ b/test/yargs-parser.js @@ -1954,6 +1954,39 @@ describe('yargs-parser', function () { 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