66 ObjectKeys ,
77 toObj ,
88 shouldAddToResult ,
9+ isArray ,
910} from './utils' ;
1011import {
1112 BooleanValidator ,
@@ -20,6 +21,7 @@ import {
2021 UnionValidator ,
2122 Validator ,
2223} from './validatorTypes' ;
24+ import { InferResult , InferCallbackResult } from './type-utils' ;
2325import { TYPEERR } from './constants' ;
2426import invariant from 'tiny-invariant' ;
2527
@@ -37,26 +39,42 @@ function enterNode(validator: Validator, value: unknown, eager = false) {
3739 return fn ( validator , value , eager ) ;
3840}
3941
40- type InferCallbackResult < V extends Validator > = V extends
41- | StringValidator
42- | NumberValidator
43- | BooleanValidator
44- | ConstantValidator < any >
45- | UnionValidator < any >
46- ? string
47- : V extends ListValidator < infer U >
48- ? { [ key in number ] ?: InferCallbackResult < U [ key ] > }
49- : V extends ListofValidator < infer U >
50- ? { [ key : number ] : InferCallbackResult < U > | undefined }
51- : V extends RecordValidator < infer U >
52- ? { [ key in keyof U ] ?: InferCallbackResult < U [ key ] > }
53- : V extends RecordofValidator < infer U >
54- ? { [ key : string ] : InferCallbackResult < U > | undefined }
55- : never ;
56-
57- type InferResult < S extends Schema > = {
58- [ key in keyof S ] ?: InferCallbackResult < S [ key ] > ;
59- } ;
42+ function parseShapeValidator (
43+ validator : RecordValidator < any > | ListValidator < any [ ] > ,
44+ value : unknown ,
45+ eager = false
46+ ) {
47+ const shape = toObj ( validator ) . shape ;
48+ const keys = ObjectKeys ( shape ) ;
49+ const values = toObj ( value ) ;
50+ const result : Record < string , any > = { } ;
51+ for ( let i = 0 ; i < keys . length ; i ++ ) {
52+ const currentResult = enterNode ( shape [ keys [ i ] ] , values [ keys [ i ] ] ) ;
53+ if ( shouldAddToResult ( currentResult ) ) {
54+ result [ keys [ i ] ] = currentResult ;
55+ if ( eager ) return result ;
56+ }
57+ }
58+ return normalizeResult ( result ) ;
59+ }
60+
61+ function parseOfValidator (
62+ validator : RecordofValidator < any > | ListofValidator < any > ,
63+ value : unknown ,
64+ eager = false
65+ ) {
66+ const values = toObj ( value ) ;
67+ const keys = ObjectKeys ( values ) ;
68+ const result : Record < string , any > = { } ;
69+ for ( let i = 0 ; i < keys . length ; i ++ ) {
70+ const currentResult = enterNode ( validator . of , values [ keys [ i ] ] ) ;
71+ if ( shouldAddToResult ( currentResult ) ) {
72+ result [ keys [ i ] ] = currentResult ;
73+ if ( eager ) return result ;
74+ }
75+ }
76+ return normalizeResult ( result ) ;
77+ }
6078
6179const validators = {
6280 string ( validator : StringValidator , value : unknown ) {
@@ -117,65 +135,23 @@ const validators = {
117135 } ,
118136 list < T extends Validator [ ] > ( validator : ListValidator < T > , value : unknown , eager = false ) {
119137 if ( shouldSkipValidation ( value , validator ) ) return null ;
120- if ( ! Array . isArray ( value ) ) return TYPEERR ;
121- const shape = toObj ( validator ) . shape ;
122- const keys = ObjectKeys ( shape ) ;
123- const values = toObj ( value ) ;
124- const result : Record < string , any > = { } ;
125- for ( let i = 0 ; i < keys . length ; i ++ ) {
126- const currentResult = enterNode ( shape [ keys [ i ] ] , values [ keys [ i ] ] ) ;
127- if ( shouldAddToResult ( currentResult ) ) {
128- result [ keys [ i ] ] = currentResult ;
129- if ( eager ) return result ;
130- }
131- }
132- return normalizeResult ( result ) ;
138+ if ( ! isArray ( value ) ) return TYPEERR ;
139+ return parseShapeValidator ( validator , value , eager ) ;
133140 } ,
134141 listof < T extends Validator > ( validator : ListofValidator < T > , value : unknown , eager = false ) {
135142 if ( shouldSkipValidation ( value , validator ) ) return null ;
136- if ( ! Array . isArray ( value ) ) return TYPEERR ;
137- const values = toObj ( value ) ;
138- const keys = ObjectKeys ( values ) ;
139- const result : Record < string , any > = { } ;
140- for ( let i = 0 ; i < keys . length ; i ++ ) {
141- const currentResult = enterNode ( validator . of , values [ keys [ i ] ] ) ;
142- if ( shouldAddToResult ( currentResult ) ) {
143- result [ keys [ i ] ] = currentResult ;
144- if ( eager ) return result ;
145- }
146- }
147- return normalizeResult ( result ) ;
143+ if ( ! isArray ( value ) ) return TYPEERR ;
144+ return parseOfValidator ( validator , value , eager ) ;
148145 } ,
149146 record < T extends Schema > ( validator : RecordValidator < T > , value : unknown , eager = false ) {
150147 if ( shouldSkipValidation ( value , validator ) ) return null ;
151148 if ( ! isPlainObject ( value ) ) return TYPEERR ;
152- const shape = toObj ( validator ) . shape ;
153- const keys = ObjectKeys ( shape ) ;
154- const values = toObj ( value ) ;
155- const result : Record < string , any > = { } ;
156- for ( let i = 0 ; i < keys . length ; i ++ ) {
157- const currentResult = enterNode ( shape [ keys [ i ] ] , values [ keys [ i ] ] ) ;
158- if ( shouldAddToResult ( currentResult ) ) {
159- result [ keys [ i ] ] = currentResult ;
160- if ( eager ) return result ;
161- }
162- }
163- return normalizeResult ( result ) ;
149+ return parseShapeValidator ( validator , value , eager ) ;
164150 } ,
165151 recordof < T extends Validator > ( validator : RecordofValidator < T > , value : unknown , eager = false ) {
166152 if ( shouldSkipValidation ( value , validator ) ) return null ;
167153 if ( ! isPlainObject ( value ) ) return TYPEERR ;
168- const values = toObj ( value ) ;
169- const keys = ObjectKeys ( values ) ;
170- const result : Record < string , any > = { } ;
171- for ( let i = 0 ; i < keys . length ; i ++ ) {
172- const currentResult = enterNode ( validator . of , values [ keys [ i ] ] ) ;
173- if ( shouldAddToResult ( currentResult ) ) {
174- result [ keys [ i ] ] = currentResult ;
175- if ( eager ) return result ;
176- }
177- }
178- return normalizeResult ( result ) ;
154+ return parseOfValidator ( validator , value , eager ) ;
179155 } ,
180156} ;
181157
0 commit comments