Comparing version 3.0.6 to 4.0.0
@@ -11,2 +11,3 @@ // info about each config option. | ||
, abbrev = require("abbrev") | ||
, osenv = require("osenv") | ||
@@ -37,10 +38,12 @@ module.exports = exports = nopt | ||
, key | ||
, remain = [] | ||
, cooked = args | ||
, original = args.slice(0) | ||
, argv = { | ||
remain: [], | ||
cooked: args, | ||
original: args.slice(0) | ||
} | ||
parse(args, data, remain, types, shorthands) | ||
parse(args, data, argv.remain, types, shorthands) | ||
// now data is full | ||
clean(data, types, exports.typeDefs) | ||
data.argv = {remain:remain,cooked:cooked,original:original} | ||
data.argv = argv | ||
Object.defineProperty(data.argv, 'toString', { value: function () { | ||
@@ -134,7 +137,12 @@ return this.original.map(JSON.stringify).join(" ") | ||
val = String(val) | ||
var homePattern = process.platform === 'win32' ? /^~(\/|\\)/ : /^~\// | ||
if (val.match(homePattern) && process.env.HOME) { | ||
val = path.resolve(process.env.HOME, val.substr(2)) | ||
var isWin = process.platform === 'win32' | ||
, homePattern = isWin ? /^~(\/|\\)/ : /^~\// | ||
, home = osenv.home() | ||
if (home && val.match(homePattern)) { | ||
data[k] = path.resolve(home, val.substr(2)) | ||
} else { | ||
data[k] = path.resolve(val) | ||
} | ||
data[k] = path.resolve(String(val)) | ||
return true | ||
@@ -150,4 +158,4 @@ } | ||
function validateDate (data, k, val) { | ||
debug("validate Date %j %j %j", k, val, Date.parse(val)) | ||
var s = Date.parse(val) | ||
debug("validate Date %j %j %j", k, val, s) | ||
if (isNaN(s)) return false | ||
@@ -253,8 +261,8 @@ data[k] = new Date(val) | ||
if (arg.charAt(0) === "-" && arg.length > 1) { | ||
if (arg.indexOf("=") !== -1) { | ||
var at = arg.indexOf('=') | ||
if (at > -1) { | ||
hadEq = true | ||
var v = arg.split("=") | ||
arg = v.shift() | ||
v = v.join("=") | ||
args.splice.apply(args, [i, 1].concat([arg, v])) | ||
var v = arg.substr(at + 1) | ||
arg = arg.substr(0, at) | ||
args.splice(i, 1, arg, v) | ||
} | ||
@@ -283,5 +291,12 @@ | ||
var isArray = types[arg] === Array || | ||
Array.isArray(types[arg]) && types[arg].indexOf(Array) !== -1 | ||
var argType = types[arg] | ||
var isTypeArray = Array.isArray(argType) | ||
if (isTypeArray && argType.length === 1) { | ||
isTypeArray = false | ||
argType = argType[0] | ||
} | ||
var isArray = argType === Array || | ||
isTypeArray && argType.indexOf(Array) !== -1 | ||
// allow unknown things to be arrays if specified multiple times. | ||
@@ -298,8 +313,8 @@ if (!types.hasOwnProperty(arg) && data.hasOwnProperty(arg)) { | ||
var isBool = typeof no === 'boolean' || | ||
types[arg] === Boolean || | ||
Array.isArray(types[arg]) && types[arg].indexOf(Boolean) !== -1 || | ||
(typeof types[arg] === 'undefined' && !hadEq) || | ||
argType === Boolean || | ||
isTypeArray && argType.indexOf(Boolean) !== -1 || | ||
(typeof argType === 'undefined' && !hadEq) || | ||
(la === "false" && | ||
(types[arg] === null || | ||
Array.isArray(types[arg]) && ~types[arg].indexOf(null))) | ||
(argType === null || | ||
isTypeArray && ~argType.indexOf(null))) | ||
@@ -318,8 +333,8 @@ if (isBool) { | ||
// also support "foo":[Boolean, "bar"] and "--foo bar" | ||
if (Array.isArray(types[arg]) && la) { | ||
if (~types[arg].indexOf(la)) { | ||
if (isTypeArray && la) { | ||
if (~argType.indexOf(la)) { | ||
// an explicit type | ||
val = la | ||
i ++ | ||
} else if ( la === "null" && ~types[arg].indexOf(null) ) { | ||
} else if ( la === "null" && ~argType.indexOf(null) ) { | ||
// null allowed | ||
@@ -330,7 +345,7 @@ val = null | ||
!isNaN(la) && | ||
~types[arg].indexOf(Number) ) { | ||
~argType.indexOf(Number) ) { | ||
// number | ||
val = +la | ||
i ++ | ||
} else if ( !la.match(/^-[^-]/) && ~types[arg].indexOf(String) ) { | ||
} else if ( !la.match(/^-[^-]/) && ~argType.indexOf(String) ) { | ||
// string | ||
@@ -348,4 +363,10 @@ val = la | ||
if (types[arg] === String && la === undefined) | ||
la = "" | ||
if (argType === String) { | ||
if (la === undefined) { | ||
la = "" | ||
} else if (la.match(/^-{1,2}[^-]+/)) { | ||
la = "" | ||
i -- | ||
} | ||
} | ||
@@ -352,0 +373,0 @@ if (la && la.match(/^-{2,}$/)) { |
{ | ||
"name": "nopt", | ||
"version": "3.0.6", | ||
"version": "4.0.0", | ||
"description": "Option parsing for Node, supporting types, shorthands, etc. Used by npm.", | ||
@@ -17,7 +17,8 @@ "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)", | ||
"dependencies": { | ||
"abbrev": "1" | ||
"abbrev": "1", | ||
"osenv": "^0.1.4" | ||
}, | ||
"devDependencies": { | ||
"tap": "^1.2.0" | ||
"tap": "^8.0.1" | ||
} | ||
} |
@@ -22,27 +22,28 @@ If you want to write an option parser, and have it be good, there are | ||
// my-program.js | ||
var nopt = require("nopt") | ||
, Stream = require("stream").Stream | ||
, path = require("path") | ||
, knownOpts = { "foo" : [String, null] | ||
, "bar" : [Stream, Number] | ||
, "baz" : path | ||
, "bloo" : [ "big", "medium", "small" ] | ||
, "flag" : Boolean | ||
, "pick" : Boolean | ||
, "many1" : [String, Array] | ||
, "many2" : [path] | ||
} | ||
, shortHands = { "foofoo" : ["--foo", "Mr. Foo"] | ||
, "b7" : ["--bar", "7"] | ||
, "m" : ["--bloo", "medium"] | ||
, "p" : ["--pick"] | ||
, "f" : ["--flag"] | ||
} | ||
// everything is optional. | ||
// knownOpts and shorthands default to {} | ||
// arg list defaults to process.argv | ||
// slice defaults to 2 | ||
, parsed = nopt(knownOpts, shortHands, process.argv, 2) | ||
console.log(parsed) | ||
```javascript | ||
// my-program.js | ||
var nopt = require("nopt") | ||
, Stream = require("stream").Stream | ||
, path = require("path") | ||
, knownOpts = { "foo" : [String, null] | ||
, "bar" : [Stream, Number] | ||
, "baz" : path | ||
, "bloo" : [ "big", "medium", "small" ] | ||
, "flag" : Boolean | ||
, "pick" : Boolean | ||
, "many1" : [String, Array] | ||
, "many2" : [path, Array] | ||
} | ||
, shortHands = { "foofoo" : ["--foo", "Mr. Foo"] | ||
, "b7" : ["--bar", "7"] | ||
, "m" : ["--bloo", "medium"] | ||
, "p" : ["--pick"] | ||
, "f" : ["--flag"] | ||
} | ||
// everything is optional. | ||
// knownOpts and shorthands default to {} | ||
// arg list defaults to process.argv | ||
// slice defaults to 2 | ||
, parsed = nopt(knownOpts, shortHands, process.argv, 2) | ||
console.log(parsed) | ||
@@ -49,0 +50,0 @@ This would give you support for any of the following: |
var nopt = require("../") | ||
, test = require('tap').test | ||
, isWin = process.platform === 'win32' | ||
test("passing a string results in a string", function (t) { | ||
@@ -18,7 +18,37 @@ var parsed = nopt({ key: String }, {}, ["--key", "myvalue"], 0) | ||
test("~ path is resolved to $HOME", function (t) { | ||
// https://github.com/npm/nopt/issues/65 | ||
test("Empty String should not swallow next flag", function (t) { | ||
var parsed = nopt({ empty: String, foo: String }, {}, ["--empty", "--foo"], 0) | ||
t.same(parsed.empty, "") | ||
t.same(parsed.foo, "") | ||
t.end() | ||
}) | ||
// https://github.com/npm/nopt/issues/66 | ||
test("Empty String should not be true when type is single item Array", function (t) { | ||
var parsed = nopt({ 'foo': [String] }, {}, ["--foo"], 0) | ||
t.same(parsed.foo, "") | ||
t.end() | ||
}) | ||
test("~ path is resolved to " + (isWin ? '%USERPROFILE%' : '$HOME'), function (t) { | ||
var path = require("path") | ||
if (!process.env.HOME) process.env.HOME = "/tmp" | ||
var parsed = nopt({key: path}, {}, ["--key=~/val"], 0) | ||
t.same(parsed.key, path.resolve(process.env.HOME, "val")) | ||
, the | ||
if (isWin) { | ||
the = { | ||
key: 'USERPROFILE', | ||
dir: 'C:\\temp', | ||
val: '~\\val' | ||
} | ||
} else { | ||
the = { | ||
key: 'HOME', | ||
dir: '/tmp', | ||
val: '~/val' | ||
} | ||
} | ||
if (!process.env[the.key]) process.env[the.key] = v.dir | ||
var parsed = nopt({key: path}, {}, ["--key=" + the.val], 0) | ||
t.same(parsed.key, path.resolve(process.env[the.key], "val")) | ||
t.end() | ||
@@ -152,3 +182,3 @@ }) | ||
,["--logfd=10", {logfd:10}, []] | ||
,["--tmp=/tmp -tar=gtar",{tmp:"/tmp",tar:"gtar"},[]] | ||
,["--tmp=/tmp -tar=gtar", {tmp: isWin ? "C:\\tmp" : "/tmp",tar:"gtar"},[]] | ||
,["--tmp=tmp -tar=gtar", | ||
@@ -155,0 +185,0 @@ {tmp:path.resolve(process.cwd(), "tmp"),tar:"gtar"},[]] |
Sorry, the diff of this file is not supported yet
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
34918
10
739
213
5
2
+ Addedosenv@^0.1.4
+ Addedos-homedir@1.0.2(transitive)
+ Addedos-tmpdir@1.0.2(transitive)
+ Addedosenv@0.1.5(transitive)