Comparing version 0.5.2 to 0.6.0
223
index.js
var path = require('path'); | ||
var minimist = require('minimist'); | ||
var wordwrap = require('wordwrap'); | ||
@@ -20,3 +21,3 @@ | ||
var exports = module.exports = Argv; | ||
function Argv (args, cwd) { | ||
function Argv (processArgs, cwd) { | ||
var self = {}; | ||
@@ -41,13 +42,11 @@ if (!cwd) cwd = process.cwd(); | ||
var flags = { bools : {}, strings : {} }; | ||
var options = { | ||
boolean: [], | ||
string: [], | ||
alias: {}, | ||
default: [] | ||
}; | ||
self.boolean = function (bools) { | ||
if (!Array.isArray(bools)) { | ||
bools = [].slice.call(arguments); | ||
} | ||
bools.forEach(function (name) { | ||
flags.bools[name] = true; | ||
}); | ||
options.boolean.push.apply(options.boolean, [].concat(bools)); | ||
return self; | ||
@@ -57,14 +56,18 @@ }; | ||
self.string = function (strings) { | ||
if (!Array.isArray(strings)) { | ||
strings = [].slice.call(arguments); | ||
options.string.push.apply(options.string, [].concat(strings)); | ||
return self; | ||
}; | ||
self.default = function (key, value) { | ||
if (typeof key === 'object') { | ||
Object.keys(key).forEach(function (k) { | ||
self.default(k, key[k]); | ||
}); | ||
} | ||
strings.forEach(function (name) { | ||
flags.strings[name] = true; | ||
}); | ||
else { | ||
options.default[key] = value; | ||
} | ||
return self; | ||
}; | ||
var aliases = {}; | ||
self.alias = function (x, y) { | ||
@@ -76,13 +79,5 @@ if (typeof x === 'object') { | ||
} | ||
else if (Array.isArray(y)) { | ||
y.forEach(function (yy) { | ||
self.alias(x, yy); | ||
}); | ||
} | ||
else { | ||
var zs = (aliases[x] || []).concat(aliases[y] || []).concat(x, y); | ||
aliases[x] = zs.filter(function (z) { return z != x }); | ||
aliases[y] = zs.filter(function (z) { return z != y }); | ||
options.alias[x] = (options.alias[x] || []).concat(y); | ||
} | ||
return self; | ||
@@ -135,16 +130,2 @@ }; | ||
var defaults = {}; | ||
self.default = function (key, value) { | ||
if (typeof key === 'object') { | ||
Object.keys(key).forEach(function (k) { | ||
self.default(k, key[k]); | ||
}); | ||
} | ||
else { | ||
defaults[key] = value; | ||
} | ||
return self; | ||
}; | ||
var descriptions = {}; | ||
@@ -163,5 +144,4 @@ self.describe = function (key, desc) { | ||
self.parse = function (args_) { | ||
args = args_; | ||
return self.argv; | ||
self.parse = function (args) { | ||
return parseArgs(args); | ||
}; | ||
@@ -213,3 +193,3 @@ | ||
.concat(Object.keys(demanded)) | ||
.concat(Object.keys(defaults)) | ||
.concat(Object.keys(options.default)) | ||
.reduce(function (acc, key) { | ||
@@ -228,3 +208,3 @@ if (key !== '_') acc[key] = true; | ||
var switches = keys.reduce(function (acc, key) { | ||
acc[key] = [ key ].concat(aliases[key] || []) | ||
acc[key] = [ key ].concat(options.alias[key] || []) | ||
.map(function (sw) { | ||
@@ -266,4 +246,4 @@ return (sw.length > 1 ? '--' : '-') + sw | ||
if (flags.bools[key]) type = '[boolean]'; | ||
if (flags.strings[key]) type = '[string]'; | ||
if (options.boolean[key]) type = '[boolean]'; | ||
if (options.string[key]) type = '[string]'; | ||
@@ -281,4 +261,4 @@ if (!wrap && dpadding.length > 0) { | ||
, | ||
defaults[key] !== undefined | ||
? '[default: ' + JSON.stringify(defaults[key]) + ']' | ||
options.default[key] !== undefined | ||
? '[default: ' + JSON.stringify(options.default[key]) + ']' | ||
: null | ||
@@ -312,120 +292,10 @@ , | ||
Object.defineProperty(self, 'argv', { | ||
get : parseArgs, | ||
get : function () { return parseArgs(processArgs) }, | ||
enumerable : true, | ||
}); | ||
function parseArgs () { | ||
var argv = { _ : [], $0 : self.$0 }; | ||
Object.keys(flags.bools).forEach(function (key) { | ||
setArg(key, defaults[key] || false); | ||
}); | ||
function parseArgs (args) { | ||
var argv = minimist(args, options); | ||
argv.$0 = self.$0; | ||
function setArg (key, val) { | ||
var value = !flags.strings[key] && isNumber(val) | ||
? Number(val) : val | ||
; | ||
setKey(argv, key.split('.'), value); | ||
(aliases[key] || []).forEach(function (x) { | ||
argv[x] = argv[key]; | ||
}); | ||
} | ||
for (var i = 0; i < args.length; i++) { | ||
var arg = args[i]; | ||
if (arg === '--') { | ||
argv._.push.apply(argv._, args.slice(i + 1)); | ||
break; | ||
} | ||
else if (arg.match(/^--.+=/)) { | ||
// Using [\s\S] instead of . because js doesn't support the | ||
// 'dotall' regex modifier. See: | ||
// http://stackoverflow.com/a/1068308/13216 | ||
var m = arg.match(/^--([^=]+)=([\s\S]*)$/); | ||
setArg(m[1], m[2]); | ||
} | ||
else if (arg.match(/^--no-.+/)) { | ||
var key = arg.match(/^--no-(.+)/)[1]; | ||
setArg(key, false); | ||
} | ||
else if (arg.match(/^--.+/)) { | ||
var key = arg.match(/^--(.+)/)[1]; | ||
var next = args[i + 1]; | ||
if (next !== undefined && !next.match(/^-/) | ||
&& !flags.bools[key] | ||
&& (aliases[key] ? !flags.bools[aliases[key]] : true)) { | ||
setArg(key, next); | ||
i++; | ||
} | ||
else if (/^(true|false)$/.test(next)) { | ||
setArg(key, next === 'true'); | ||
i++; | ||
} | ||
else { | ||
setArg(key, true); | ||
} | ||
} | ||
else if (arg.match(/^-[^-]+/)) { | ||
var letters = arg.slice(1,-1).split(''); | ||
var broken = false; | ||
for (var j = 0; j < letters.length; j++) { | ||
var next = arg.slice(j+2); | ||
if (next === '-') { | ||
setArg(letters[j], next) | ||
continue; | ||
} | ||
if (/[A-Za-z]/.test(letters[j]) | ||
&& /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) { | ||
setArg(letters[j], next); | ||
break; | ||
} | ||
if (letters[j+1] && letters[j+1].match(/\W/)) { | ||
setArg(letters[j], arg.slice(j+2)); | ||
broken = true; | ||
break; | ||
} | ||
else { | ||
setArg(letters[j], true); | ||
} | ||
} | ||
var key = arg.slice(-1)[0]; | ||
if (!broken && key !== '-') { | ||
if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1]) | ||
&& !flags.bools[key] | ||
&& (aliases[key] ? !flags.bools[aliases[key]] : true)) { | ||
setArg(key, args[i+1]); | ||
i++; | ||
} | ||
else if (args[i+1] && /true|false/.test(args[i+1])) { | ||
setArg(key, args[i+1] === 'true'); | ||
i++; | ||
} | ||
else { | ||
setArg(key, true); | ||
} | ||
} | ||
} | ||
else { | ||
argv._.push( | ||
flags.strings['_'] || !isNumber(arg) ? arg : Number(arg) | ||
); | ||
} | ||
} | ||
Object.keys(defaults).forEach(function (key) { | ||
if (!(key in argv)) { | ||
argv[key] = defaults[key]; | ||
if (key in aliases) { | ||
argv[aliases[key]] = defaults[key]; | ||
} | ||
} | ||
}); | ||
if (demanded._ && argv._.length < demanded._) { | ||
@@ -485,26 +355,1 @@ fail('Not enough non-option arguments: got ' | ||
}; | ||
function setKey (obj, keys, value) { | ||
var o = obj; | ||
keys.slice(0,-1).forEach(function (key) { | ||
if (o[key] === undefined) o[key] = {}; | ||
o = o[key]; | ||
}); | ||
var key = keys[keys.length - 1]; | ||
if (o[key] === undefined || typeof o[key] === 'boolean') { | ||
o[key] = value; | ||
} | ||
else if (Array.isArray(o[key])) { | ||
o[key].push(value); | ||
} | ||
else { | ||
o[key] = [ o[key], value ]; | ||
} | ||
} | ||
function isNumber (x) { | ||
if (typeof x === 'number') return true; | ||
if (/^0x[0-9a-f]+$/i.test(x)) return true; | ||
return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x); | ||
} |
{ | ||
"name" : "optimist", | ||
"version" : "0.5.2", | ||
"version" : "0.6.0", | ||
"description" : "Light-weight option parsing with an argv hash. No optstrings attached.", | ||
"main" : "./index.js", | ||
"dependencies" : { | ||
"wordwrap" : "~0.0.2" | ||
"wordwrap" : "~0.0.2", | ||
"minimist" : "~0.0.1" | ||
}, | ||
@@ -9,0 +10,0 @@ "devDependencies" : { |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
46452
2
1209
+ Addedminimist@~0.0.1
+ Addedminimist@0.0.10(transitive)