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 ( ( / ^ 0 x [ 0 - 9 a - 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
+
1
23
module . exports = function ( args , opts ) {
2
- if ( ! opts ) opts = { } ;
24
+ if ( ! opts ) { opts = { } ; }
3
25
4
- var flags = { bools : { } , strings : { } , unknownFn : null } ;
26
+ var flags = {
27
+ bools : { } ,
28
+ strings : { } ,
29
+ unknownFn : null ,
30
+ } ;
5
31
6
- if ( typeof opts [ ' unknown' ] === 'function' ) {
7
- flags . unknownFn = opts [ ' unknown' ] ;
32
+ if ( typeof opts . unknown === 'function' ) {
33
+ flags . unknownFn = opts . unknown ;
8
34
}
9
35
10
- if ( typeof opts [ ' boolean' ] === 'boolean' && opts [ ' boolean' ] ) {
36
+ if ( typeof opts . boolean === 'boolean' && opts . boolean ) {
11
37
flags . allBools = true ;
12
38
} else {
13
- [ ] . concat ( opts [ ' boolean' ] ) . filter ( Boolean ) . forEach ( function ( key ) {
39
+ [ ] . concat ( opts . boolean ) . filter ( Boolean ) . forEach ( function ( key ) {
14
40
flags . bools [ key ] = true ;
15
41
} ) ;
16
42
}
17
43
18
44
var aliases = { } ;
45
+
46
+ function aliasIsBoolean ( key ) {
47
+ return aliases [ key ] . some ( function ( x ) {
48
+ return flags . bools [ x ] ;
49
+ } ) ;
50
+ }
51
+
19
52
Object . keys ( opts . alias || { } ) . forEach ( function ( key ) {
20
53
aliases [ key ] = [ ] . concat ( opts . alias [ key ] ) ;
21
54
aliases [ key ] . forEach ( function ( x ) {
@@ -32,138 +65,137 @@ module.exports = function (args, opts) {
32
65
}
33
66
} ) ;
34
67
35
- var defaults = opts [ ' default' ] || { } ;
68
+ var defaults = opts . default || { } ;
36
69
37
70
var argv = { _ : [ ] } ;
38
- Object . keys ( flags . bools ) . forEach ( function ( key ) {
39
- setArg ( key , defaults [ key ] === undefined ? false : defaults [ key ] ) ;
40
- } ) ;
41
-
42
- var notFlags = [ ] ;
43
-
44
- if ( args . indexOf ( '--' ) !== - 1 ) {
45
- notFlags = args . slice ( args . indexOf ( '--' ) + 1 ) ;
46
- args = args . slice ( 0 , args . indexOf ( '--' ) ) ;
47
- }
48
71
49
72
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
-
59
- var value = ! flags . strings [ key ] && isNumber ( val )
60
- ? Number ( val )
61
- : val ;
62
- setKey ( argv , key . split ( '.' ) , value ) ;
63
-
64
- ( aliases [ key ] || [ ] ) . forEach ( function ( x ) {
65
- setKey ( argv , x . split ( '.' ) , value ) ;
66
- } ) ;
73
+ return ( flags . allBools && ( / ^ - - [ ^ = ] + $ / ) . test ( arg ) )
74
+ || flags . strings [ key ]
75
+ || flags . bools [ key ]
76
+ || aliases [ key ] ;
67
77
}
68
78
69
79
function setKey ( obj , keys , value ) {
70
80
var o = obj ;
71
81
for ( var i = 0 ; i < keys . length - 1 ; i ++ ) {
72
82
var key = keys [ i ] ;
73
- if ( isConstructorOrProto ( o , key ) ) return ;
74
- if ( o [ key ] === undefined ) o [ key ] = { } ;
83
+ if ( isConstructorOrProto ( o , key ) ) { return ; }
84
+ if ( o [ key ] === undefined ) { o [ key ] = { } ; }
75
85
if (
76
86
o [ key ] === Object . prototype
77
87
|| o [ key ] === Number . prototype
78
88
|| o [ key ] === String . prototype
79
89
) {
80
90
o [ key ] = { } ;
81
91
}
82
- if ( o [ key ] === Array . prototype ) o [ key ] = [ ] ;
92
+ if ( o [ key ] === Array . prototype ) { o [ key ] = [ ] ; }
83
93
o = o [ key ] ;
84
94
}
85
95
86
- var key = keys [ keys . length - 1 ] ;
87
- if ( isConstructorOrProto ( o , key ) ) return ;
96
+ var lastKey = keys [ keys . length - 1 ] ;
97
+ if ( isConstructorOrProto ( o , lastKey ) ) { return ; }
88
98
if (
89
99
o === Object . prototype
90
100
|| o === Number . prototype
91
101
|| o === String . prototype
92
102
) {
93
103
o = { } ;
94
104
}
95
- if ( o === Array . prototype ) o = [ ] ;
96
- if ( o [ key ] === undefined || flags . bools [ key ] || typeof o [ key ] === 'boolean' ) {
97
- o [ key ] = value ;
98
- } else if ( Array . isArray ( o [ key ] ) ) {
99
- o [ key ] . push ( value ) ;
105
+ if ( o === Array . prototype ) { o = [ ] ; }
106
+ if ( o [ lastKey ] === undefined || flags . bools [ lastKey ] || typeof o [ lastKey ] === 'boolean' ) {
107
+ o [ lastKey ] = value ;
108
+ } else if ( Array . isArray ( o [ lastKey ] ) ) {
109
+ o [ lastKey ] . push ( value ) ;
100
110
} else {
101
- o [ key ] = [ o [ key ] , value ] ;
111
+ o [ lastKey ] = [ o [ lastKey ] , value ] ;
102
112
}
103
113
}
104
114
105
- function aliasIsBoolean ( key ) {
106
- return aliases [ key ] . some ( function ( x ) {
107
- return flags . bools [ x ] ;
115
+ function setArg ( key , val , arg ) {
116
+ if ( arg && flags . unknownFn && ! argDefined ( key , arg ) ) {
117
+ if ( flags . unknownFn ( arg ) === false ) { return ; }
118
+ }
119
+
120
+ var value = ! flags . strings [ key ] && isNumber ( val )
121
+ ? Number ( val )
122
+ : val ;
123
+ setKey ( argv , key . split ( '.' ) , value ) ;
124
+
125
+ ( aliases [ key ] || [ ] ) . forEach ( function ( x ) {
126
+ setKey ( argv , x . split ( '.' ) , value ) ;
108
127
} ) ;
109
128
}
110
129
130
+ Object . keys ( flags . bools ) . forEach ( function ( key ) {
131
+ setArg ( key , defaults [ key ] === undefined ? false : defaults [ key ] ) ;
132
+ } ) ;
133
+
134
+ var notFlags = [ ] ;
135
+
136
+ if ( args . indexOf ( '--' ) !== - 1 ) {
137
+ notFlags = args . slice ( args . indexOf ( '--' ) + 1 ) ;
138
+ args = args . slice ( 0 , args . indexOf ( '--' ) ) ;
139
+ }
140
+
111
141
for ( var i = 0 ; i < args . length ; i ++ ) {
112
142
var arg = args [ i ] ;
143
+ var key ;
144
+ var next ;
113
145
114
- if ( / ^ - - .+ = / . test ( arg ) ) {
146
+ if ( ( / ^ - - .+ = / ) . test ( arg ) ) {
115
147
// Using [\s\S] instead of . because js doesn't support the
116
148
// 'dotall' regex modifier. See:
117
149
// http://stackoverflow.com/a/1068308/13216
118
150
var m = arg . match ( / ^ - - ( [ ^ = ] + ) = ( [ \s \S ] * ) $ / ) ;
119
- var key = m [ 1 ] ;
151
+ key = m [ 1 ] ;
120
152
var value = m [ 2 ] ;
121
153
if ( flags . bools [ key ] ) {
122
154
value = value !== 'false' ;
123
155
}
124
156
setArg ( key , value , arg ) ;
125
- } else if ( / ^ - - n o - .+ / . test ( arg ) ) {
126
- var key = arg . match ( / ^ - - n o - ( .+ ) / ) [ 1 ] ;
157
+ } else if ( ( / ^ - - n o - .+ / ) . test ( arg ) ) {
158
+ key = arg . match ( / ^ - - n o - ( .+ ) / ) [ 1 ] ;
127
159
setArg ( key , false , arg ) ;
128
- } else if ( / ^ - - .+ / . test ( arg ) ) {
129
- var key = arg . match ( / ^ - - ( .+ ) / ) [ 1 ] ;
130
- var next = args [ i + 1 ] ;
160
+ } else if ( ( / ^ - - .+ / ) . test ( arg ) ) {
161
+ key = arg . match ( / ^ - - ( .+ ) / ) [ 1 ] ;
162
+ next = args [ i + 1 ] ;
131
163
if (
132
164
next !== undefined
133
- && ! / ^ - / . test ( next )
165
+ && ! ( / ^ - / ) . test ( next )
134
166
&& ! flags . bools [ key ]
135
167
&& ! flags . allBools
136
168
&& ( aliases [ key ] ? ! aliasIsBoolean ( key ) : true )
137
169
) {
138
170
setArg ( key , next , arg ) ;
139
- i ++ ;
140
- } else if ( / ^ ( t r u e | f a l s e ) $ / . test ( next ) ) {
171
+ i += 1 ;
172
+ } else if ( ( / ^ ( t r u e | f a l s e ) $ / ) . test ( next ) ) {
141
173
setArg ( key , next === 'true' , arg ) ;
142
- i ++ ;
174
+ i += 1 ;
143
175
} else {
144
176
setArg ( key , flags . strings [ key ] ? '' : true , arg ) ;
145
177
}
146
- } else if ( / ^ - [ ^ - ] + / . test ( arg ) ) {
178
+ } else if ( ( / ^ - [ ^ - ] + / ) . test ( arg ) ) {
147
179
var letters = arg . slice ( 1 , - 1 ) . split ( '' ) ;
148
180
149
181
var broken = false ;
150
182
for ( var j = 0 ; j < letters . length ; j ++ ) {
151
- var next = arg . slice ( j + 2 ) ;
183
+ next = arg . slice ( j + 2 ) ;
152
184
153
185
if ( next === '-' ) {
154
- setArg ( letters [ j ] , next , arg )
186
+ setArg ( letters [ j ] , next , arg ) ;
155
187
continue ;
156
188
}
157
189
158
- if ( / [ A - Z a - z ] / . test ( letters [ j ] ) && / = / . test ( next ) ) {
190
+ if ( ( / [ A - Z a - z ] / ) . test ( letters [ j ] ) && ( / [ = ] / ) . test ( next ) ) {
159
191
setArg ( letters [ j ] , next . split ( '=' ) [ 1 ] , arg ) ;
160
192
broken = true ;
161
193
break ;
162
194
}
163
195
164
196
if (
165
- / [ A - Z a - z ] / . test ( letters [ j ] )
166
- && / - ? \d + ( \. \d * ) ? ( e - ? \d + ) ? $ / . test ( next )
197
+ ( / [ A - Z a - z ] / ) . test ( letters [ j ] )
198
+ && ( / - ? \d + ( \. \d * ) ? ( e - ? \d + ) ? $ / ) . test ( next )
167
199
) {
168
200
setArg ( letters [ j ] , next , arg ) ;
169
201
broken = true ;
@@ -179,26 +211,26 @@ module.exports = function (args, opts) {
179
211
}
180
212
}
181
213
182
- var key = arg . slice ( - 1 ) [ 0 ] ;
214
+ key = arg . slice ( - 1 ) [ 0 ] ;
183
215
if ( ! broken && key !== '-' ) {
184
216
if (
185
217
args [ i + 1 ]
186
- && ! / ^ ( - | - - ) [ ^ - ] / . test ( args [ i + 1 ] )
218
+ && ! ( / ^ ( - | - - ) [ ^ - ] / ) . test ( args [ i + 1 ] )
187
219
&& ! flags . bools [ key ]
188
220
&& ( aliases [ key ] ? ! aliasIsBoolean ( key ) : true )
189
221
) {
190
222
setArg ( key , args [ i + 1 ] , arg ) ;
191
- i ++ ;
192
- } else if ( args [ i + 1 ] && / ^ ( t r u e | f a l s e ) $ / . test ( args [ i + 1 ] ) ) {
223
+ i += 1 ;
224
+ } else if ( args [ i + 1 ] && ( / ^ ( t r u e | f a l s e ) $ / ) . test ( args [ i + 1 ] ) ) {
193
225
setArg ( key , args [ i + 1 ] === 'true' , arg ) ;
194
- i ++ ;
226
+ i += 1 ;
195
227
} else {
196
228
setArg ( key , flags . strings [ key ] ? '' : true , arg ) ;
197
229
}
198
230
}
199
231
} else {
200
232
if ( ! flags . unknownFn || flags . unknownFn ( arg ) !== false ) {
201
- argv . _ . push ( flags . strings [ '_' ] || ! isNumber ( arg ) ? arg : Number ( arg ) ) ;
233
+ argv . _ . push ( flags . strings . _ || ! isNumber ( arg ) ? arg : Number ( arg ) ) ;
202
234
}
203
235
if ( opts . stopEarly ) {
204
236
argv . _ . push . apply ( argv . _ , args . slice ( i + 1 ) ) ;
@@ -207,46 +239,23 @@ module.exports = function (args, opts) {
207
239
}
208
240
}
209
241
210
- Object . keys ( defaults ) . forEach ( function ( key ) {
211
- if ( ! hasKey ( argv , key . split ( '.' ) ) ) {
212
- setKey ( argv , key . split ( '.' ) , defaults [ key ] ) ;
242
+ Object . keys ( defaults ) . forEach ( function ( k ) {
243
+ if ( ! hasKey ( argv , k . split ( '.' ) ) ) {
244
+ setKey ( argv , k . split ( '.' ) , defaults [ k ] ) ;
213
245
214
- ( aliases [ key ] || [ ] ) . forEach ( function ( x ) {
215
- setKey ( argv , x . split ( '.' ) , defaults [ key ] ) ;
246
+ ( aliases [ k ] || [ ] ) . forEach ( function ( x ) {
247
+ setKey ( argv , x . split ( '.' ) , defaults [ k ] ) ;
216
248
} ) ;
217
249
}
218
250
} ) ;
219
251
220
252
if ( opts [ '--' ] ) {
221
- argv [ '--' ] = new Array ( ) ;
222
- notFlags . forEach ( function ( key ) {
223
- argv [ '--' ] . push ( key ) ;
224
- } ) ;
253
+ argv [ '--' ] = notFlags . slice ( ) ;
225
254
} else {
226
- notFlags . forEach ( function ( key ) {
227
- argv . _ . push ( key ) ;
255
+ notFlags . forEach ( function ( k ) {
256
+ argv . _ . push ( k ) ;
228
257
} ) ;
229
258
}
230
259
231
260
return argv ;
232
261
} ;
233
-
234
- function hasKey ( obj , keys ) {
235
- var o = obj ;
236
- keys . slice ( 0 , - 1 ) . forEach ( function ( key ) {
237
- o = ( o [ key ] || { } ) ;
238
- } ) ;
239
-
240
- var key = keys [ keys . length - 1 ] ;
241
- return key in o ;
242
- }
243
-
244
- function isNumber ( x ) {
245
- if ( typeof x === 'number' ) return true ;
246
- if ( / ^ 0 x [ 0 - 9 a - f ] + $ / i. test ( x ) ) return true ;
247
- return / ^ [ - + ] ? (?: \d + (?: \. \d * ) ? | \. \d + ) ( e [ - + ] ? \d + ) ? $ / . test ( x ) ;
248
- }
249
-
250
- function isConstructorOrProto ( obj , key ) {
251
- return key === 'constructor' && typeof obj [ key ] === 'function' || key === '__proto__' ;
252
- }
0 commit comments