minimist 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +32 -17
- package/package.json +40 -38
- package/readme.markdown +3 -0
- package/test/unknown.js +102 -0
package/index.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
module.exports = function (args, opts) {
|
|
2
2
|
if (!opts) opts = {};
|
|
3
3
|
|
|
4
|
-
var flags = { bools : {}, strings : {} };
|
|
4
|
+
var flags = { bools : {}, strings : {}, unknownFn: null };
|
|
5
|
+
|
|
6
|
+
if (typeof opts['unknown'] === 'function') {
|
|
7
|
+
flags.unknownFn = opts['unknown'];
|
|
8
|
+
}
|
|
5
9
|
|
|
6
10
|
if (typeof opts['boolean'] === 'boolean' && opts['boolean']) {
|
|
7
11
|
flags.allBools = true;
|
|
@@ -42,7 +46,16 @@ module.exports = function (args, opts) {
|
|
|
42
46
|
args = args.slice(0, args.indexOf('--'));
|
|
43
47
|
}
|
|
44
48
|
|
|
45
|
-
function
|
|
49
|
+
function argDefined(key, arg) {
|
|
50
|
+
return (flags.allBools && /^--[^=]+$/.test(arg)) ||
|
|
51
|
+
flags.strings[key] || flags.bools[key] || aliases[key];
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function setArg (key, val, arg) {
|
|
55
|
+
if (arg && flags.unknownFn && !argDefined(key, arg)) {
|
|
56
|
+
if (flags.unknownFn(arg) === false) return;
|
|
57
|
+
}
|
|
58
|
+
|
|
46
59
|
var value = !flags.strings[key] && isNumber(val)
|
|
47
60
|
? Number(val) : val
|
|
48
61
|
;
|
|
@@ -61,11 +74,11 @@ module.exports = function (args, opts) {
|
|
|
61
74
|
// 'dotall' regex modifier. See:
|
|
62
75
|
// http://stackoverflow.com/a/1068308/13216
|
|
63
76
|
var m = arg.match(/^--([^=]+)=([\s\S]*)$/);
|
|
64
|
-
setArg(m[1], m[2]);
|
|
77
|
+
setArg(m[1], m[2], arg);
|
|
65
78
|
}
|
|
66
79
|
else if (/^--no-.+/.test(arg)) {
|
|
67
80
|
var key = arg.match(/^--no-(.+)/)[1];
|
|
68
|
-
setArg(key, false);
|
|
81
|
+
setArg(key, false, arg);
|
|
69
82
|
}
|
|
70
83
|
else if (/^--.+/.test(arg)) {
|
|
71
84
|
var key = arg.match(/^--(.+)/)[1];
|
|
@@ -74,15 +87,15 @@ module.exports = function (args, opts) {
|
|
|
74
87
|
&& !flags.bools[key]
|
|
75
88
|
&& !flags.allBools
|
|
76
89
|
&& (aliases[key] ? !flags.bools[aliases[key]] : true)) {
|
|
77
|
-
setArg(key, next);
|
|
90
|
+
setArg(key, next, arg);
|
|
78
91
|
i++;
|
|
79
92
|
}
|
|
80
93
|
else if (/^(true|false)$/.test(next)) {
|
|
81
|
-
setArg(key, next === 'true');
|
|
94
|
+
setArg(key, next === 'true', arg);
|
|
82
95
|
i++;
|
|
83
96
|
}
|
|
84
97
|
else {
|
|
85
|
-
setArg(key, flags.strings[key] ? '' : true);
|
|
98
|
+
setArg(key, flags.strings[key] ? '' : true, arg);
|
|
86
99
|
}
|
|
87
100
|
}
|
|
88
101
|
else if (/^-[^-]+/.test(arg)) {
|
|
@@ -93,24 +106,24 @@ module.exports = function (args, opts) {
|
|
|
93
106
|
var next = arg.slice(j+2);
|
|
94
107
|
|
|
95
108
|
if (next === '-') {
|
|
96
|
-
setArg(letters[j], next)
|
|
109
|
+
setArg(letters[j], next, arg)
|
|
97
110
|
continue;
|
|
98
111
|
}
|
|
99
112
|
|
|
100
113
|
if (/[A-Za-z]/.test(letters[j])
|
|
101
114
|
&& /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
|
|
102
|
-
setArg(letters[j], next);
|
|
115
|
+
setArg(letters[j], next, arg);
|
|
103
116
|
broken = true;
|
|
104
117
|
break;
|
|
105
118
|
}
|
|
106
119
|
|
|
107
120
|
if (letters[j+1] && letters[j+1].match(/\W/)) {
|
|
108
|
-
setArg(letters[j], arg.slice(j+2));
|
|
121
|
+
setArg(letters[j], arg.slice(j+2), arg);
|
|
109
122
|
broken = true;
|
|
110
123
|
break;
|
|
111
124
|
}
|
|
112
125
|
else {
|
|
113
|
-
setArg(letters[j], flags.strings[letters[j]] ? '' : true);
|
|
126
|
+
setArg(letters[j], flags.strings[letters[j]] ? '' : true, arg);
|
|
114
127
|
}
|
|
115
128
|
}
|
|
116
129
|
|
|
@@ -119,22 +132,24 @@ module.exports = function (args, opts) {
|
|
|
119
132
|
if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1])
|
|
120
133
|
&& !flags.bools[key]
|
|
121
134
|
&& (aliases[key] ? !flags.bools[aliases[key]] : true)) {
|
|
122
|
-
setArg(key, args[i+1]);
|
|
135
|
+
setArg(key, args[i+1], arg);
|
|
123
136
|
i++;
|
|
124
137
|
}
|
|
125
138
|
else if (args[i+1] && /true|false/.test(args[i+1])) {
|
|
126
|
-
setArg(key, args[i+1] === 'true');
|
|
139
|
+
setArg(key, args[i+1] === 'true', arg);
|
|
127
140
|
i++;
|
|
128
141
|
}
|
|
129
142
|
else {
|
|
130
|
-
setArg(key, flags.strings[key] ? '' : true);
|
|
143
|
+
setArg(key, flags.strings[key] ? '' : true, arg);
|
|
131
144
|
}
|
|
132
145
|
}
|
|
133
146
|
}
|
|
134
147
|
else {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
148
|
+
if (!flags.unknownFn || flags.unknownFn(arg) !== false) {
|
|
149
|
+
argv._.push(
|
|
150
|
+
flags.strings['_'] || !isNumber(arg) ? arg : Number(arg)
|
|
151
|
+
);
|
|
152
|
+
}
|
|
138
153
|
if (opts.stopEarly) {
|
|
139
154
|
argv._.push.apply(argv._, args.slice(i + 1));
|
|
140
155
|
break;
|
package/package.json
CHANGED
|
@@ -1,40 +1,42 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
"
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
"
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
"
|
|
2
|
+
"name": "minimist",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "parse argument options",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"devDependencies": {
|
|
7
|
+
"tape": "~1.0.4",
|
|
8
|
+
"tap": "~0.4.0",
|
|
9
|
+
"covert": "^1.0.0"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"test": "tap test/*.js",
|
|
13
|
+
"coverage": "covert test/*.js"
|
|
14
|
+
},
|
|
15
|
+
"testling" : {
|
|
16
|
+
"files" : "test/*.js",
|
|
17
|
+
"browsers" : [
|
|
18
|
+
"ie/6..latest",
|
|
19
|
+
"ff/5", "firefox/latest",
|
|
20
|
+
"chrome/10", "chrome/latest",
|
|
21
|
+
"safari/5.1", "safari/latest",
|
|
22
|
+
"opera/12"
|
|
23
|
+
]
|
|
24
|
+
},
|
|
25
|
+
"repository": {
|
|
26
|
+
"type": "git",
|
|
27
|
+
"url": "git://github.com/substack/minimist.git"
|
|
28
|
+
},
|
|
29
|
+
"homepage": "https://github.com/substack/minimist",
|
|
30
|
+
"keywords": [
|
|
31
|
+
"argv",
|
|
32
|
+
"getopt",
|
|
33
|
+
"parser",
|
|
34
|
+
"optimist"
|
|
35
|
+
],
|
|
36
|
+
"author": {
|
|
37
|
+
"name": "James Halliday",
|
|
38
|
+
"email": "mail@substack.net",
|
|
39
|
+
"url": "http://substack.net"
|
|
40
|
+
},
|
|
41
|
+
"license": "MIT"
|
|
40
42
|
}
|
package/readme.markdown
CHANGED
|
@@ -65,6 +65,9 @@ argument names to use as aliases
|
|
|
65
65
|
first non-option
|
|
66
66
|
* `opts['--']` - when true, populate `argv._` with everything before the `--`
|
|
67
67
|
and `argv['--']` with everything after the `--`. Here's an example:
|
|
68
|
+
* `opts.unknown` - a function which is invoked with a command line parameter not
|
|
69
|
+
defined in the `opts` configuration object. If the function returns `false`, the
|
|
70
|
+
unknown option is not added to `argv`.
|
|
68
71
|
|
|
69
72
|
```
|
|
70
73
|
> require('./')('one two three -- four five --six'.split(' '), { '--': true })
|
package/test/unknown.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
var parse = require('../');
|
|
2
|
+
var test = require('tape');
|
|
3
|
+
|
|
4
|
+
test('boolean and alias is not unknown', function (t) {
|
|
5
|
+
var unknown = [];
|
|
6
|
+
function unknownFn(arg) {
|
|
7
|
+
unknown.push(arg);
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
var aliased = [ '-h', 'true', '--derp', 'true' ];
|
|
11
|
+
var regular = [ '--herp', 'true', '-d', 'true' ];
|
|
12
|
+
var opts = {
|
|
13
|
+
alias: { h: 'herp' },
|
|
14
|
+
boolean: 'h',
|
|
15
|
+
unknown: unknownFn
|
|
16
|
+
};
|
|
17
|
+
var aliasedArgv = parse(aliased, opts);
|
|
18
|
+
var propertyArgv = parse(regular, opts);
|
|
19
|
+
|
|
20
|
+
t.same(unknown, ['--derp', '-d']);
|
|
21
|
+
t.end();
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test('flag boolean true any double hyphen argument is not unknown', function (t) {
|
|
25
|
+
var unknown = [];
|
|
26
|
+
function unknownFn(arg) {
|
|
27
|
+
unknown.push(arg);
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
var argv = parse(['--honk', '--tacos=good', 'cow', '-p', '55'], {
|
|
31
|
+
boolean: true,
|
|
32
|
+
unknown: unknownFn
|
|
33
|
+
});
|
|
34
|
+
t.same(unknown, ['--tacos=good', 'cow', '-p']);
|
|
35
|
+
t.same(argv, {
|
|
36
|
+
honk: true,
|
|
37
|
+
_: []
|
|
38
|
+
});
|
|
39
|
+
t.end();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test('string and alias is not unknown', function (t) {
|
|
43
|
+
var unknown = [];
|
|
44
|
+
function unknownFn(arg) {
|
|
45
|
+
unknown.push(arg);
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
var aliased = [ '-h', 'hello', '--derp', 'goodbye' ];
|
|
49
|
+
var regular = [ '--herp', 'hello', '-d', 'moon' ];
|
|
50
|
+
var opts = {
|
|
51
|
+
alias: { h: 'herp' },
|
|
52
|
+
string: 'h',
|
|
53
|
+
unknown: unknownFn
|
|
54
|
+
};
|
|
55
|
+
var aliasedArgv = parse(aliased, opts);
|
|
56
|
+
var propertyArgv = parse(regular, opts);
|
|
57
|
+
|
|
58
|
+
t.same(unknown, ['--derp', '-d']);
|
|
59
|
+
t.end();
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test('default and alias is not unknown', function (t) {
|
|
63
|
+
var unknown = [];
|
|
64
|
+
function unknownFn(arg) {
|
|
65
|
+
unknown.push(arg);
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
var aliased = [ '-h', 'hello' ];
|
|
69
|
+
var regular = [ '--herp', 'hello' ];
|
|
70
|
+
var opts = {
|
|
71
|
+
default: { 'h': 'bar' },
|
|
72
|
+
alias: { 'h': 'herp' },
|
|
73
|
+
unknown: unknownFn
|
|
74
|
+
};
|
|
75
|
+
var aliasedArgv = parse(aliased, opts);
|
|
76
|
+
var propertyArgv = parse(regular, opts);
|
|
77
|
+
|
|
78
|
+
t.same(unknown, []);
|
|
79
|
+
t.end();
|
|
80
|
+
unknownFn(); // exercise fn for 100% coverage
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test('value following -- is not unknown', function (t) {
|
|
84
|
+
var unknown = [];
|
|
85
|
+
function unknownFn(arg) {
|
|
86
|
+
unknown.push(arg);
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
var aliased = [ '--bad', '--', 'good', 'arg' ];
|
|
90
|
+
var opts = {
|
|
91
|
+
'--': true,
|
|
92
|
+
unknown: unknownFn
|
|
93
|
+
};
|
|
94
|
+
var argv = parse(aliased, opts);
|
|
95
|
+
|
|
96
|
+
t.same(unknown, ['--bad']);
|
|
97
|
+
t.same(argv, {
|
|
98
|
+
'--': ['good', 'arg'],
|
|
99
|
+
'_': []
|
|
100
|
+
})
|
|
101
|
+
t.end();
|
|
102
|
+
});
|