@@ -223,7 +223,8 @@ async function _clientValidation<T extends AnyZodObject, M = unknown>(
223223export async function validateObjectErrors < T extends AnyZodObject , M > (
224224 formOptions : FormOptions < T , M > ,
225225 data : z . infer < T > ,
226- Errors : SuperForm < T , M > [ 'errors' ]
226+ Errors : SuperForm < T , M > [ 'errors' ] ,
227+ tainted : TaintedFields < UnwrapEffects < T > > | undefined
227228) {
228229 if (
229230 typeof formOptions . validators !== 'object' ||
@@ -252,7 +253,17 @@ export async function validateObjectErrors<T extends AnyZodObject, M>(
252253 // Add new object-level errors and tainted field errors
253254 traversePaths ( newErrors , ( pathData ) => {
254255 if ( pathData . key == '_errors' ) {
255- return setPaths ( currentErrors , [ pathData . path ] , pathData . value ) ;
256+ // Check if the parent path (the actual array) is tainted
257+ // Form-level errors are always "tainted"
258+ const taintedPath =
259+ pathData . path . length == 1
260+ ? { value : true }
261+ : tainted &&
262+ traversePath ( tainted , pathData . path . slice ( 0 , - 1 ) as any ) ;
263+
264+ if ( taintedPath && taintedPath . value ) {
265+ return setPaths ( currentErrors , [ pathData . path ] , pathData . value ) ;
266+ }
256267 }
257268 } ) ;
258269
@@ -387,7 +398,7 @@ async function _validateField<T extends ZodValidation<AnyZodObject>, M>(
387398 if ( tainted === undefined ) return false ;
388399 const leaf = traversePath ( tainted , path as FieldPath < typeof tainted > ) ;
389400 if ( ! leaf ) return false ;
390- return leaf . value === true ;
401+ return leaf . value ;
391402 }
392403
393404 function Errors_update ( updater : Parameters < typeof Errors . update > [ 0 ] ) {
@@ -468,14 +479,23 @@ async function _validateField<T extends ZodValidation<AnyZodObject>, M>(
468479
469480 // Add new object-level errors and tainted field errors
470481 traversePaths ( newErrors , ( pathData ) => {
471- if ( pathData . key == '_errors' ) {
482+ if (
483+ pathData . key == '_errors' &&
484+ ( pathData . path . length == 1 ||
485+ Tainted_isPathTainted (
486+ pathData . path . slice ( 0 , - 1 ) ,
487+ taintedFields
488+ ) )
489+ ) {
472490 return setPaths (
473491 currentErrors ,
474492 [ pathData . path ] ,
475493 pathData . value
476494 ) ;
477495 }
496+
478497 if ( ! Array . isArray ( pathData . value ) ) return ;
498+
479499 if ( Tainted_isPathTainted ( pathData . path , taintedFields ) ) {
480500 setPaths ( currentErrors , [ pathData . path ] , pathData . value ) ;
481501 }
0 commit comments