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 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
- [].concat(opts['boolean']).filter(Boolean).forEach(function (key) {
7
- flags.bools[key] = true;
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 setArg (key, val) {
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
- argv._.push(
131
- flags.strings['_'] || !isNumber(arg) ? arg : Number(arg)
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
- "name": "minimist",
3
- "version": "0.1.0",
4
- "description": "parse argument options",
5
- "main": "index.js",
6
- "devDependencies": {
7
- "tape": "~1.0.4",
8
- "tap": "~0.4.0"
9
- },
10
- "scripts": {
11
- "test": "tap test/*.js"
12
- },
13
- "testling" : {
14
- "files" : "test/*.js",
15
- "browsers" : [
16
- "ie/6..latest",
17
- "ff/5", "firefox/latest",
18
- "chrome/10", "chrome/latest",
19
- "safari/5.1", "safari/latest",
20
- "opera/12"
21
- ]
22
- },
23
- "repository": {
24
- "type": "git",
25
- "url": "git://github.com/substack/minimist.git"
26
- },
27
- "homepage": "https://github.com/substack/minimist",
28
- "keywords": [
29
- "argv",
30
- "getopt",
31
- "parser",
32
- "optimist"
33
- ],
34
- "author": {
35
- "name": "James Halliday",
36
- "email": "mail@substack.net",
37
- "url": "http://substack.net"
38
- },
39
- "license": "MIT"
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 booleans
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 })
@@ -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
+ });
@@ -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
+ });