ee-bin 4.1.9 → 4.1.10
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/config/bin_default.js +181 -181
- package/index.js +120 -120
- package/lib/extend.js +77 -77
- package/lib/pargv.js +263 -263
- package/lib/utils.js +255 -224
- package/package.json +32 -32
- package/tools/encrypt.js +178 -178
- package/tools/iconGen.js +182 -182
- package/tools/incrUpdater.js +195 -176
- package/tools/move.js +68 -68
- package/tools/serve.js +346 -346
package/lib/extend.js
CHANGED
|
@@ -1,78 +1,78 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const hasOwn = Object.prototype.hasOwnProperty;
|
|
4
|
-
const toStr = Object.prototype.toString;
|
|
5
|
-
|
|
6
|
-
function isPlainObject(obj) {
|
|
7
|
-
if (!obj || toStr.call(obj) !== '[object Object]') {
|
|
8
|
-
return false;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
var hasOwnConstructor = hasOwn.call(obj, 'constructor');
|
|
12
|
-
var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf');
|
|
13
|
-
// Not own constructor property must be Object
|
|
14
|
-
if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {
|
|
15
|
-
return false;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// Own properties are enumerated firstly, so to speed up,
|
|
19
|
-
// if last one is own, then all properties are own.
|
|
20
|
-
var key;
|
|
21
|
-
for (key in obj) { /**/ }
|
|
22
|
-
|
|
23
|
-
return typeof key === 'undefined' || hasOwn.call(obj, key);
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
function extend() {
|
|
27
|
-
var options, name, src, copy, clone;
|
|
28
|
-
var target = arguments[0];
|
|
29
|
-
var i = 1;
|
|
30
|
-
var length = arguments.length;
|
|
31
|
-
var deep = false;
|
|
32
|
-
|
|
33
|
-
// Handle a deep copy situation
|
|
34
|
-
if (typeof target === 'boolean') {
|
|
35
|
-
deep = target;
|
|
36
|
-
target = arguments[1] || {};
|
|
37
|
-
// skip the boolean and the target
|
|
38
|
-
i = 2;
|
|
39
|
-
} else if ((typeof target !== 'object' && typeof target !== 'function') || target == null) {
|
|
40
|
-
target = {};
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
for (; i < length; ++i) {
|
|
44
|
-
options = arguments[i];
|
|
45
|
-
// Only deal with non-null/undefined values
|
|
46
|
-
if (options == null) continue;
|
|
47
|
-
|
|
48
|
-
// Extend the base object
|
|
49
|
-
for (name in options) {
|
|
50
|
-
if (name === '__proto__') continue;
|
|
51
|
-
|
|
52
|
-
src = target[name];
|
|
53
|
-
copy = options[name];
|
|
54
|
-
|
|
55
|
-
// Prevent never-ending loop
|
|
56
|
-
if (target === copy) continue;
|
|
57
|
-
|
|
58
|
-
// Recurse if we're merging plain objects
|
|
59
|
-
if (deep && copy && isPlainObject(copy)) {
|
|
60
|
-
clone = src && isPlainObject(src) ? src : {};
|
|
61
|
-
// Never move original objects, clone them
|
|
62
|
-
target[name] = extend(deep, clone, copy);
|
|
63
|
-
|
|
64
|
-
// Don't bring in undefined values
|
|
65
|
-
} else if (typeof copy !== 'undefined') {
|
|
66
|
-
target[name] = copy;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Return the modified object
|
|
72
|
-
return target;
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
module.exports = {
|
|
76
|
-
extend,
|
|
77
|
-
isPlainObject,
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const hasOwn = Object.prototype.hasOwnProperty;
|
|
4
|
+
const toStr = Object.prototype.toString;
|
|
5
|
+
|
|
6
|
+
function isPlainObject(obj) {
|
|
7
|
+
if (!obj || toStr.call(obj) !== '[object Object]') {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
var hasOwnConstructor = hasOwn.call(obj, 'constructor');
|
|
12
|
+
var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf');
|
|
13
|
+
// Not own constructor property must be Object
|
|
14
|
+
if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Own properties are enumerated firstly, so to speed up,
|
|
19
|
+
// if last one is own, then all properties are own.
|
|
20
|
+
var key;
|
|
21
|
+
for (key in obj) { /**/ }
|
|
22
|
+
|
|
23
|
+
return typeof key === 'undefined' || hasOwn.call(obj, key);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
function extend() {
|
|
27
|
+
var options, name, src, copy, clone;
|
|
28
|
+
var target = arguments[0];
|
|
29
|
+
var i = 1;
|
|
30
|
+
var length = arguments.length;
|
|
31
|
+
var deep = false;
|
|
32
|
+
|
|
33
|
+
// Handle a deep copy situation
|
|
34
|
+
if (typeof target === 'boolean') {
|
|
35
|
+
deep = target;
|
|
36
|
+
target = arguments[1] || {};
|
|
37
|
+
// skip the boolean and the target
|
|
38
|
+
i = 2;
|
|
39
|
+
} else if ((typeof target !== 'object' && typeof target !== 'function') || target == null) {
|
|
40
|
+
target = {};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
for (; i < length; ++i) {
|
|
44
|
+
options = arguments[i];
|
|
45
|
+
// Only deal with non-null/undefined values
|
|
46
|
+
if (options == null) continue;
|
|
47
|
+
|
|
48
|
+
// Extend the base object
|
|
49
|
+
for (name in options) {
|
|
50
|
+
if (name === '__proto__') continue;
|
|
51
|
+
|
|
52
|
+
src = target[name];
|
|
53
|
+
copy = options[name];
|
|
54
|
+
|
|
55
|
+
// Prevent never-ending loop
|
|
56
|
+
if (target === copy) continue;
|
|
57
|
+
|
|
58
|
+
// Recurse if we're merging plain objects
|
|
59
|
+
if (deep && copy && isPlainObject(copy)) {
|
|
60
|
+
clone = src && isPlainObject(src) ? src : {};
|
|
61
|
+
// Never move original objects, clone them
|
|
62
|
+
target[name] = extend(deep, clone, copy);
|
|
63
|
+
|
|
64
|
+
// Don't bring in undefined values
|
|
65
|
+
} else if (typeof copy !== 'undefined') {
|
|
66
|
+
target[name] = copy;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Return the modified object
|
|
72
|
+
return target;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
module.exports = {
|
|
76
|
+
extend,
|
|
77
|
+
isPlainObject,
|
|
78
78
|
};
|
package/lib/pargv.js
CHANGED
|
@@ -1,263 +1,263 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
function hasKey(obj, keys) {
|
|
4
|
-
var o = obj;
|
|
5
|
-
keys.slice(0, -1).forEach(function (key) {
|
|
6
|
-
o = o[key] || {};
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
var key = keys[keys.length - 1];
|
|
10
|
-
return key in o;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
function isNumber(x) {
|
|
14
|
-
if (typeof x === 'number') { return true; }
|
|
15
|
-
if ((/^0x[0-9a-f]+$/i).test(x)) { return true; }
|
|
16
|
-
return (/^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/).test(x);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
function isConstructorOrProto(obj, key) {
|
|
20
|
-
return (key === 'constructor' && typeof obj[key] === 'function') || key === '__proto__';
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
module.exports = function (args, opts) {
|
|
24
|
-
if (!opts) { opts = {}; }
|
|
25
|
-
|
|
26
|
-
var flags = {
|
|
27
|
-
bools: {},
|
|
28
|
-
strings: {},
|
|
29
|
-
unknownFn: null,
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
if (typeof opts.unknown === 'function') {
|
|
33
|
-
flags.unknownFn = opts.unknown;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (typeof opts.boolean === 'boolean' && opts.boolean) {
|
|
37
|
-
flags.allBools = true;
|
|
38
|
-
} else {
|
|
39
|
-
[].concat(opts.boolean).filter(Boolean).forEach(function (key) {
|
|
40
|
-
flags.bools[key] = true;
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
var aliases = {};
|
|
45
|
-
|
|
46
|
-
function aliasIsBoolean(key) {
|
|
47
|
-
return aliases[key].some(function (x) {
|
|
48
|
-
return flags.bools[x];
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
Object.keys(opts.alias || {}).forEach(function (key) {
|
|
53
|
-
aliases[key] = [].concat(opts.alias[key]);
|
|
54
|
-
aliases[key].forEach(function (x) {
|
|
55
|
-
aliases[x] = [key].concat(aliases[key].filter(function (y) {
|
|
56
|
-
return x !== y;
|
|
57
|
-
}));
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
[].concat(opts.string).filter(Boolean).forEach(function (key) {
|
|
62
|
-
flags.strings[key] = true;
|
|
63
|
-
if (aliases[key]) {
|
|
64
|
-
[].concat(aliases[key]).forEach(function (k) {
|
|
65
|
-
flags.strings[k] = true;
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
var defaults = opts.default || {};
|
|
71
|
-
|
|
72
|
-
var argv = { _: [] };
|
|
73
|
-
|
|
74
|
-
function argDefined(key, arg) {
|
|
75
|
-
return (flags.allBools && (/^--[^=]+$/).test(arg))
|
|
76
|
-
|| flags.strings[key]
|
|
77
|
-
|| flags.bools[key]
|
|
78
|
-
|| aliases[key];
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
function setKey(obj, keys, value) {
|
|
82
|
-
var o = obj;
|
|
83
|
-
for (var i = 0; i < keys.length - 1; i++) {
|
|
84
|
-
var key = keys[i];
|
|
85
|
-
if (isConstructorOrProto(o, key)) { return; }
|
|
86
|
-
if (o[key] === undefined) { o[key] = {}; }
|
|
87
|
-
if (
|
|
88
|
-
o[key] === Object.prototype
|
|
89
|
-
|| o[key] === Number.prototype
|
|
90
|
-
|| o[key] === String.prototype
|
|
91
|
-
) {
|
|
92
|
-
o[key] = {};
|
|
93
|
-
}
|
|
94
|
-
if (o[key] === Array.prototype) { o[key] = []; }
|
|
95
|
-
o = o[key];
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
var lastKey = keys[keys.length - 1];
|
|
99
|
-
if (isConstructorOrProto(o, lastKey)) { return; }
|
|
100
|
-
if (
|
|
101
|
-
o === Object.prototype
|
|
102
|
-
|| o === Number.prototype
|
|
103
|
-
|| o === String.prototype
|
|
104
|
-
) {
|
|
105
|
-
o = {};
|
|
106
|
-
}
|
|
107
|
-
if (o === Array.prototype) { o = []; }
|
|
108
|
-
if (o[lastKey] === undefined || flags.bools[lastKey] || typeof o[lastKey] === 'boolean') {
|
|
109
|
-
o[lastKey] = value;
|
|
110
|
-
} else if (Array.isArray(o[lastKey])) {
|
|
111
|
-
o[lastKey].push(value);
|
|
112
|
-
} else {
|
|
113
|
-
o[lastKey] = [o[lastKey], value];
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
function setArg(key, val, arg) {
|
|
118
|
-
if (arg && flags.unknownFn && !argDefined(key, arg)) {
|
|
119
|
-
if (flags.unknownFn(arg) === false) { return; }
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
var value = !flags.strings[key] && isNumber(val)
|
|
123
|
-
? Number(val)
|
|
124
|
-
: val;
|
|
125
|
-
setKey(argv, key.split('.'), value);
|
|
126
|
-
|
|
127
|
-
(aliases[key] || []).forEach(function (x) {
|
|
128
|
-
setKey(argv, x.split('.'), value);
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
Object.keys(flags.bools).forEach(function (key) {
|
|
133
|
-
setArg(key, defaults[key] === undefined ? false : defaults[key]);
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
var notFlags = [];
|
|
137
|
-
|
|
138
|
-
if (args.indexOf('--') !== -1) {
|
|
139
|
-
notFlags = args.slice(args.indexOf('--') + 1);
|
|
140
|
-
args = args.slice(0, args.indexOf('--'));
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
for (var i = 0; i < args.length; i++) {
|
|
144
|
-
var arg = args[i];
|
|
145
|
-
var key;
|
|
146
|
-
var next;
|
|
147
|
-
|
|
148
|
-
if ((/^--.+=/).test(arg)) {
|
|
149
|
-
// Using [\s\S] instead of . because js doesn't support the
|
|
150
|
-
// 'dotall' regex modifier. See:
|
|
151
|
-
// http://stackoverflow.com/a/1068308/13216
|
|
152
|
-
var m = arg.match(/^--([^=]+)=([\s\S]*)$/);
|
|
153
|
-
key = m[1];
|
|
154
|
-
var value = m[2];
|
|
155
|
-
if (flags.bools[key]) {
|
|
156
|
-
value = value !== 'false';
|
|
157
|
-
}
|
|
158
|
-
setArg(key, value, arg);
|
|
159
|
-
} else if ((/^--no-.+/).test(arg)) {
|
|
160
|
-
key = arg.match(/^--no-(.+)/)[1];
|
|
161
|
-
setArg(key, false, arg);
|
|
162
|
-
} else if ((/^--.+/).test(arg)) {
|
|
163
|
-
key = arg.match(/^--(.+)/)[1];
|
|
164
|
-
next = args[i + 1];
|
|
165
|
-
if (
|
|
166
|
-
next !== undefined
|
|
167
|
-
&& !(/^(-|--)[^-]/).test(next)
|
|
168
|
-
&& !flags.bools[key]
|
|
169
|
-
&& !flags.allBools
|
|
170
|
-
&& (aliases[key] ? !aliasIsBoolean(key) : true)
|
|
171
|
-
) {
|
|
172
|
-
setArg(key, next, arg);
|
|
173
|
-
i += 1;
|
|
174
|
-
} else if ((/^(true|false)$/).test(next)) {
|
|
175
|
-
setArg(key, next === 'true', arg);
|
|
176
|
-
i += 1;
|
|
177
|
-
} else {
|
|
178
|
-
setArg(key, flags.strings[key] ? '' : true, arg);
|
|
179
|
-
}
|
|
180
|
-
} else if ((/^-[^-]+/).test(arg)) {
|
|
181
|
-
var letters = arg.slice(1, -1).split('');
|
|
182
|
-
|
|
183
|
-
var broken = false;
|
|
184
|
-
for (var j = 0; j < letters.length; j++) {
|
|
185
|
-
next = arg.slice(j + 2);
|
|
186
|
-
|
|
187
|
-
if (next === '-') {
|
|
188
|
-
setArg(letters[j], next, arg);
|
|
189
|
-
continue;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
if ((/[A-Za-z]/).test(letters[j]) && next[0] === '=') {
|
|
193
|
-
setArg(letters[j], next.slice(1), arg);
|
|
194
|
-
broken = true;
|
|
195
|
-
break;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
if (
|
|
199
|
-
(/[A-Za-z]/).test(letters[j])
|
|
200
|
-
&& (/-?\d+(\.\d*)?(e-?\d+)?$/).test(next)
|
|
201
|
-
) {
|
|
202
|
-
setArg(letters[j], next, arg);
|
|
203
|
-
broken = true;
|
|
204
|
-
break;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
if (letters[j + 1] && letters[j + 1].match(/\W/)) {
|
|
208
|
-
setArg(letters[j], arg.slice(j + 2), arg);
|
|
209
|
-
broken = true;
|
|
210
|
-
break;
|
|
211
|
-
} else {
|
|
212
|
-
setArg(letters[j], flags.strings[letters[j]] ? '' : true, arg);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
key = arg.slice(-1)[0];
|
|
217
|
-
if (!broken && key !== '-') {
|
|
218
|
-
if (
|
|
219
|
-
args[i + 1]
|
|
220
|
-
&& !(/^(-|--)[^-]/).test(args[i + 1])
|
|
221
|
-
&& !flags.bools[key]
|
|
222
|
-
&& (aliases[key] ? !aliasIsBoolean(key) : true)
|
|
223
|
-
) {
|
|
224
|
-
setArg(key, args[i + 1], arg);
|
|
225
|
-
i += 1;
|
|
226
|
-
} else if (args[i + 1] && (/^(true|false)$/).test(args[i + 1])) {
|
|
227
|
-
setArg(key, args[i + 1] === 'true', arg);
|
|
228
|
-
i += 1;
|
|
229
|
-
} else {
|
|
230
|
-
setArg(key, flags.strings[key] ? '' : true, arg);
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
} else {
|
|
234
|
-
if (!flags.unknownFn || flags.unknownFn(arg) !== false) {
|
|
235
|
-
argv._.push(flags.strings._ || !isNumber(arg) ? arg : Number(arg));
|
|
236
|
-
}
|
|
237
|
-
if (opts.stopEarly) {
|
|
238
|
-
argv._.push.apply(argv._, args.slice(i + 1));
|
|
239
|
-
break;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
Object.keys(defaults).forEach(function (k) {
|
|
245
|
-
if (!hasKey(argv, k.split('.'))) {
|
|
246
|
-
setKey(argv, k.split('.'), defaults[k]);
|
|
247
|
-
|
|
248
|
-
(aliases[k] || []).forEach(function (x) {
|
|
249
|
-
setKey(argv, x.split('.'), defaults[k]);
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
if (opts['--']) {
|
|
255
|
-
argv['--'] = notFlags.slice();
|
|
256
|
-
} else {
|
|
257
|
-
notFlags.forEach(function (k) {
|
|
258
|
-
argv._.push(k);
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
return argv;
|
|
263
|
-
};
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function hasKey(obj, keys) {
|
|
4
|
+
var o = obj;
|
|
5
|
+
keys.slice(0, -1).forEach(function (key) {
|
|
6
|
+
o = o[key] || {};
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
var key = keys[keys.length - 1];
|
|
10
|
+
return key in o;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function isNumber(x) {
|
|
14
|
+
if (typeof x === 'number') { return true; }
|
|
15
|
+
if ((/^0x[0-9a-f]+$/i).test(x)) { return true; }
|
|
16
|
+
return (/^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/).test(x);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function isConstructorOrProto(obj, key) {
|
|
20
|
+
return (key === 'constructor' && typeof obj[key] === 'function') || key === '__proto__';
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
module.exports = function (args, opts) {
|
|
24
|
+
if (!opts) { opts = {}; }
|
|
25
|
+
|
|
26
|
+
var flags = {
|
|
27
|
+
bools: {},
|
|
28
|
+
strings: {},
|
|
29
|
+
unknownFn: null,
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
if (typeof opts.unknown === 'function') {
|
|
33
|
+
flags.unknownFn = opts.unknown;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (typeof opts.boolean === 'boolean' && opts.boolean) {
|
|
37
|
+
flags.allBools = true;
|
|
38
|
+
} else {
|
|
39
|
+
[].concat(opts.boolean).filter(Boolean).forEach(function (key) {
|
|
40
|
+
flags.bools[key] = true;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
var aliases = {};
|
|
45
|
+
|
|
46
|
+
function aliasIsBoolean(key) {
|
|
47
|
+
return aliases[key].some(function (x) {
|
|
48
|
+
return flags.bools[x];
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
Object.keys(opts.alias || {}).forEach(function (key) {
|
|
53
|
+
aliases[key] = [].concat(opts.alias[key]);
|
|
54
|
+
aliases[key].forEach(function (x) {
|
|
55
|
+
aliases[x] = [key].concat(aliases[key].filter(function (y) {
|
|
56
|
+
return x !== y;
|
|
57
|
+
}));
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
[].concat(opts.string).filter(Boolean).forEach(function (key) {
|
|
62
|
+
flags.strings[key] = true;
|
|
63
|
+
if (aliases[key]) {
|
|
64
|
+
[].concat(aliases[key]).forEach(function (k) {
|
|
65
|
+
flags.strings[k] = true;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
var defaults = opts.default || {};
|
|
71
|
+
|
|
72
|
+
var argv = { _: [] };
|
|
73
|
+
|
|
74
|
+
function argDefined(key, arg) {
|
|
75
|
+
return (flags.allBools && (/^--[^=]+$/).test(arg))
|
|
76
|
+
|| flags.strings[key]
|
|
77
|
+
|| flags.bools[key]
|
|
78
|
+
|| aliases[key];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function setKey(obj, keys, value) {
|
|
82
|
+
var o = obj;
|
|
83
|
+
for (var i = 0; i < keys.length - 1; i++) {
|
|
84
|
+
var key = keys[i];
|
|
85
|
+
if (isConstructorOrProto(o, key)) { return; }
|
|
86
|
+
if (o[key] === undefined) { o[key] = {}; }
|
|
87
|
+
if (
|
|
88
|
+
o[key] === Object.prototype
|
|
89
|
+
|| o[key] === Number.prototype
|
|
90
|
+
|| o[key] === String.prototype
|
|
91
|
+
) {
|
|
92
|
+
o[key] = {};
|
|
93
|
+
}
|
|
94
|
+
if (o[key] === Array.prototype) { o[key] = []; }
|
|
95
|
+
o = o[key];
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
var lastKey = keys[keys.length - 1];
|
|
99
|
+
if (isConstructorOrProto(o, lastKey)) { return; }
|
|
100
|
+
if (
|
|
101
|
+
o === Object.prototype
|
|
102
|
+
|| o === Number.prototype
|
|
103
|
+
|| o === String.prototype
|
|
104
|
+
) {
|
|
105
|
+
o = {};
|
|
106
|
+
}
|
|
107
|
+
if (o === Array.prototype) { o = []; }
|
|
108
|
+
if (o[lastKey] === undefined || flags.bools[lastKey] || typeof o[lastKey] === 'boolean') {
|
|
109
|
+
o[lastKey] = value;
|
|
110
|
+
} else if (Array.isArray(o[lastKey])) {
|
|
111
|
+
o[lastKey].push(value);
|
|
112
|
+
} else {
|
|
113
|
+
o[lastKey] = [o[lastKey], value];
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function setArg(key, val, arg) {
|
|
118
|
+
if (arg && flags.unknownFn && !argDefined(key, arg)) {
|
|
119
|
+
if (flags.unknownFn(arg) === false) { return; }
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
var value = !flags.strings[key] && isNumber(val)
|
|
123
|
+
? Number(val)
|
|
124
|
+
: val;
|
|
125
|
+
setKey(argv, key.split('.'), value);
|
|
126
|
+
|
|
127
|
+
(aliases[key] || []).forEach(function (x) {
|
|
128
|
+
setKey(argv, x.split('.'), value);
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
Object.keys(flags.bools).forEach(function (key) {
|
|
133
|
+
setArg(key, defaults[key] === undefined ? false : defaults[key]);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
var notFlags = [];
|
|
137
|
+
|
|
138
|
+
if (args.indexOf('--') !== -1) {
|
|
139
|
+
notFlags = args.slice(args.indexOf('--') + 1);
|
|
140
|
+
args = args.slice(0, args.indexOf('--'));
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
for (var i = 0; i < args.length; i++) {
|
|
144
|
+
var arg = args[i];
|
|
145
|
+
var key;
|
|
146
|
+
var next;
|
|
147
|
+
|
|
148
|
+
if ((/^--.+=/).test(arg)) {
|
|
149
|
+
// Using [\s\S] instead of . because js doesn't support the
|
|
150
|
+
// 'dotall' regex modifier. See:
|
|
151
|
+
// http://stackoverflow.com/a/1068308/13216
|
|
152
|
+
var m = arg.match(/^--([^=]+)=([\s\S]*)$/);
|
|
153
|
+
key = m[1];
|
|
154
|
+
var value = m[2];
|
|
155
|
+
if (flags.bools[key]) {
|
|
156
|
+
value = value !== 'false';
|
|
157
|
+
}
|
|
158
|
+
setArg(key, value, arg);
|
|
159
|
+
} else if ((/^--no-.+/).test(arg)) {
|
|
160
|
+
key = arg.match(/^--no-(.+)/)[1];
|
|
161
|
+
setArg(key, false, arg);
|
|
162
|
+
} else if ((/^--.+/).test(arg)) {
|
|
163
|
+
key = arg.match(/^--(.+)/)[1];
|
|
164
|
+
next = args[i + 1];
|
|
165
|
+
if (
|
|
166
|
+
next !== undefined
|
|
167
|
+
&& !(/^(-|--)[^-]/).test(next)
|
|
168
|
+
&& !flags.bools[key]
|
|
169
|
+
&& !flags.allBools
|
|
170
|
+
&& (aliases[key] ? !aliasIsBoolean(key) : true)
|
|
171
|
+
) {
|
|
172
|
+
setArg(key, next, arg);
|
|
173
|
+
i += 1;
|
|
174
|
+
} else if ((/^(true|false)$/).test(next)) {
|
|
175
|
+
setArg(key, next === 'true', arg);
|
|
176
|
+
i += 1;
|
|
177
|
+
} else {
|
|
178
|
+
setArg(key, flags.strings[key] ? '' : true, arg);
|
|
179
|
+
}
|
|
180
|
+
} else if ((/^-[^-]+/).test(arg)) {
|
|
181
|
+
var letters = arg.slice(1, -1).split('');
|
|
182
|
+
|
|
183
|
+
var broken = false;
|
|
184
|
+
for (var j = 0; j < letters.length; j++) {
|
|
185
|
+
next = arg.slice(j + 2);
|
|
186
|
+
|
|
187
|
+
if (next === '-') {
|
|
188
|
+
setArg(letters[j], next, arg);
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if ((/[A-Za-z]/).test(letters[j]) && next[0] === '=') {
|
|
193
|
+
setArg(letters[j], next.slice(1), arg);
|
|
194
|
+
broken = true;
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if (
|
|
199
|
+
(/[A-Za-z]/).test(letters[j])
|
|
200
|
+
&& (/-?\d+(\.\d*)?(e-?\d+)?$/).test(next)
|
|
201
|
+
) {
|
|
202
|
+
setArg(letters[j], next, arg);
|
|
203
|
+
broken = true;
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
if (letters[j + 1] && letters[j + 1].match(/\W/)) {
|
|
208
|
+
setArg(letters[j], arg.slice(j + 2), arg);
|
|
209
|
+
broken = true;
|
|
210
|
+
break;
|
|
211
|
+
} else {
|
|
212
|
+
setArg(letters[j], flags.strings[letters[j]] ? '' : true, arg);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
key = arg.slice(-1)[0];
|
|
217
|
+
if (!broken && key !== '-') {
|
|
218
|
+
if (
|
|
219
|
+
args[i + 1]
|
|
220
|
+
&& !(/^(-|--)[^-]/).test(args[i + 1])
|
|
221
|
+
&& !flags.bools[key]
|
|
222
|
+
&& (aliases[key] ? !aliasIsBoolean(key) : true)
|
|
223
|
+
) {
|
|
224
|
+
setArg(key, args[i + 1], arg);
|
|
225
|
+
i += 1;
|
|
226
|
+
} else if (args[i + 1] && (/^(true|false)$/).test(args[i + 1])) {
|
|
227
|
+
setArg(key, args[i + 1] === 'true', arg);
|
|
228
|
+
i += 1;
|
|
229
|
+
} else {
|
|
230
|
+
setArg(key, flags.strings[key] ? '' : true, arg);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
} else {
|
|
234
|
+
if (!flags.unknownFn || flags.unknownFn(arg) !== false) {
|
|
235
|
+
argv._.push(flags.strings._ || !isNumber(arg) ? arg : Number(arg));
|
|
236
|
+
}
|
|
237
|
+
if (opts.stopEarly) {
|
|
238
|
+
argv._.push.apply(argv._, args.slice(i + 1));
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
Object.keys(defaults).forEach(function (k) {
|
|
245
|
+
if (!hasKey(argv, k.split('.'))) {
|
|
246
|
+
setKey(argv, k.split('.'), defaults[k]);
|
|
247
|
+
|
|
248
|
+
(aliases[k] || []).forEach(function (x) {
|
|
249
|
+
setKey(argv, x.split('.'), defaults[k]);
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
if (opts['--']) {
|
|
255
|
+
argv['--'] = notFlags.slice();
|
|
256
|
+
} else {
|
|
257
|
+
notFlags.forEach(function (k) {
|
|
258
|
+
argv._.push(k);
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
return argv;
|
|
263
|
+
};
|