1
1
'use strict'
2
+ const argsert = require ( './argsert' )
2
3
const objFilter = require ( './obj-filter' )
3
4
const specialKeys = [ '$0' , '--' , '_' ]
4
5
@@ -228,13 +229,22 @@ module.exports = function validation (yargs, usage, y18n) {
228
229
// check implications, argument foo implies => argument bar.
229
230
let implied = { }
230
231
self . implies = function implies ( key , value ) {
232
+ argsert ( '<string|object> [array|number|string]' , [ key , value ] , arguments . length )
233
+
231
234
if ( typeof key === 'object' ) {
232
235
Object . keys ( key ) . forEach ( ( k ) => {
233
236
self . implies ( k , key [ k ] )
234
237
} )
235
238
} else {
236
239
yargs . global ( key )
237
- implied [ key ] = value
240
+ if ( ! implied [ key ] ) {
241
+ implied [ key ] = [ ]
242
+ }
243
+ if ( Array . isArray ( value ) ) {
244
+ value . forEach ( ( i ) => self . implies ( key , i ) )
245
+ } else {
246
+ implied [ key ] . push ( value )
247
+ }
238
248
}
239
249
}
240
250
self . getImplied = function getImplied ( ) {
@@ -245,48 +255,55 @@ module.exports = function validation (yargs, usage, y18n) {
245
255
const implyFail = [ ]
246
256
247
257
Object . keys ( implied ) . forEach ( ( key ) => {
248
- let num
249
- const origKey = key
250
- let value = implied [ key ]
251
-
252
- // convert string '1' to number 1
253
- num = Number ( key )
254
- key = isNaN ( num ) ? key : num
255
-
256
- if ( typeof key === 'number' ) {
257
- // check length of argv._
258
- key = argv . _ . length >= key
259
- } else if ( key . match ( / ^ - - n o - .+ / ) ) {
260
- // check if key doesn't exist
261
- key = key . match ( / ^ - - n o - ( .+ ) / ) [ 1 ]
262
- key = ! argv [ key ]
263
- } else {
264
- // check if key exists
265
- key = argv [ key ]
266
- }
258
+ if ( implied [ key ] ) {
259
+ implied [ key ] . forEach ( ( value ) => {
260
+ let num
261
+ const origKey = key
262
+
263
+ // convert string '1' to number 1
264
+ num = Number ( key )
265
+ key = isNaN ( num ) ? key : num
266
+
267
+ if ( typeof key === 'number' ) {
268
+ // check length of argv._
269
+ key = argv . _ . length >= key
270
+ } else if ( key . match ( / ^ - - n o - .+ / ) ) {
271
+ // check if key doesn't exist
272
+ key = key . match ( / ^ - - n o - ( .+ ) / ) [ 1 ]
273
+ key = ! argv [ key ]
274
+ } else {
275
+ // check if key exists
276
+ key = argv [ key ]
277
+ }
267
278
268
- num = Number ( value )
269
- value = isNaN ( num ) ? value : num
279
+ num = Number ( value )
280
+ value = isNaN ( num ) ? value : num
270
281
271
- if ( typeof value === 'number' ) {
272
- value = argv . _ . length >= value
273
- } else if ( value . match ( / ^ - - n o - .+ / ) ) {
274
- value = value . match ( / ^ - - n o - ( .+ ) / ) [ 1 ]
275
- value = ! argv [ value ]
276
- } else {
277
- value = argv [ value ]
278
- }
282
+ if ( typeof value === 'number' ) {
283
+ value = argv . _ . length >= value
284
+ } else if ( value . match ( / ^ - - n o - .+ / ) ) {
285
+ value = value . match ( / ^ - - n o - ( .+ ) / ) [ 1 ]
286
+ value = ! argv [ value ]
287
+ } else {
288
+ value = argv [ value ]
289
+ }
279
290
280
- if ( key && ! value ) {
281
- implyFail . push ( origKey )
291
+ if ( key && ! value ) {
292
+ implyFail . push ( origKey )
293
+ }
294
+ } )
282
295
}
283
296
} )
284
297
285
298
if ( implyFail . length ) {
286
299
let msg = `${ __ ( 'Implications failed:' ) } \n`
287
300
288
301
implyFail . forEach ( ( key ) => {
289
- msg += ( ` ${ key } -> ${ implied [ key ] } ` )
302
+ if ( implied [ key ] ) {
303
+ implied [ key ] . forEach ( ( value ) => {
304
+ msg += ( ` ${ key } -> ${ value } ` )
305
+ } )
306
+ }
290
307
} )
291
308
292
309
usage . fail ( msg )
@@ -295,24 +312,36 @@ module.exports = function validation (yargs, usage, y18n) {
295
312
296
313
let conflicting = { }
297
314
self . conflicts = function conflicts ( key , value ) {
315
+ argsert ( '<string|object> [array|string]' , [ key , value ] , arguments . length )
316
+
298
317
if ( typeof key === 'object' ) {
299
318
Object . keys ( key ) . forEach ( ( k ) => {
300
319
self . conflicts ( k , key [ k ] )
301
320
} )
302
321
} else {
303
322
yargs . global ( key )
304
- conflicting [ key ] = value
323
+ if ( ! conflicting [ key ] ) {
324
+ conflicting [ key ] = [ ]
325
+ }
326
+ if ( Array . isArray ( value ) ) {
327
+ value . forEach ( ( i ) => self . conflicts ( key , i ) )
328
+ } else {
329
+ conflicting [ key ] . push ( value )
330
+ }
305
331
}
306
332
}
307
333
self . getConflicting = ( ) => conflicting
308
334
309
335
self . conflicting = function conflictingFn ( argv ) {
310
- const args = Object . getOwnPropertyNames ( argv )
311
- args . forEach ( ( arg ) => {
312
- // we default keys to 'undefined' that have been configured, we should not
313
- // apply conflicting check unless they are a value other than 'undefined'.
314
- if ( conflicting [ arg ] && args . indexOf ( conflicting [ arg ] ) !== - 1 && argv [ arg ] !== undefined && argv [ conflicting [ arg ] ] !== undefined ) {
315
- usage . fail ( __ ( 'Arguments %s and %s are mutually exclusive' , arg , conflicting [ arg ] ) )
336
+ Object . keys ( argv ) . forEach ( ( key ) => {
337
+ if ( conflicting [ key ] ) {
338
+ conflicting [ key ] . forEach ( ( value ) => {
339
+ // we default keys to 'undefined' that have been configured, we should not
340
+ // apply conflicting check unless they are a value other than 'undefined'.
341
+ if ( value && argv [ key ] !== undefined && argv [ value ] !== undefined ) {
342
+ usage . fail ( __ ( `Arguments ${ key } and ${ value } are mutually exclusive` ) )
343
+ }
344
+ } )
316
345
}
317
346
} )
318
347
}
0 commit comments