yargs 3.7.1 → 3.9.1
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/CHANGELOG.md +18 -0
- package/README.md +23 -7
- package/index.js +461 -456
- package/lib/completion.js +29 -29
- package/lib/parser.js +349 -354
- package/lib/usage.js +289 -381
- package/lib/validation.js +186 -187
- package/package.json +19 -20
package/lib/validation.js
CHANGED
|
@@ -1,197 +1,196 @@
|
|
|
1
1
|
// validation-type-stuff, missing params,
|
|
2
2
|
// bad implications, custom checks.
|
|
3
3
|
module.exports = function (yargs, usage) {
|
|
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
|
-
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
if (missingRequiredArgs.length == 1) {
|
|
44
|
-
usage.fail("Missing argument value: " + missingRequiredArgs[0]);
|
|
45
|
-
}
|
|
46
|
-
else if (missingRequiredArgs.length > 1) {
|
|
47
|
-
var message = "Missing argument values: " + missingRequiredArgs.join(", ");
|
|
48
|
-
usage.fail(message);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
// make sure all the required arguments are present.
|
|
54
|
-
self.requiredArguments = function(argv) {
|
|
55
|
-
var demanded = yargs.getDemanded(),
|
|
56
|
-
missing = null;
|
|
57
|
-
|
|
58
|
-
Object.keys(demanded).forEach(function (key) {
|
|
59
|
-
if (!argv.hasOwnProperty(key)) {
|
|
60
|
-
missing = missing || {};
|
|
61
|
-
missing[key] = demanded[key];
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
if (missing) {
|
|
66
|
-
var customMsgs = [];
|
|
67
|
-
Object.keys(missing).forEach(function(key) {
|
|
68
|
-
var msg = missing[key].msg;
|
|
69
|
-
if (msg && customMsgs.indexOf(msg) < 0) {
|
|
70
|
-
customMsgs.push(msg);
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
var customMsg = customMsgs.length ? '\n' + customMsgs.join('\n') : '';
|
|
74
|
-
|
|
75
|
-
usage.fail('Missing required arguments: ' + Object.keys(missing).join(', ') + customMsg);
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
// check for unknown arguments (strict-mode).
|
|
80
|
-
self.unknownArguments = function(argv, aliases) {
|
|
81
|
-
var descriptions = usage.getDescriptions(),
|
|
82
|
-
demanded = yargs.getDemanded(),
|
|
83
|
-
unknown = [],
|
|
84
|
-
aliasLookup = {};
|
|
85
|
-
|
|
86
|
-
Object.keys(aliases).forEach(function (key) {
|
|
87
|
-
aliases[key].forEach(function (alias) {
|
|
88
|
-
aliasLookup[alias] = key;
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
Object.keys(argv).forEach(function (key) {
|
|
93
|
-
if (key !== "$0" && key !== "_" &&
|
|
94
|
-
!descriptions.hasOwnProperty(key) &&
|
|
95
|
-
!demanded.hasOwnProperty(key) &&
|
|
96
|
-
!aliasLookup.hasOwnProperty(key)) {
|
|
97
|
-
unknown.push(key);
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
if (unknown.length == 1) {
|
|
102
|
-
usage.fail("Unknown argument: " + unknown[0]);
|
|
103
|
-
}
|
|
104
|
-
else if (unknown.length > 1) {
|
|
105
|
-
usage.fail("Unknown arguments: " + unknown.join(", "));
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
// custom checks, added using the `check` option on yargs.
|
|
110
|
-
var checks = [];
|
|
111
|
-
self.check = function (f) {
|
|
112
|
-
checks.push(f);
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
self.customChecks = function(argv, aliases) {
|
|
116
|
-
checks.forEach(function (f) {
|
|
117
|
-
try {
|
|
118
|
-
var result = f(argv, aliases);
|
|
119
|
-
if (!result) {
|
|
120
|
-
usage.fail('Argument check failed: ' + f.toString());
|
|
121
|
-
} else if (typeof result === 'string') {
|
|
122
|
-
usage.fail(result);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
catch (err) {
|
|
126
|
-
usage.fail(err)
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
// check implications, argument foo implies => argument bar.
|
|
132
|
-
var implied = {};
|
|
133
|
-
self.implies = function (key, value) {
|
|
134
|
-
if (typeof key === 'object') {
|
|
135
|
-
Object.keys(key).forEach(function (k) {
|
|
136
|
-
self.implies(k, key[k]);
|
|
137
|
-
});
|
|
138
|
-
} else {
|
|
139
|
-
implied[key] = value;
|
|
4
|
+
var self = {}
|
|
5
|
+
|
|
6
|
+
// validate appropriate # of non-option
|
|
7
|
+
// arguments were provided, i.e., '_'.
|
|
8
|
+
self.nonOptionCount = function (argv) {
|
|
9
|
+
var demanded = yargs.getDemanded()
|
|
10
|
+
|
|
11
|
+
if (demanded._ && argv._.length < demanded._.count) {
|
|
12
|
+
if (demanded._.msg !== undefined) {
|
|
13
|
+
usage.fail(demanded._.msg)
|
|
14
|
+
} else {
|
|
15
|
+
usage.fail('Not enough non-option arguments: got '
|
|
16
|
+
+ argv._.length + ', need at least ' + demanded._.count
|
|
17
|
+
)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// make sure that any args that require an
|
|
23
|
+
// value (--foo=bar), have a value.
|
|
24
|
+
self.missingArgumentValue = function (argv) {
|
|
25
|
+
var options = yargs.getOptions(),
|
|
26
|
+
defaultValues = [true, false, '']
|
|
27
|
+
|
|
28
|
+
if (options.requiresArg.length > 0) {
|
|
29
|
+
var missingRequiredArgs = []
|
|
30
|
+
|
|
31
|
+
options.requiresArg.forEach(function (key) {
|
|
32
|
+
var value = argv[key]
|
|
33
|
+
|
|
34
|
+
// if a value is explicitly requested,
|
|
35
|
+
// flag argument as missing if it does not
|
|
36
|
+
// look like foo=bar was entered.
|
|
37
|
+
if (~defaultValues.indexOf(value)
|
|
38
|
+
|| (Array.isArray(value) && !value.length)) {
|
|
39
|
+
missingRequiredArgs.push(key)
|
|
140
40
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
if (missingRequiredArgs.length === 1) {
|
|
44
|
+
usage.fail('Missing argument value: ' + missingRequiredArgs[0])
|
|
45
|
+
} else if (missingRequiredArgs.length > 1) {
|
|
46
|
+
var message = 'Missing argument values: ' + missingRequiredArgs.join(', ')
|
|
47
|
+
usage.fail(message)
|
|
48
|
+
}
|
|
144
49
|
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// make sure all the required arguments are present.
|
|
53
|
+
self.requiredArguments = function (argv) {
|
|
54
|
+
var demanded = yargs.getDemanded(),
|
|
55
|
+
missing = null
|
|
56
|
+
|
|
57
|
+
Object.keys(demanded).forEach(function (key) {
|
|
58
|
+
if (!argv.hasOwnProperty(key)) {
|
|
59
|
+
missing = missing || {}
|
|
60
|
+
missing[key] = demanded[key]
|
|
61
|
+
}
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
if (missing) {
|
|
65
|
+
var customMsgs = []
|
|
66
|
+
Object.keys(missing).forEach(function (key) {
|
|
67
|
+
var msg = missing[key].msg
|
|
68
|
+
if (msg && customMsgs.indexOf(msg) < 0) {
|
|
69
|
+
customMsgs.push(msg)
|
|
70
|
+
}
|
|
71
|
+
})
|
|
145
72
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
73
|
+
var customMsg = customMsgs.length ? '\n' + customMsgs.join('\n') : ''
|
|
74
|
+
usage.fail('Missing required arguments: ' + Object.keys(missing).join(', ') + customMsg)
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// check for unknown arguments (strict-mode).
|
|
79
|
+
self.unknownArguments = function (argv, aliases) {
|
|
80
|
+
var descriptions = usage.getDescriptions(),
|
|
81
|
+
demanded = yargs.getDemanded(),
|
|
82
|
+
unknown = [],
|
|
83
|
+
aliasLookup = {}
|
|
84
|
+
|
|
85
|
+
Object.keys(aliases).forEach(function (key) {
|
|
86
|
+
aliases[key].forEach(function (alias) {
|
|
87
|
+
aliasLookup[alias] = key
|
|
88
|
+
})
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
Object.keys(argv).forEach(function (key) {
|
|
92
|
+
if (key !== '$0' && key !== '_' &&
|
|
93
|
+
!descriptions.hasOwnProperty(key) &&
|
|
94
|
+
!demanded.hasOwnProperty(key) &&
|
|
95
|
+
!aliasLookup.hasOwnProperty(key)) {
|
|
96
|
+
unknown.push(key)
|
|
97
|
+
}
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
if (unknown.length === 1) {
|
|
101
|
+
usage.fail('Unknown argument: ' + unknown[0])
|
|
102
|
+
} else if (unknown.length > 1) {
|
|
103
|
+
usage.fail('Unknown arguments: ' + unknown.join(', '))
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// custom checks, added using the `check` option on yargs.
|
|
108
|
+
var checks = []
|
|
109
|
+
self.check = function (f) {
|
|
110
|
+
checks.push(f)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
self.customChecks = function (argv, aliases) {
|
|
114
|
+
checks.forEach(function (f) {
|
|
115
|
+
try {
|
|
116
|
+
var result = f(argv, aliases)
|
|
117
|
+
if (!result) {
|
|
118
|
+
usage.fail('Argument check failed: ' + f.toString())
|
|
119
|
+
} else if (typeof result === 'string') {
|
|
120
|
+
usage.fail(result)
|
|
193
121
|
}
|
|
122
|
+
} catch (err) {
|
|
123
|
+
usage.fail(err.message ? err.message : err)
|
|
124
|
+
}
|
|
125
|
+
})
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// check implications, argument foo implies => argument bar.
|
|
129
|
+
var implied = {}
|
|
130
|
+
self.implies = function (key, value) {
|
|
131
|
+
if (typeof key === 'object') {
|
|
132
|
+
Object.keys(key).forEach(function (k) {
|
|
133
|
+
self.implies(k, key[k])
|
|
134
|
+
})
|
|
135
|
+
} else {
|
|
136
|
+
implied[key] = value
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
self.getImplied = function () {
|
|
140
|
+
return implied
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
self.implications = function (argv) {
|
|
144
|
+
var implyFail = []
|
|
145
|
+
|
|
146
|
+
Object.keys(implied).forEach(function (key) {
|
|
147
|
+
var num,
|
|
148
|
+
origKey = key,
|
|
149
|
+
value = implied[key]
|
|
150
|
+
|
|
151
|
+
// convert string '1' to number 1
|
|
152
|
+
num = Number(key)
|
|
153
|
+
key = isNaN(num) ? key : num
|
|
154
|
+
|
|
155
|
+
if (typeof key === 'number') {
|
|
156
|
+
// check length of argv._
|
|
157
|
+
key = argv._.length >= key
|
|
158
|
+
} else if (key.match(/^--no-.+/)) {
|
|
159
|
+
// check if key doesn't exist
|
|
160
|
+
key = key.match(/^--no-(.+)/)[1]
|
|
161
|
+
key = !argv[key]
|
|
162
|
+
} else {
|
|
163
|
+
// check if key exists
|
|
164
|
+
key = argv[key]
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
num = Number(value)
|
|
168
|
+
value = isNaN(num) ? value : num
|
|
169
|
+
|
|
170
|
+
if (typeof value === 'number') {
|
|
171
|
+
value = argv._.length >= value
|
|
172
|
+
} else if (value.match(/^--no-.+/)) {
|
|
173
|
+
value = value.match(/^--no-(.+)/)[1]
|
|
174
|
+
value = !argv[value]
|
|
175
|
+
} else {
|
|
176
|
+
value = argv[value]
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (key && !value) {
|
|
180
|
+
implyFail.push(origKey)
|
|
181
|
+
}
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
if (implyFail.length) {
|
|
185
|
+
var msg = 'Implications failed:\n'
|
|
186
|
+
|
|
187
|
+
implyFail.forEach(function (key) {
|
|
188
|
+
msg += (' ' + key + ' -> ' + implied[key])
|
|
189
|
+
})
|
|
190
|
+
|
|
191
|
+
usage.fail(msg)
|
|
194
192
|
}
|
|
193
|
+
}
|
|
195
194
|
|
|
196
|
-
|
|
195
|
+
return self
|
|
197
196
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yargs",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.9.1",
|
|
4
4
|
"description": "Light-weight option parsing with an argv hash. No optstrings attached.",
|
|
5
5
|
"main": "./index.js",
|
|
6
6
|
"files": [
|
|
@@ -11,38 +11,33 @@
|
|
|
11
11
|
],
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"camelcase": "^1.0.2",
|
|
14
|
+
"cliui": "^2.1.0",
|
|
14
15
|
"decamelize": "^1.0.0",
|
|
15
|
-
"window-size": "0.1.0"
|
|
16
|
-
"wordwrap": "0.0.2"
|
|
16
|
+
"window-size": "0.1.0"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"chai": "^2.2.0",
|
|
20
20
|
"coveralls": "^2.11.2",
|
|
21
21
|
"hashish": "0.0.4",
|
|
22
22
|
"mocha": "^2.2.1",
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"patched-blanket": "^1.0.1"
|
|
23
|
+
"nyc": "^2.0.0",
|
|
24
|
+
"standard": "^3.9.0"
|
|
26
25
|
},
|
|
27
26
|
"scripts": {
|
|
28
|
-
"test": "mocha --check-leaks
|
|
27
|
+
"test": "standard && nyc mocha --check-leaks && nyc report",
|
|
28
|
+
"coverage": "nyc report --reporter=text-lcov | coveralls"
|
|
29
29
|
},
|
|
30
30
|
"repository": {
|
|
31
31
|
"type": "git",
|
|
32
32
|
"url": "http://github.com/bcoe/yargs.git"
|
|
33
33
|
},
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
"node_modules",
|
|
42
|
-
"test"
|
|
43
|
-
],
|
|
44
|
-
"output-reporter": "spec"
|
|
45
|
-
}
|
|
34
|
+
"standard": {
|
|
35
|
+
"ignore": [
|
|
36
|
+
"**/example/**"
|
|
37
|
+
],
|
|
38
|
+
"globals": [
|
|
39
|
+
"it"
|
|
40
|
+
]
|
|
46
41
|
},
|
|
47
42
|
"keywords": [
|
|
48
43
|
"argument",
|
|
@@ -77,9 +72,13 @@
|
|
|
77
72
|
{
|
|
78
73
|
"name": "Benjamin Horsleben",
|
|
79
74
|
"url": "https://github.com/fizker"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"name": "Lin Clark",
|
|
78
|
+
"url": "https://github.com/linclark"
|
|
80
79
|
}
|
|
81
80
|
],
|
|
82
|
-
"license": "MIT
|
|
81
|
+
"license": "MIT",
|
|
83
82
|
"engine": {
|
|
84
83
|
"node": ">=0.4"
|
|
85
84
|
}
|