Skip to content

Commit

Permalink
feat(command): add camelcase commands to argv (yargs#658)
Browse files Browse the repository at this point in the history
  • Loading branch information
ssonal authored and bcoe committed Oct 14, 2016
1 parent aa966c5 commit b1cabae
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 0 deletions.
11 changes: 11 additions & 0 deletions lib/command.js
@@ -1,5 +1,6 @@
const path = require('path')
const inspect = require('util').inspect
const camelCase = require('camelcase')

// handles parsing positional arguments,
// and populating argv with said positional
Expand Down Expand Up @@ -185,6 +186,7 @@ module.exports = function (yargs, usage, validation) {
if (demand.variadic) argv[demand.cmd] = argv._.splice(0)
else argv[demand.cmd] = argv._.shift()
postProcessPositional(yargs, argv, demand.cmd)
addCamelCaseExpansions(argv, demand.cmd)
}

while (optional.length) {
Expand All @@ -194,6 +196,7 @@ module.exports = function (yargs, usage, validation) {
if (maybe.variadic) argv[maybe.cmd] = argv._.splice(0)
else argv[maybe.cmd] = argv._.shift()
postProcessPositional(yargs, argv, maybe.cmd)
addCamelCaseExpansions(argv, maybe.cmd)
}

argv._ = context.commands.concat(argv._)
Expand All @@ -211,6 +214,14 @@ module.exports = function (yargs, usage, validation) {
}
}

function addCamelCaseExpansions (argv, option) {
if (/-/.test(option)) {
const cc = camelCase(option)
if (typeof argv[option] === 'object') argv[cc] = argv[option].slice(0)
else argv[cc] = argv[option]
}
}

self.reset = function () {
handlers = {}
aliasMap = {}
Expand Down
1 change: 1 addition & 0 deletions package.json
Expand Up @@ -12,6 +12,7 @@
"LICENSE"
],
"dependencies": {
"camelcase": "^3.0.0",
"cliui": "^3.2.0",
"decamelize": "^1.1.1",
"get-caller-file": "^1.0.1",
Expand Down
24 changes: 24 additions & 0 deletions test/command.js
Expand Up @@ -49,6 +49,30 @@ describe('Command', function () {
argv.awesome.should.equal('world')
})

it('populates argv with camel-case variants of arguments when possible', function () {
var argv = yargs('foo hello world')
.command('foo <foo-bar> [baz-qux]')
.argv

argv._.should.include('foo')
argv['foo-bar'].should.equal('hello')
argv.fooBar.should.equal('hello')
argv.bazQux.should.equal('world')
argv['baz-qux'].should.equal('world')
})

it('populates argv with camel-case variants of variadic args when possible', function () {
var argv = yargs('foo hello world !')
.command('foo <foo-bar> [baz-qux..]')
.argv

argv._.should.include('foo')
argv['foo-bar'].should.equal('hello')
argv.fooBar.should.equal('hello')
argv.bazQux.should.deep.equal(['world', '!'])
argv['baz-qux'].should.deep.equal(['world', '!'])
})

it('populates subcommand\'s inner argv with positional arguments', function () {
yargs('foo bar hello world')
.command('foo', 'my awesome command', function (yargs) {
Expand Down
28 changes: 28 additions & 0 deletions test/yargs.js
Expand Up @@ -1435,6 +1435,34 @@ describe('yargs dsl tests', function () {
dates[1].toString().should.equal(new Date('2016-07-18').toString())
})

it('returns camelcase args for a command', function () {
var age1
var age2
var dates
yargs('add 30days 2016-06-13 2016-07-18')
.command('add <age-in-days> [dates..]', 'Testing', function (yargs) {
return yargs
.coerce('age-in-days', function (arg) {
return parseInt(arg, 10) * 86400000
})
.coerce('dates', function (arg) {
return arg.map(function (str) {
return new Date(str)
})
})
}, function (argv) {
age1 = argv.ageInDays
age2 = argv['age-in-days']
dates = argv.dates
})
.argv
expect(age1).to.equal(2592000000)
expect(age2).to.equal(2592000000)
expect(dates).to.have.lengthOf(2)
dates[0].toString().should.equal(new Date('2016-06-13').toString())
dates[1].toString().should.equal(new Date('2016-07-18').toString())
})

it('allows an error from positional arg to be handled by fail() handler', function () {
var msg
var err
Expand Down

0 comments on commit b1cabae

Please sign in to comment.