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 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 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
+
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
- argv._.push(
136
- flags.strings['_'] || !isNumber(arg) ? arg : Number(arg)
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
- "name": "minimist",
3
- "version": "1.0.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
@@ -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 })
@@ -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
+ });