@@ -118,6 +118,21 @@ export const createValidator = (callback: ValidationCallback, initialData: Recor
118118 */
119119 let oldData = initialData
120120
121+ /**
122+ * The data currently being validated.
123+ */
124+ let validatingData : null | Record < string , unknown > = null
125+
126+ /**
127+ * The old touched.
128+ */
129+ let oldTouched : string [ ] = [ ]
130+
131+ /**
132+ * The touched currently being validated.
133+ */
134+ let validatingTouched : null | string [ ] = null
135+
121136 /**
122137 * Create a debounced validation callback.
123138 */
@@ -167,9 +182,9 @@ export const createValidator = (callback: ValidationCallback, initialData: Recor
167182 : response
168183 } ,
169184 onBefore : ( ) => {
170- const beforeValidationResult = ( config . onBeforeValidation ?? ( ( newRequest , oldRequest ) => {
171- return ! isequal ( newRequest , oldRequest )
172- } ) ) ( { data } , { data : oldData } )
185+ const beforeValidationResult = ( config . onBeforeValidation ?? ( ( previous , next ) => {
186+ return ! isequal ( previous , next )
187+ } ) ) ( { data, touched } , { data : oldData , touched : oldTouched } )
173188
174189 if ( beforeValidationResult === false ) {
175190 return false
@@ -181,7 +196,9 @@ export const createValidator = (callback: ValidationCallback, initialData: Recor
181196 return false
182197 }
183198
184- oldData = data
199+ validatingTouched = touched
200+
201+ validatingData = data
185202
186203 return true
187204 } ,
@@ -191,7 +208,13 @@ export const createValidator = (callback: ValidationCallback, initialData: Recor
191208 ( config . onStart ?? ( ( ) => null ) ) ( )
192209 } ,
193210 onFinish : ( ) => {
194- setValidating ( false ) ;
211+ setValidating ( false )
212+
213+ oldTouched = validatingTouched !
214+
215+ oldData = validatingData !
216+
217+ validatingTouched = validatingData = null ;
195218
196219 ( config . onFinish ?? ( ( ) => null ) ) ( )
197220 } ,
@@ -201,7 +224,13 @@ export const createValidator = (callback: ValidationCallback, initialData: Recor
201224 /**
202225 * Validate the given input.
203226 */
204- const validate = ( name : string | NamedInputEvent , value : unknown ) => {
227+ const validate = ( name ?: string | NamedInputEvent , value ?: unknown ) => {
228+ if ( typeof name === 'undefined' ) {
229+ validator ( )
230+
231+ return
232+ }
233+
205234 if ( isFile ( value ) && ! validateFiles ) {
206235 console . warn ( 'Precognition file validation is not active. Call the "validateFiles" function on your form to enable it.' )
207236
@@ -238,6 +267,15 @@ export const createValidator = (callback: ValidationCallback, initialData: Recor
238267
239268 return form
240269 } ,
270+ touch ( input ) {
271+ const inputs = Array . isArray ( input )
272+ ? input
273+ : [ resolveName ( input ) ]
274+
275+ setTouched ( [ ...touched , ...inputs ] )
276+
277+ return form
278+ } ,
241279 validating : ( ) => validating ,
242280 valid,
243281 errors : ( ) => errors ,
0 commit comments