minimist 0.1.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 +45 -21
- package/package.json +40 -38
- package/readme.markdown +8 -1
- package/test/all_bool.js +32 -0
- package/test/stop_early.js +15 -0
- package/test/unknown.js +102 -0
package/index.js
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
module.exports = function (args, opts) {
|
|
2
2
|
if (!opts) opts = {};
|
|
3
3
|
|
|
4
|
-
var flags = { bools : {}, strings : {} };
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
flags.
|
|
8
|
-
}
|
|
4
|
+
var flags = { bools : {}, strings : {}, unknownFn: null };
|
|
5
|
+
|
|
6
|
+
if (typeof opts['unknown'] === 'function') {
|
|
7
|
+
flags.unknownFn = opts['unknown'];
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
if (typeof opts['boolean'] === 'boolean' && opts['boolean']) {
|
|
11
|
+
flags.allBools = true;
|
|
12
|
+
} else {
|
|
13
|
+
[].concat(opts['boolean']).filter(Boolean).forEach(function (key) {
|
|
14
|
+
flags.bools[key] = true;
|
|
15
|
+
});
|
|
16
|
+
}
|
|
9
17
|
|
|
10
18
|
var aliases = {};
|
|
11
19
|
Object.keys(opts.alias || {}).forEach(function (key) {
|
|
@@ -38,7 +46,16 @@ module.exports = function (args, opts) {
|
|
|
38
46
|
args = args.slice(0, args.indexOf('--'));
|
|
39
47
|
}
|
|
40
48
|
|
|
41
|
-
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
|
+
|
|
42
59
|
var value = !flags.strings[key] && isNumber(val)
|
|
43
60
|
? Number(val) : val
|
|
44
61
|
;
|
|
@@ -57,27 +74,28 @@ module.exports = function (args, opts) {
|
|
|
57
74
|
// 'dotall' regex modifier. See:
|
|
58
75
|
// http://stackoverflow.com/a/1068308/13216
|
|
59
76
|
var m = arg.match(/^--([^=]+)=([\s\S]*)$/);
|
|
60
|
-
setArg(m[1], m[2]);
|
|
77
|
+
setArg(m[1], m[2], arg);
|
|
61
78
|
}
|
|
62
79
|
else if (/^--no-.+/.test(arg)) {
|
|
63
80
|
var key = arg.match(/^--no-(.+)/)[1];
|
|
64
|
-
setArg(key, false);
|
|
81
|
+
setArg(key, false, arg);
|
|
65
82
|
}
|
|
66
83
|
else if (/^--.+/.test(arg)) {
|
|
67
84
|
var key = arg.match(/^--(.+)/)[1];
|
|
68
85
|
var next = args[i + 1];
|
|
69
86
|
if (next !== undefined && !/^-/.test(next)
|
|
70
87
|
&& !flags.bools[key]
|
|
88
|
+
&& !flags.allBools
|
|
71
89
|
&& (aliases[key] ? !flags.bools[aliases[key]] : true)) {
|
|
72
|
-
setArg(key, next);
|
|
90
|
+
setArg(key, next, arg);
|
|
73
91
|
i++;
|
|
74
92
|
}
|
|
75
93
|
else if (/^(true|false)$/.test(next)) {
|
|
76
|
-
setArg(key, next === 'true');
|
|
94
|
+
setArg(key, next === 'true', arg);
|
|
77
95
|
i++;
|
|
78
96
|
}
|
|
79
97
|
else {
|
|
80
|
-
setArg(key, flags.strings[key] ? '' : true);
|
|
98
|
+
setArg(key, flags.strings[key] ? '' : true, arg);
|
|
81
99
|
}
|
|
82
100
|
}
|
|
83
101
|
else if (/^-[^-]+/.test(arg)) {
|
|
@@ -88,24 +106,24 @@ module.exports = function (args, opts) {
|
|
|
88
106
|
var next = arg.slice(j+2);
|
|
89
107
|
|
|
90
108
|
if (next === '-') {
|
|
91
|
-
setArg(letters[j], next)
|
|
109
|
+
setArg(letters[j], next, arg)
|
|
92
110
|
continue;
|
|
93
111
|
}
|
|
94
112
|
|
|
95
113
|
if (/[A-Za-z]/.test(letters[j])
|
|
96
114
|
&& /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
|
|
97
|
-
setArg(letters[j], next);
|
|
115
|
+
setArg(letters[j], next, arg);
|
|
98
116
|
broken = true;
|
|
99
117
|
break;
|
|
100
118
|
}
|
|
101
119
|
|
|
102
120
|
if (letters[j+1] && letters[j+1].match(/\W/)) {
|
|
103
|
-
setArg(letters[j], arg.slice(j+2));
|
|
121
|
+
setArg(letters[j], arg.slice(j+2), arg);
|
|
104
122
|
broken = true;
|
|
105
123
|
break;
|
|
106
124
|
}
|
|
107
125
|
else {
|
|
108
|
-
setArg(letters[j], flags.strings[letters[j]] ? '' : true);
|
|
126
|
+
setArg(letters[j], flags.strings[letters[j]] ? '' : true, arg);
|
|
109
127
|
}
|
|
110
128
|
}
|
|
111
129
|
|
|
@@ -114,22 +132,28 @@ module.exports = function (args, opts) {
|
|
|
114
132
|
if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1])
|
|
115
133
|
&& !flags.bools[key]
|
|
116
134
|
&& (aliases[key] ? !flags.bools[aliases[key]] : true)) {
|
|
117
|
-
setArg(key, args[i+1]);
|
|
135
|
+
setArg(key, args[i+1], arg);
|
|
118
136
|
i++;
|
|
119
137
|
}
|
|
120
138
|
else if (args[i+1] && /true|false/.test(args[i+1])) {
|
|
121
|
-
setArg(key, args[i+1] === 'true');
|
|
139
|
+
setArg(key, args[i+1] === 'true', arg);
|
|
122
140
|
i++;
|
|
123
141
|
}
|
|
124
142
|
else {
|
|
125
|
-
setArg(key, flags.strings[key] ? '' : true);
|
|
143
|
+
setArg(key, flags.strings[key] ? '' : true, arg);
|
|
126
144
|
}
|
|
127
145
|
}
|
|
128
146
|
}
|
|
129
147
|
else {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
148
|
+
if (!flags.unknownFn || flags.unknownFn(arg) !== false) {
|
|
149
|
+
argv._.push(
|
|
150
|
+
flags.strings['_'] || !isNumber(arg) ? arg : Number(arg)
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
if (opts.stopEarly) {
|
|
154
|
+
argv._.push.apply(argv._, args.slice(i + 1));
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
133
157
|
}
|
|
134
158
|
}
|
|
135
159
|
|
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
|
@@ -55,12 +55,19 @@ options can be:
|
|
|
55
55
|
|
|
56
56
|
* `opts.string` - a string or array of strings argument names to always treat as
|
|
57
57
|
strings
|
|
58
|
-
* `opts.boolean` - a string or array of strings to always treat as
|
|
58
|
+
* `opts.boolean` - a boolean, string or array of strings to always treat as
|
|
59
|
+
booleans. if `true` will treat all double hyphenated arguments without equal signs
|
|
60
|
+
as boolean (e.g. affects `--foo`, not `-f` or `--foo=bar`)
|
|
59
61
|
* `opts.alias` - an object mapping string names to strings or arrays of string
|
|
60
62
|
argument names to use as aliases
|
|
61
63
|
* `opts.default` - an object mapping string argument names to default values
|
|
64
|
+
* `opts.stopEarly` - when true, populate `argv._` with everything after the
|
|
65
|
+
first non-option
|
|
62
66
|
* `opts['--']` - when true, populate `argv._` with everything before the `--`
|
|
63
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`.
|
|
64
71
|
|
|
65
72
|
```
|
|
66
73
|
> require('./')('one two three -- four five --six'.split(' '), { '--': true })
|
package/test/all_bool.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
var parse = require('../');
|
|
2
|
+
var test = require('tape');
|
|
3
|
+
|
|
4
|
+
test('flag boolean true (default all --args to boolean)', function (t) {
|
|
5
|
+
var argv = parse(['moo', '--honk', 'cow'], {
|
|
6
|
+
boolean: true
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
t.deepEqual(argv, {
|
|
10
|
+
honk: true,
|
|
11
|
+
_: ['moo', 'cow']
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
t.deepEqual(typeof argv.honk, 'boolean');
|
|
15
|
+
t.end();
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
test('flag boolean true only affects double hyphen arguments without equals signs', function (t) {
|
|
19
|
+
var argv = parse(['moo', '--honk', 'cow', '-p', '55', '--tacos=good'], {
|
|
20
|
+
boolean: true
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
t.deepEqual(argv, {
|
|
24
|
+
honk: true,
|
|
25
|
+
tacos: 'good',
|
|
26
|
+
p: '55',
|
|
27
|
+
_: ['moo', 'cow']
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
t.deepEqual(typeof argv.honk, 'boolean');
|
|
31
|
+
t.end();
|
|
32
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
var parse = require('../');
|
|
2
|
+
var test = require('tape');
|
|
3
|
+
|
|
4
|
+
test('stops parsing on the first non-option when stopEarly is set', function (t) {
|
|
5
|
+
var argv = parse(['--aaa', 'bbb', 'ccc', '--ddd'], {
|
|
6
|
+
stopEarly: true
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
t.deepEqual(argv, {
|
|
10
|
+
aaa: 'bbb',
|
|
11
|
+
_: ['ccc', '--ddd']
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
t.end();
|
|
15
|
+
});
|
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
|
+
});
|