@@ -83,7 +83,7 @@ export function conformsTo<T>(validator: Validator<T>, optionsOrNext?: IValidati
83
83
return errors . concat ( result . addPathNode ( new KeyPathNode ( key ) ) . errors ) ;
84
84
}
85
85
86
- partiallyValidated [ key ] = result . result ;
86
+ partiallyValidated [ key ] = result . value ;
87
87
return errors ;
88
88
} , [ ] as ValidationError [ ] ) ;
89
89
@@ -261,7 +261,7 @@ export function eachItem<T>(assertion: (arg: any) => ValidationResult<T>, next?:
261
261
) ;
262
262
}
263
263
264
- const mapped = ( results as SuccessResult < T > [ ] ) . map ( result => result . result ) ;
264
+ const mapped = ( results as SuccessResult < T > [ ] ) . map ( result => result . value ) ;
265
265
266
266
return next ? next ( mapped ) : success ( mapped ) ;
267
267
} ;
@@ -289,3 +289,63 @@ export function equals<T>(value: T, ...values: T[]): (arg: any) => ValidationRes
289
289
return error ( 'NOT_EQUAL' , vals . length === 1 ? `'${ arg } ' does not equal '${ vals [ 0 ] } '` : `'${ arg } ' not one of: ${ vals . join ( ', ' ) } ` ) ;
290
290
} ;
291
291
}
292
+
293
+
294
+ export function isMap ( ) : ( arg : any ) => ValidationResult < { [ key : string ] : any } > ;
295
+ export function isMap < T > ( next : ( arg : { [ key : string ] : any } ) => ValidationResult < T > ) : ( arg : any ) => ValidationResult < T > ;
296
+ export function isMap ( next ?: ( arg : any ) => ValidationResult < any > ) : ( arg : any ) => ValidationResult < any > {
297
+ return isObject ( ( arg : any ) => {
298
+ const nonStringKeys = keysOf ( arg ) . filter ( key => typeof key !== 'string' ) ;
299
+
300
+ if ( nonStringKeys . length > 0 ) {
301
+ return error ( 'NOT_STRING_KEY' , `Expected string keys, got: ${ nonStringKeys . map ( key => `${ key } (${ typeof key } )` ) } ` ) ;
302
+ }
303
+
304
+ return next ? next ( arg ) : success ( arg ) ;
305
+ } ) ;
306
+ }
307
+
308
+
309
+ export function eachValue < T > ( assertion : ( arg : any ) => ValidationResult < T > ) : ( arg : { [ key : string ] : any } ) => ValidationResult < { [ key : string ] : T } > ;
310
+ export function eachValue < T , U > ( assertion : ( arg : any ) => ValidationResult < T > , next : ( arg : { [ key : string ] : T } ) => ValidationResult < U > ) : ( arg : { [ key : string ] : any } ) => ValidationResult < U > ;
311
+ export function eachValue < T > ( assertion : ( arg : any ) => ValidationResult < T > , next ?: ( arg : { [ key : string ] : T } ) => ValidationResult < any > ) : ( arg : { [ key : string ] : any } ) => ValidationResult < any > {
312
+ return ( arg : { [ key : string ] : any } ) => {
313
+ return conformsTo (
314
+ Object . keys ( arg ) . reduce (
315
+ ( validator , key ) => {
316
+ validator [ key ] = assertion ;
317
+ return validator ;
318
+ } ,
319
+ { } as Validator < { [ key : string ] : T } >
320
+ )
321
+ ) ( arg ) ;
322
+ } ;
323
+ }
324
+
325
+
326
+ function either < A , B > ( assertion1 : ( arg : any ) => ValidationResult < A > , assertion2 : ( arg : any ) => ValidationResult < B > ) : ( arg : any ) => ValidationResult < A | B > ;
327
+ function either < A , B , C > ( assertion1 : ( arg : any ) => ValidationResult < A > , assertion2 : ( arg : any ) => ValidationResult < B > , assertion3 : ( arg : any ) => ValidationResult < C > ) : ( arg : any ) => ValidationResult < A | B | C > ;
328
+ function either < A , B , C , D > ( assertion1 : ( arg : any ) => ValidationResult < A > , assertion2 : ( arg : any ) => ValidationResult < B > , assertion3 : ( arg : any ) => ValidationResult < C > , assertion4 : ( arg : any ) => ValidationResult < D > ) : ( arg : any ) => ValidationResult < A | B | C | D > ;
329
+ function either < A , B , C , D , E > ( assertion1 : ( arg : any ) => ValidationResult < A > , assertion2 : ( arg : any ) => ValidationResult < B > , assertion3 : ( arg : any ) => ValidationResult < C > , assertion4 : ( arg : any ) => ValidationResult < D > , assertion5 : ( arg : any ) => ValidationResult < E > ) : ( arg : any ) => ValidationResult < A | B | C | D | E > ;
330
+ function either < A , B , C , D , E , F > ( assertion1 : ( arg : any ) => ValidationResult < A > , assertion2 : ( arg : any ) => ValidationResult < B > , assertion3 : ( arg : any ) => ValidationResult < C > , assertion4 : ( arg : any ) => ValidationResult < D > , assertion5 : ( arg : any ) => ValidationResult < E > , assertion6 : ( arg : any ) => ValidationResult < F > ) : ( arg : any ) => ValidationResult < A | B | C | D | E | F > ;
331
+ function either < A , B , C , D , E , F , G > ( assertion1 : ( arg : any ) => ValidationResult < A > , assertion2 : ( arg : any ) => ValidationResult < B > , assertion3 : ( arg : any ) => ValidationResult < C > , assertion4 : ( arg : any ) => ValidationResult < D > , assertion5 : ( arg : any ) => ValidationResult < E > , assertion6 : ( arg : any ) => ValidationResult < F > , assertion7 : ( arg : any ) => ValidationResult < G > ) : ( arg : any ) => ValidationResult < A | B | C | D | E | F | G > ;
332
+ function either < A , B , C , D , E , F , G , H > ( assertion1 : ( arg : any ) => ValidationResult < A > , assertion2 : ( arg : any ) => ValidationResult < B > , assertion3 : ( arg : any ) => ValidationResult < C > , assertion4 : ( arg : any ) => ValidationResult < D > , assertion5 : ( arg : any ) => ValidationResult < E > , assertion6 : ( arg : any ) => ValidationResult < F > , assertion7 : ( arg : any ) => ValidationResult < G > , assertion8 : ( arg : any ) => ValidationResult < H > ) : ( arg : any ) => ValidationResult < A | B | C | D | E | F | G | H > ;
333
+ function either < A , B , C , D , E , F , G , H , I > ( assertion1 : ( arg : any ) => ValidationResult < A > , assertion2 : ( arg : any ) => ValidationResult < B > , assertion3 : ( arg : any ) => ValidationResult < C > , assertion4 : ( arg : any ) => ValidationResult < D > , assertion5 : ( arg : any ) => ValidationResult < E > , assertion6 : ( arg : any ) => ValidationResult < F > , assertion7 : ( arg : any ) => ValidationResult < G > , assertion8 : ( arg : any ) => ValidationResult < H > , assertion9 : ( arg : any ) => ValidationResult < I > ) : ( arg : any ) => ValidationResult < A | B | C | D | E | F | G | H | I > ;
334
+ function either < A , B , C , D , E , F , G , H , I , J > ( assertion1 : ( arg : any ) => ValidationResult < A > , assertion2 : ( arg : any ) => ValidationResult < B > , assertion3 : ( arg : any ) => ValidationResult < C > , assertion4 : ( arg : any ) => ValidationResult < D > , assertion5 : ( arg : any ) => ValidationResult < E > , assertion6 : ( arg : any ) => ValidationResult < F > , assertion7 : ( arg : any ) => ValidationResult < G > , assertion8 : ( arg : any ) => ValidationResult < H > , assertion9 : ( arg : any ) => ValidationResult < I > , assertion10 : ( arg : any ) => ValidationResult < J > ) : ( arg : any ) => ValidationResult < A | B | C | D | E | F | G | H | I | J > ;
335
+ function either ( ...assertions : Array < ( arg : any ) => any > ) : ( arg : any ) => any {
336
+ return ( arg : any ) => {
337
+ let errors : ValidationError [ ] = [ ] ;
338
+
339
+ for ( const assertion of assertions ) {
340
+ const result = assertion ( arg ) ;
341
+
342
+ if ( result . success ) {
343
+ return result ;
344
+ }
345
+
346
+ errors = errors . concat ( result . errors ) ;
347
+ }
348
+
349
+ return error ( 'NO_MATCH' , 'No match found - the following assertions failed:\n ' + errors . map ( error => error . toString ( ) ) . join ( '\n ' ) ) ;
350
+ } ;
351
+ }
0 commit comments