@hookform/resolvers 5.5.2 → 5.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -229,6 +229,16 @@ const App = () => {
229
229
  };
230
230
  ```
231
231
 
232
+ > ⚠️ If your schema uses `.default(...)` on a field, that field becomes optional on the schema's _input_ type (`z.input`) but stays required on its _output_ type (`z.output`/`z.infer`) — the default only fills it in after validation. Passing a single generic to `useForm<T>` pins both to the same type and will conflict with `zodResolver`, which infers input and output separately. Either omit the generic and let it infer from `resolver`, or specify all three explicitly:
233
+ >
234
+ > ```tsx
235
+ > const schema = z.object({ debug_mode: z.boolean().default(true) });
236
+ >
237
+ > useForm<z.input<typeof schema>, unknown, z.output<typeof schema>>({
238
+ > resolver: zodResolver(schema),
239
+ > });
240
+ > ```
241
+
232
242
  ### [Superstruct](https://github.com/ianstormtaylor/superstruct)
233
243
 
234
244
  A simple and composable way to validate data in JavaScript (or TypeScript).
package/ajv/dist/ajv.js CHANGED
@@ -1,2 +1,2 @@
1
- var e=require("@hookform/resolvers"),r=require("ajv"),a=require("ajv-errors"),s=require("ajv-formats"),o=require("react-hook-form");function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=/*#__PURE__*/t(r),n=/*#__PURE__*/t(a),u=/*#__PURE__*/t(s),c=function(e,r){for(var a={},s=function(e){"required"===e.keyword&&(e.instancePath+="/"+e.params.missingProperty);var s=e.instancePath.substring(1).replace(/\//g,".");if(a[s]||(a[s]={message:e.message,type:e.keyword}),r){var t=a[s].types,i=t&&t[e.keyword];a[s]=o.appendErrors(s,r,a,e.keyword,i?[].concat(i,e.message||""):e.message)}},t=function(){var r=e[i];"errorMessage"===r.keyword?r.params.errors.forEach(function(e){e.message=r.message,s(e)}):s(r)},i=0;i<e.length;i+=1)t();return a};exports.ajvResolver=function(r,a,s){return void 0===s&&(s={}),function(o,t,l){try{var v=new i.default(Object.assign({},{allErrors:!0,validateSchema:!0},a));n.default(v),u.default(v);var d=v.compile(Object.assign({$async:s&&"async"===s.mode},r)),f=d(o);return l.shouldUseNativeValidation&&e.validateFieldsNatively({},l),Promise.resolve(f?{values:o,errors:{}}:{values:{},errors:e.toNestErrors(c(d.errors,!l.shouldUseNativeValidation&&"all"===l.criteriaMode),l)})}catch(e){return Promise.reject(e)}}};
1
+ var e=require("@hookform/resolvers"),r=require("ajv"),a=require("ajv-errors"),s=require("ajv-formats"),o=require("react-hook-form");function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=/*#__PURE__*/t(r),n=/*#__PURE__*/t(a),u=/*#__PURE__*/t(s),c=function(e,r){for(var a={},s=function(e){"required"===e.keyword&&(e.instancePath+="/"+e.params.missingProperty);var s=e.instancePath.substring(1).replace(/\//g,".");if(a[s]||(a[s]={message:e.message,type:e.keyword}),r){var t=a[s].types,i=t&&t[e.keyword];a[s]=o.appendErrors(s,r,a,e.keyword,i?[].concat(i,e.message||""):e.message)}},t=function(){var r=e[i];"errorMessage"===r.keyword?r.params.errors.forEach(function(e){e.message=r.message,s(e)}):s(r)},i=0;i<e.length;i+=1)t();return a};exports.ajvResolver=function(r,a,s){return void 0===s&&(s={}),function(o,t,l){try{var d=new i.default(Object.assign({},{allErrors:!0,validateSchema:!0},a));n.default(d),u.default(d);var v=d.compile(Object.assign({$async:s&&"async"===s.mode},r)),f=structuredClone(o),m=v(f);return l.shouldUseNativeValidation&&e.validateFieldsNatively({},l),Promise.resolve(m?{values:f,errors:{}}:{values:{},errors:e.toNestErrors(c(v.errors,!l.shouldUseNativeValidation&&"all"===l.criteriaMode),l)})}catch(e){return Promise.reject(e)}}};
2
2
  //# sourceMappingURL=ajv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ajv.js","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport addFormats from 'ajv-formats';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n const parsedErrors: Record<string, FieldError> = {};\n\n const reduceError = (error: AjvError) => {\n // Ajv will return empty instancePath when require error\n if (error.keyword === 'required') {\n error.instancePath += `/${error.params.missingProperty}`;\n }\n\n // `/deepObject/data` -> `deepObject.data`\n const path = error.instancePath.substring(1).replace(/\\//g, '.');\n\n if (!parsedErrors[path]) {\n parsedErrors[path] = {\n message: error.message,\n type: error.keyword,\n };\n }\n\n if (validateAllFieldCriteria) {\n const types = parsedErrors[path].types;\n const messages = types && types[error.keyword];\n\n parsedErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n parsedErrors,\n error.keyword,\n messages\n ? ([] as string[]).concat(messages as string[], error.message || '')\n : error.message,\n ) as FieldError;\n }\n };\n\n for (let index = 0; index < ajvErrors.length; index += 1) {\n const error = ajvErrors[index];\n\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((originalError) => {\n originalError.message = error.message;\n reduceError(originalError);\n });\n } else {\n reduceError(error);\n }\n }\n\n return parsedErrors;\n};\n\n/**\n * Creates a resolver for react-hook-form using Ajv schema validation\n * @param {Schema} schema - The Ajv schema to validate against\n * @param {Object} schemaOptions - Additional schema validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {string} [resolverOptions.mode='async'] - Validation mode\n * @returns {Resolver<Schema>} A resolver function compatible with react-hook-form\n * @example\n * const schema = ajv.compile({\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * age: { type: 'number' }\n * }\n * });\n *\n * useForm({\n * resolver: ajvResolver(schema)\n * });\n */\nexport const ajvResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n const ajv = new Ajv(\n Object.assign(\n {},\n {\n allErrors: true,\n validateSchema: true,\n },\n schemaOptions,\n ),\n );\n\n ajvErrors(ajv);\n addFormats(ajv);\n\n const validate = ajv.compile(\n Object.assign(\n { $async: resolverOptions && resolverOptions.mode === 'async' },\n schema,\n ),\n );\n\n const valid = validate(values);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return valid\n ? { values, errors: {} }\n : {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n validate.errors as DefinedError[],\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n };\n"],"names":["parseErrorSchema","ajvErrors","validateAllFieldCriteria","parsedErrors","reduceError","error","keyword","instancePath","params","missingProperty","path","substring","replace","message","type","types","messages","appendErrors","concat","_loop","index","errors","forEach","originalError","length","schema","schemaOptions","resolverOptions","values","_","options","ajv","Ajv","Object","assign","allErrors","validateSchema","addFormats","validate","compile","$async","mode","valid","shouldUseNativeValidation","validateFieldsNatively","Promise","resolve","toNestErrors","criteriaMode","e","reject"],"mappings":"4QAOMA,EAAmB,SACvBC,EACAC,GAoCA,IAlCA,IAAMC,EAA2C,CAAA,EAE3CC,EAAc,SAACC,GAEG,aAAlBA,EAAMC,UACRD,EAAME,cAAY,IAAQF,EAAMG,OAAOC,iBAIzC,IAAMC,EAAOL,EAAME,aAAaI,UAAU,GAAGC,QAAQ,MAAO,KAS5D,GAPKT,EAAaO,KAChBP,EAAaO,GAAQ,CACnBG,QAASR,EAAMQ,QACfC,KAAMT,EAAMC,UAIZJ,EAA0B,CAC5B,IAAMa,EAAQZ,EAAaO,GAAMK,MAC3BC,EAAWD,GAASA,EAAMV,EAAMC,SAEtCH,EAAaO,GAAQO,EAAAA,aACnBP,EACAR,EACAC,EACAE,EAAMC,QACNU,EACK,GAAgBE,OAAOF,EAAsBX,EAAMQ,SAAW,IAC/DR,EAAMQ,QAEd,CACF,EAAEM,EAAAA,WAGA,IAAMd,EAAQJ,EAAUmB,GAEF,iBAAlBf,EAAMC,QACRD,EAAMG,OAAOa,OAAOC,QAAQ,SAACC,GAC3BA,EAAcV,QAAUR,EAAMQ,QAC9BT,EAAYmB,EACd,GAEAnB,EAAYC,EAEhB,EAXSe,EAAQ,EAAGA,EAAQnB,EAAUuB,OAAQJ,GAAS,EAACD,IAaxD,OAAOhB,CACT,sBAuBE,SAACsB,EAAQC,EAAeC,GAAoB,YAAL,IAAfA,IAAAA,EAAkB,CAAA,GAAE,SACrCC,EAAQC,EAAGC,GAAO,IACvB,IAAMC,EAAM,IAAIC,EAAAA,QACdC,OAAOC,OACL,CAAE,EACF,CACEC,WAAW,EACXC,gBAAgB,GAElBV,IAIJzB,EAAS,QAAC8B,GACVM,EAAAA,QAAWN,GAEX,IAAMO,EAAWP,EAAIQ,QACnBN,OAAOC,OACL,CAAEM,OAAQb,GAA4C,UAAzBA,EAAgBc,MAC7ChB,IAIEiB,EAAQJ,EAASV,GAIvB,OAFAE,EAAQa,2BAA6BC,EAAAA,uBAAuB,CAAA,EAAId,GAEhEe,QAAAC,QAAOJ,EACH,CAAEd,OAAAA,EAAQP,OAAQ,CAAI,GACtB,CACEO,OAAQ,CAAA,EACRP,OAAQ0B,EAAYA,aAClB/C,EACEsC,EAASjB,QACRS,EAAQa,2BACkB,QAAzBb,EAAQkB,cAEZlB,IAGV,CAAC,MAAAmB,GAAA,OAAAJ,QAAAK,OAAAD,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"ajv.js","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport addFormats from 'ajv-formats';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n const parsedErrors: Record<string, FieldError> = {};\n\n const reduceError = (error: AjvError) => {\n // Ajv will return empty instancePath when require error\n if (error.keyword === 'required') {\n error.instancePath += `/${error.params.missingProperty}`;\n }\n\n // `/deepObject/data` -> `deepObject.data`\n const path = error.instancePath.substring(1).replace(/\\//g, '.');\n\n if (!parsedErrors[path]) {\n parsedErrors[path] = {\n message: error.message,\n type: error.keyword,\n };\n }\n\n if (validateAllFieldCriteria) {\n const types = parsedErrors[path].types;\n const messages = types && types[error.keyword];\n\n parsedErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n parsedErrors,\n error.keyword,\n messages\n ? ([] as string[]).concat(messages as string[], error.message || '')\n : error.message,\n ) as FieldError;\n }\n };\n\n for (let index = 0; index < ajvErrors.length; index += 1) {\n const error = ajvErrors[index];\n\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((originalError) => {\n originalError.message = error.message;\n reduceError(originalError);\n });\n } else {\n reduceError(error);\n }\n }\n\n return parsedErrors;\n};\n\n/**\n * Creates a resolver for react-hook-form using Ajv schema validation\n * @param {Schema} schema - The Ajv schema to validate against\n * @param {Object} schemaOptions - Additional schema validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {string} [resolverOptions.mode='async'] - Validation mode\n * @returns {Resolver<Schema>} A resolver function compatible with react-hook-form\n * @example\n * const schema = ajv.compile({\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * age: { type: 'number' }\n * }\n * });\n *\n * useForm({\n * resolver: ajvResolver(schema)\n * });\n */\nexport const ajvResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n const ajv = new Ajv(\n Object.assign(\n {},\n {\n allErrors: true,\n validateSchema: true,\n },\n schemaOptions,\n ),\n );\n\n ajvErrors(ajv);\n addFormats(ajv);\n\n const validate = ajv.compile(\n Object.assign(\n { $async: resolverOptions && resolverOptions.mode === 'async' },\n schema,\n ),\n );\n\n // Ajv mutates the object passed to `validate` in place (e.g. to apply\n // `useDefaults`, `removeAdditional`, or `coerceTypes`). Validating a\n // clone keeps those mutations from leaking into react-hook-form's\n // internal form values, which are passed in by reference.\n const parsedValues = structuredClone(values);\n const valid = validate(parsedValues);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return valid\n ? { values: parsedValues, errors: {} }\n : {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n validate.errors as DefinedError[],\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n };\n"],"names":["parseErrorSchema","ajvErrors","validateAllFieldCriteria","parsedErrors","reduceError","error","keyword","instancePath","params","missingProperty","path","substring","replace","message","type","types","messages","appendErrors","concat","_loop","index","errors","forEach","originalError","length","schema","schemaOptions","resolverOptions","values","_","options","ajv","Ajv","Object","assign","allErrors","validateSchema","addFormats","validate","compile","$async","mode","parsedValues","structuredClone","valid","shouldUseNativeValidation","validateFieldsNatively","Promise","resolve","toNestErrors","criteriaMode","e","reject"],"mappings":"4QAOMA,EAAmB,SACvBC,EACAC,GAoCA,IAlCA,IAAMC,EAA2C,CAAA,EAE3CC,EAAc,SAACC,GAEG,aAAlBA,EAAMC,UACRD,EAAME,cAAoBF,IAAAA,EAAMG,OAAOC,iBAIzC,IAAMC,EAAOL,EAAME,aAAaI,UAAU,GAAGC,QAAQ,MAAO,KAS5D,GAPKT,EAAaO,KAChBP,EAAaO,GAAQ,CACnBG,QAASR,EAAMQ,QACfC,KAAMT,EAAMC,UAIZJ,EAA0B,CAC5B,IAAMa,EAAQZ,EAAaO,GAAMK,MAC3BC,EAAWD,GAASA,EAAMV,EAAMC,SAEtCH,EAAaO,GAAQO,EAAYA,aAC/BP,EACAR,EACAC,EACAE,EAAMC,QACNU,EACK,GAAgBE,OAAOF,EAAsBX,EAAMQ,SAAW,IAC/DR,EAAMQ,QAEd,CACF,EAAEM,EAAAA,WAGA,IAAMd,EAAQJ,EAAUmB,GAEF,iBAAlBf,EAAMC,QACRD,EAAMG,OAAOa,OAAOC,QAAQ,SAACC,GAC3BA,EAAcV,QAAUR,EAAMQ,QAC9BT,EAAYmB,EACd,GAEAnB,EAAYC,EAEhB,EAXSe,EAAQ,EAAGA,EAAQnB,EAAUuB,OAAQJ,GAAS,EAACD,IAaxD,OAAOhB,CACT,sBAuBE,SAACsB,EAAQC,EAAeC,GACjBC,gBADiBD,IAAAA,EAAkB,CAAA,GACnCC,SAAAA,EAAQC,EAAGC,GAAO,IACvB,IAAMC,EAAM,IAAIC,EAAG,QACjBC,OAAOC,OACL,GACA,CACEC,WAAW,EACXC,gBAAgB,GAElBV,IAIJzB,EAAAA,QAAU8B,GACVM,UAAWN,GAEX,IAAMO,EAAWP,EAAIQ,QACnBN,OAAOC,OACL,CAAEM,OAAQb,GAA4C,UAAzBA,EAAgBc,MAC7ChB,IAQEiB,EAAeC,gBAAgBf,GAC/BgB,EAAQN,EAASI,GAIvB,OAFAZ,EAAQe,2BAA6BC,EAAsBA,uBAAC,GAAIhB,GAEhEiB,QAAAC,QAAOJ,EACH,CAAEhB,OAAQc,EAAcrB,OAAQ,CAAA,GAChC,CACEO,OAAQ,CAAE,EACVP,OAAQ4B,EAAAA,aACNjD,EACEsC,EAASjB,QACRS,EAAQe,2BACkB,QAAzBf,EAAQoB,cAEZpB,IAGV,CAAC,MAAAqB,GAAA,OAAAJ,QAAAK,OAAAD,EAAA,CAAA,CAAA"}
package/ajv/dist/ajv.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import o from"ajv";import a from"ajv-errors";import s from"ajv-formats";import{appendErrors as t}from"react-hook-form";var i=function(r,e){for(var o={},a=function(r){"required"===r.keyword&&(r.instancePath+="/"+r.params.missingProperty);var a=r.instancePath.substring(1).replace(/\//g,".");if(o[a]||(o[a]={message:r.message,type:r.keyword}),e){var s=o[a].types,i=s&&s[r.keyword];o[a]=t(a,e,o,r.keyword,i?[].concat(i,r.message||""):r.message)}},s=function(){var e=r[i];"errorMessage"===e.keyword?e.params.errors.forEach(function(r){r.message=e.message,a(r)}):a(e)},i=0;i<r.length;i+=1)s();return o},n=function(t,n,m){return void 0===m&&(m={}),function(c,v,f){try{var l=new o(Object.assign({},{allErrors:!0,validateSchema:!0},n));a(l),s(l);var u=l.compile(Object.assign({$async:m&&"async"===m.mode},t)),d=u(c);return f.shouldUseNativeValidation&&r({},f),Promise.resolve(d?{values:c,errors:{}}:{values:{},errors:e(i(u.errors,!f.shouldUseNativeValidation&&"all"===f.criteriaMode),f)})}catch(r){return Promise.reject(r)}}};export{n as ajvResolver};
1
+ import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import o from"ajv";import a from"ajv-errors";import s from"ajv-formats";import{appendErrors as t}from"react-hook-form";var i=function(r,e){for(var o={},a=function(r){"required"===r.keyword&&(r.instancePath+="/"+r.params.missingProperty);var a=r.instancePath.substring(1).replace(/\//g,".");if(o[a]||(o[a]={message:r.message,type:r.keyword}),e){var s=o[a].types,i=s&&s[r.keyword];o[a]=t(a,e,o,r.keyword,i?[].concat(i,r.message||""):r.message)}},s=function(){var e=r[i];"errorMessage"===e.keyword?e.params.errors.forEach(function(r){r.message=e.message,a(r)}):a(e)},i=0;i<r.length;i+=1)s();return o},n=function(t,n,m){return void 0===m&&(m={}),function(c,u,v){try{var f=new o(Object.assign({},{allErrors:!0,validateSchema:!0},n));a(f),s(f);var l=f.compile(Object.assign({$async:m&&"async"===m.mode},t)),d=structuredClone(c),g=l(d);return v.shouldUseNativeValidation&&r({},v),Promise.resolve(g?{values:d,errors:{}}:{values:{},errors:e(i(l.errors,!v.shouldUseNativeValidation&&"all"===v.criteriaMode),v)})}catch(r){return Promise.reject(r)}}};export{n as ajvResolver};
2
2
  //# sourceMappingURL=ajv.module.js.map
@@ -1,2 +1,2 @@
1
- import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import s from"ajv";import o from"ajv-errors";import a from"ajv-formats";import{appendErrors as t}from"react-hook-form";const m=(r,e)=>{const s={},o=r=>{"required"===r.keyword&&(r.instancePath+=`/${r.params.missingProperty}`);const o=r.instancePath.substring(1).replace(/\//g,".");if(s[o]||(s[o]={message:r.message,type:r.keyword}),e){const a=s[o].types,m=a&&a[r.keyword];s[o]=t(o,e,s,r.keyword,m?[].concat(m,r.message||""):r.message)}};for(let e=0;e<r.length;e+=1){const s=r[e];"errorMessage"===s.keyword?s.params.errors.forEach(r=>{r.message=s.message,o(r)}):o(s)}return s},n=(t,n,i={})=>async(c,l,d)=>{const g=new s(Object.assign({},{allErrors:!0,validateSchema:!0},n));o(g),a(g);const p=g.compile(Object.assign({$async:i&&"async"===i.mode},t)),f=p(c);return d.shouldUseNativeValidation&&r({},d),f?{values:c,errors:{}}:{values:{},errors:e(m(p.errors,!d.shouldUseNativeValidation&&"all"===d.criteriaMode),d)}};export{n as ajvResolver};
1
+ import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import s from"ajv";import o from"ajv-errors";import a from"ajv-formats";import{appendErrors as t}from"react-hook-form";const n=(r,e)=>{const s={},o=r=>{"required"===r.keyword&&(r.instancePath+=`/${r.params.missingProperty}`);const o=r.instancePath.substring(1).replace(/\//g,".");if(s[o]||(s[o]={message:r.message,type:r.keyword}),e){const a=s[o].types,n=a&&a[r.keyword];s[o]=t(o,e,s,r.keyword,n?[].concat(n,r.message||""):r.message)}};for(let e=0;e<r.length;e+=1){const s=r[e];"errorMessage"===s.keyword?s.params.errors.forEach(r=>{r.message=s.message,o(r)}):o(s)}return s},m=(t,m,i={})=>async(c,l,d)=>{const g=new s(Object.assign({},{allErrors:!0,validateSchema:!0},m));o(g),a(g);const p=g.compile(Object.assign({$async:i&&"async"===i.mode},t)),f=structuredClone(c),y=p(f);return d.shouldUseNativeValidation&&r({},d),y?{values:f,errors:{}}:{values:{},errors:e(n(p.errors,!d.shouldUseNativeValidation&&"all"===d.criteriaMode),d)}};export{m as ajvResolver};
2
2
  //# sourceMappingURL=ajv.modern.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ajv.modern.mjs","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport addFormats from 'ajv-formats';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n const parsedErrors: Record<string, FieldError> = {};\n\n const reduceError = (error: AjvError) => {\n // Ajv will return empty instancePath when require error\n if (error.keyword === 'required') {\n error.instancePath += `/${error.params.missingProperty}`;\n }\n\n // `/deepObject/data` -> `deepObject.data`\n const path = error.instancePath.substring(1).replace(/\\//g, '.');\n\n if (!parsedErrors[path]) {\n parsedErrors[path] = {\n message: error.message,\n type: error.keyword,\n };\n }\n\n if (validateAllFieldCriteria) {\n const types = parsedErrors[path].types;\n const messages = types && types[error.keyword];\n\n parsedErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n parsedErrors,\n error.keyword,\n messages\n ? ([] as string[]).concat(messages as string[], error.message || '')\n : error.message,\n ) as FieldError;\n }\n };\n\n for (let index = 0; index < ajvErrors.length; index += 1) {\n const error = ajvErrors[index];\n\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((originalError) => {\n originalError.message = error.message;\n reduceError(originalError);\n });\n } else {\n reduceError(error);\n }\n }\n\n return parsedErrors;\n};\n\n/**\n * Creates a resolver for react-hook-form using Ajv schema validation\n * @param {Schema} schema - The Ajv schema to validate against\n * @param {Object} schemaOptions - Additional schema validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {string} [resolverOptions.mode='async'] - Validation mode\n * @returns {Resolver<Schema>} A resolver function compatible with react-hook-form\n * @example\n * const schema = ajv.compile({\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * age: { type: 'number' }\n * }\n * });\n *\n * useForm({\n * resolver: ajvResolver(schema)\n * });\n */\nexport const ajvResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n const ajv = new Ajv(\n Object.assign(\n {},\n {\n allErrors: true,\n validateSchema: true,\n },\n schemaOptions,\n ),\n );\n\n ajvErrors(ajv);\n addFormats(ajv);\n\n const validate = ajv.compile(\n Object.assign(\n { $async: resolverOptions && resolverOptions.mode === 'async' },\n schema,\n ),\n );\n\n const valid = validate(values);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return valid\n ? { values, errors: {} }\n : {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n validate.errors as DefinedError[],\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n };\n"],"names":["parseErrorSchema","ajvErrors","validateAllFieldCriteria","parsedErrors","reduceError","error","keyword","instancePath","params","missingProperty","path","substring","replace","message","type","types","messages","appendErrors","concat","index","length","errors","forEach","originalError","ajvResolver","schema","schemaOptions","resolverOptions","async","values","_","options","ajv","Ajv","Object","assign","allErrors","validateSchema","addFormats","validate","compile","$async","mode","valid","shouldUseNativeValidation","validateFieldsNatively","toNestErrors","criteriaMode"],"mappings":"sMAOA,MAAMA,EAAmBA,CACvBC,EACAC,KAEA,MAAMC,EAA2C,CAAA,EAE3CC,EAAeC,IAEG,aAAlBA,EAAMC,UACRD,EAAME,cAAgB,IAAIF,EAAMG,OAAOC,mBAIzC,MAAMC,EAAOL,EAAME,aAAaI,UAAU,GAAGC,QAAQ,MAAO,KAS5D,GAPKT,EAAaO,KAChBP,EAAaO,GAAQ,CACnBG,QAASR,EAAMQ,QACfC,KAAMT,EAAMC,UAIZJ,EAA0B,CAC5B,MAAMa,EAAQZ,EAAaO,GAAMK,MAC3BC,EAAWD,GAASA,EAAMV,EAAMC,SAEtCH,EAAaO,GAAQO,EACnBP,EACAR,EACAC,EACAE,EAAMC,QACNU,EACK,GAAgBE,OAAOF,EAAsBX,EAAMQ,SAAW,IAC/DR,EAAMQ,QAEd,GAGF,IAAK,IAAIM,EAAQ,EAAGA,EAAQlB,EAAUmB,OAAQD,GAAS,EAAG,CACxD,MAAMd,EAAQJ,EAAUkB,GAEF,iBAAlBd,EAAMC,QACRD,EAAMG,OAAOa,OAAOC,QAASC,IAC3BA,EAAcV,QAAUR,EAAMQ,QAC9BT,EAAYmB,EAAc,GAG5BnB,EAAYC,EAEhB,CAEA,OAAOF,CAAY,EAuBRqB,EACXA,CAACC,EAAQC,EAAeC,EAAkB,CAAA,IAC1CC,MAAOC,EAAQC,EAAGC,KAChB,MAAMC,EAAM,IAAIC,EACdC,OAAOC,OACL,CAAE,EACF,CACEC,WAAW,EACXC,gBAAgB,GAElBX,IAIJzB,EAAU+B,GACVM,EAAWN,GAEX,MAAMO,EAAWP,EAAIQ,QACnBN,OAAOC,OACL,CAAEM,OAAQd,GAA4C,UAAzBA,EAAgBe,MAC7CjB,IAIEkB,EAAQJ,EAASV,GAIvB,OAFAE,EAAQa,2BAA6BC,EAAuB,GAAId,GAEzDY,EACH,CAAEd,SAAQR,OAAQ,CAAI,GACtB,CACEQ,OAAQ,CAAE,EACVR,OAAQyB,EACN9C,EACEuC,EAASlB,QACRU,EAAQa,2BACkB,QAAzBb,EAAQgB,cAEZhB,GAEH"}
1
+ {"version":3,"file":"ajv.modern.mjs","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport addFormats from 'ajv-formats';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n const parsedErrors: Record<string, FieldError> = {};\n\n const reduceError = (error: AjvError) => {\n // Ajv will return empty instancePath when require error\n if (error.keyword === 'required') {\n error.instancePath += `/${error.params.missingProperty}`;\n }\n\n // `/deepObject/data` -> `deepObject.data`\n const path = error.instancePath.substring(1).replace(/\\//g, '.');\n\n if (!parsedErrors[path]) {\n parsedErrors[path] = {\n message: error.message,\n type: error.keyword,\n };\n }\n\n if (validateAllFieldCriteria) {\n const types = parsedErrors[path].types;\n const messages = types && types[error.keyword];\n\n parsedErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n parsedErrors,\n error.keyword,\n messages\n ? ([] as string[]).concat(messages as string[], error.message || '')\n : error.message,\n ) as FieldError;\n }\n };\n\n for (let index = 0; index < ajvErrors.length; index += 1) {\n const error = ajvErrors[index];\n\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((originalError) => {\n originalError.message = error.message;\n reduceError(originalError);\n });\n } else {\n reduceError(error);\n }\n }\n\n return parsedErrors;\n};\n\n/**\n * Creates a resolver for react-hook-form using Ajv schema validation\n * @param {Schema} schema - The Ajv schema to validate against\n * @param {Object} schemaOptions - Additional schema validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {string} [resolverOptions.mode='async'] - Validation mode\n * @returns {Resolver<Schema>} A resolver function compatible with react-hook-form\n * @example\n * const schema = ajv.compile({\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * age: { type: 'number' }\n * }\n * });\n *\n * useForm({\n * resolver: ajvResolver(schema)\n * });\n */\nexport const ajvResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n const ajv = new Ajv(\n Object.assign(\n {},\n {\n allErrors: true,\n validateSchema: true,\n },\n schemaOptions,\n ),\n );\n\n ajvErrors(ajv);\n addFormats(ajv);\n\n const validate = ajv.compile(\n Object.assign(\n { $async: resolverOptions && resolverOptions.mode === 'async' },\n schema,\n ),\n );\n\n // Ajv mutates the object passed to `validate` in place (e.g. to apply\n // `useDefaults`, `removeAdditional`, or `coerceTypes`). Validating a\n // clone keeps those mutations from leaking into react-hook-form's\n // internal form values, which are passed in by reference.\n const parsedValues = structuredClone(values);\n const valid = validate(parsedValues);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return valid\n ? { values: parsedValues, errors: {} }\n : {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n validate.errors as DefinedError[],\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n };\n"],"names":["parseErrorSchema","ajvErrors","validateAllFieldCriteria","parsedErrors","reduceError","error","keyword","instancePath","params","missingProperty","path","substring","replace","message","type","types","messages","appendErrors","concat","index","length","errors","forEach","originalError","ajvResolver","schema","schemaOptions","resolverOptions","async","values","_","options","ajv","Ajv","Object","assign","allErrors","validateSchema","addFormats","validate","compile","$async","mode","parsedValues","structuredClone","valid","shouldUseNativeValidation","validateFieldsNatively","toNestErrors","criteriaMode"],"mappings":"sMAOA,MAAMA,EAAmBA,CACvBC,EACAC,KAEA,MAAMC,EAA2C,CAAE,EAE7CC,EAAeC,IAEG,aAAlBA,EAAMC,UACRD,EAAME,cAAgB,IAAIF,EAAMG,OAAOC,mBAIzC,MAAMC,EAAOL,EAAME,aAAaI,UAAU,GAAGC,QAAQ,MAAO,KAS5D,GAPKT,EAAaO,KAChBP,EAAaO,GAAQ,CACnBG,QAASR,EAAMQ,QACfC,KAAMT,EAAMC,UAIZJ,EAA0B,CAC5B,MAAMa,EAAQZ,EAAaO,GAAMK,MAC3BC,EAAWD,GAASA,EAAMV,EAAMC,SAEtCH,EAAaO,GAAQO,EACnBP,EACAR,EACAC,EACAE,EAAMC,QACNU,EACK,GAAgBE,OAAOF,EAAsBX,EAAMQ,SAAW,IAC/DR,EAAMQ,QAEd,GAGF,IAAK,IAAIM,EAAQ,EAAGA,EAAQlB,EAAUmB,OAAQD,GAAS,EAAG,CACxD,MAAMd,EAAQJ,EAAUkB,GAEF,iBAAlBd,EAAMC,QACRD,EAAMG,OAAOa,OAAOC,QAASC,IAC3BA,EAAcV,QAAUR,EAAMQ,QAC9BT,EAAYmB,EAAc,GAG5BnB,EAAYC,EAEhB,CAEA,OAAOF,CAAY,EAuBRqB,EACXA,CAACC,EAAQC,EAAeC,EAAkB,CAAE,IAC5CC,MAAOC,EAAQC,EAAGC,KAChB,MAAMC,EAAM,IAAIC,EACdC,OAAOC,OACL,GACA,CACEC,WAAW,EACXC,gBAAgB,GAElBX,IAIJzB,EAAU+B,GACVM,EAAWN,GAEX,MAAMO,EAAWP,EAAIQ,QACnBN,OAAOC,OACL,CAAEM,OAAQd,GAA4C,UAAzBA,EAAgBe,MAC7CjB,IAQEkB,EAAeC,gBAAgBf,GAC/BgB,EAAQN,EAASI,GAIvB,OAFAZ,EAAQe,2BAA6BC,EAAuB,CAAA,EAAIhB,GAEzDc,EACH,CAAEhB,OAAQc,EAActB,OAAQ,CAAA,GAChC,CACEQ,OAAQ,CAAA,EACRR,OAAQ2B,EACNhD,EACEuC,EAASlB,QACRU,EAAQe,2BACkB,QAAzBf,EAAQkB,cAEZlB,GAEH"}
@@ -1,2 +1,2 @@
1
- import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import o from"ajv";import a from"ajv-errors";import s from"ajv-formats";import{appendErrors as t}from"react-hook-form";var i=function(r,e){for(var o={},a=function(r){"required"===r.keyword&&(r.instancePath+="/"+r.params.missingProperty);var a=r.instancePath.substring(1).replace(/\//g,".");if(o[a]||(o[a]={message:r.message,type:r.keyword}),e){var s=o[a].types,i=s&&s[r.keyword];o[a]=t(a,e,o,r.keyword,i?[].concat(i,r.message||""):r.message)}},s=function(){var e=r[i];"errorMessage"===e.keyword?e.params.errors.forEach(function(r){r.message=e.message,a(r)}):a(e)},i=0;i<r.length;i+=1)s();return o},n=function(t,n,m){return void 0===m&&(m={}),function(c,v,f){try{var l=new o(Object.assign({},{allErrors:!0,validateSchema:!0},n));a(l),s(l);var u=l.compile(Object.assign({$async:m&&"async"===m.mode},t)),d=u(c);return f.shouldUseNativeValidation&&r({},f),Promise.resolve(d?{values:c,errors:{}}:{values:{},errors:e(i(u.errors,!f.shouldUseNativeValidation&&"all"===f.criteriaMode),f)})}catch(r){return Promise.reject(r)}}};export{n as ajvResolver};
1
+ import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import o from"ajv";import a from"ajv-errors";import s from"ajv-formats";import{appendErrors as t}from"react-hook-form";var i=function(r,e){for(var o={},a=function(r){"required"===r.keyword&&(r.instancePath+="/"+r.params.missingProperty);var a=r.instancePath.substring(1).replace(/\//g,".");if(o[a]||(o[a]={message:r.message,type:r.keyword}),e){var s=o[a].types,i=s&&s[r.keyword];o[a]=t(a,e,o,r.keyword,i?[].concat(i,r.message||""):r.message)}},s=function(){var e=r[i];"errorMessage"===e.keyword?e.params.errors.forEach(function(r){r.message=e.message,a(r)}):a(e)},i=0;i<r.length;i+=1)s();return o},n=function(t,n,m){return void 0===m&&(m={}),function(c,u,v){try{var f=new o(Object.assign({},{allErrors:!0,validateSchema:!0},n));a(f),s(f);var l=f.compile(Object.assign({$async:m&&"async"===m.mode},t)),d=structuredClone(c),g=l(d);return v.shouldUseNativeValidation&&r({},v),Promise.resolve(g?{values:d,errors:{}}:{values:{},errors:e(i(l.errors,!v.shouldUseNativeValidation&&"all"===v.criteriaMode),v)})}catch(r){return Promise.reject(r)}}};export{n as ajvResolver};
2
2
  //# sourceMappingURL=ajv.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ajv.module.js","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport addFormats from 'ajv-formats';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n const parsedErrors: Record<string, FieldError> = {};\n\n const reduceError = (error: AjvError) => {\n // Ajv will return empty instancePath when require error\n if (error.keyword === 'required') {\n error.instancePath += `/${error.params.missingProperty}`;\n }\n\n // `/deepObject/data` -> `deepObject.data`\n const path = error.instancePath.substring(1).replace(/\\//g, '.');\n\n if (!parsedErrors[path]) {\n parsedErrors[path] = {\n message: error.message,\n type: error.keyword,\n };\n }\n\n if (validateAllFieldCriteria) {\n const types = parsedErrors[path].types;\n const messages = types && types[error.keyword];\n\n parsedErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n parsedErrors,\n error.keyword,\n messages\n ? ([] as string[]).concat(messages as string[], error.message || '')\n : error.message,\n ) as FieldError;\n }\n };\n\n for (let index = 0; index < ajvErrors.length; index += 1) {\n const error = ajvErrors[index];\n\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((originalError) => {\n originalError.message = error.message;\n reduceError(originalError);\n });\n } else {\n reduceError(error);\n }\n }\n\n return parsedErrors;\n};\n\n/**\n * Creates a resolver for react-hook-form using Ajv schema validation\n * @param {Schema} schema - The Ajv schema to validate against\n * @param {Object} schemaOptions - Additional schema validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {string} [resolverOptions.mode='async'] - Validation mode\n * @returns {Resolver<Schema>} A resolver function compatible with react-hook-form\n * @example\n * const schema = ajv.compile({\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * age: { type: 'number' }\n * }\n * });\n *\n * useForm({\n * resolver: ajvResolver(schema)\n * });\n */\nexport const ajvResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n const ajv = new Ajv(\n Object.assign(\n {},\n {\n allErrors: true,\n validateSchema: true,\n },\n schemaOptions,\n ),\n );\n\n ajvErrors(ajv);\n addFormats(ajv);\n\n const validate = ajv.compile(\n Object.assign(\n { $async: resolverOptions && resolverOptions.mode === 'async' },\n schema,\n ),\n );\n\n const valid = validate(values);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return valid\n ? { values, errors: {} }\n : {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n validate.errors as DefinedError[],\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n };\n"],"names":["parseErrorSchema","ajvErrors","validateAllFieldCriteria","parsedErrors","reduceError","error","keyword","instancePath","params","missingProperty","path","substring","replace","message","type","types","messages","appendErrors","concat","_loop","index","errors","forEach","originalError","length","ajvResolver","schema","schemaOptions","resolverOptions","values","_","options","ajv","Ajv","Object","assign","allErrors","validateSchema","addFormats","validate","compile","$async","mode","valid","shouldUseNativeValidation","validateFieldsNatively","Promise","resolve","toNestErrors","criteriaMode","e","reject"],"mappings":"sMAOA,IAAMA,EAAmB,SACvBC,EACAC,GAoCA,IAlCA,IAAMC,EAA2C,CAAA,EAE3CC,EAAc,SAACC,GAEG,aAAlBA,EAAMC,UACRD,EAAME,cAAY,IAAQF,EAAMG,OAAOC,iBAIzC,IAAMC,EAAOL,EAAME,aAAaI,UAAU,GAAGC,QAAQ,MAAO,KAS5D,GAPKT,EAAaO,KAChBP,EAAaO,GAAQ,CACnBG,QAASR,EAAMQ,QACfC,KAAMT,EAAMC,UAIZJ,EAA0B,CAC5B,IAAMa,EAAQZ,EAAaO,GAAMK,MAC3BC,EAAWD,GAASA,EAAMV,EAAMC,SAEtCH,EAAaO,GAAQO,EACnBP,EACAR,EACAC,EACAE,EAAMC,QACNU,EACK,GAAgBE,OAAOF,EAAsBX,EAAMQ,SAAW,IAC/DR,EAAMQ,QAEd,CACF,EAAEM,EAAAA,WAGA,IAAMd,EAAQJ,EAAUmB,GAEF,iBAAlBf,EAAMC,QACRD,EAAMG,OAAOa,OAAOC,QAAQ,SAACC,GAC3BA,EAAcV,QAAUR,EAAMQ,QAC9BT,EAAYmB,EACd,GAEAnB,EAAYC,EAEhB,EAXSe,EAAQ,EAAGA,EAAQnB,EAAUuB,OAAQJ,GAAS,EAACD,IAaxD,OAAOhB,CACT,EAsBasB,EACX,SAACC,EAAQC,EAAeC,GAAoB,YAAL,IAAfA,IAAAA,EAAkB,CAAA,GAAE,SACrCC,EAAQC,EAAGC,GAAO,IACvB,IAAMC,EAAM,IAAIC,EACdC,OAAOC,OACL,CAAE,EACF,CACEC,WAAW,EACXC,gBAAgB,GAElBV,IAIJ1B,EAAU+B,GACVM,EAAWN,GAEX,IAAMO,EAAWP,EAAIQ,QACnBN,OAAOC,OACL,CAAEM,OAAQb,GAA4C,UAAzBA,EAAgBc,MAC7ChB,IAIEiB,EAAQJ,EAASV,GAIvB,OAFAE,EAAQa,2BAA6BC,EAAuB,CAAA,EAAId,GAEhEe,QAAAC,QAAOJ,EACH,CAAEd,OAAAA,EAAQR,OAAQ,CAAI,GACtB,CACEQ,OAAQ,CAAA,EACRR,OAAQ2B,EACNhD,EACEuC,EAASlB,QACRU,EAAQa,2BACkB,QAAzBb,EAAQkB,cAEZlB,IAGV,CAAC,MAAAmB,GAAA,OAAAJ,QAAAK,OAAAD,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"ajv.module.js","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport addFormats from 'ajv-formats';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n const parsedErrors: Record<string, FieldError> = {};\n\n const reduceError = (error: AjvError) => {\n // Ajv will return empty instancePath when require error\n if (error.keyword === 'required') {\n error.instancePath += `/${error.params.missingProperty}`;\n }\n\n // `/deepObject/data` -> `deepObject.data`\n const path = error.instancePath.substring(1).replace(/\\//g, '.');\n\n if (!parsedErrors[path]) {\n parsedErrors[path] = {\n message: error.message,\n type: error.keyword,\n };\n }\n\n if (validateAllFieldCriteria) {\n const types = parsedErrors[path].types;\n const messages = types && types[error.keyword];\n\n parsedErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n parsedErrors,\n error.keyword,\n messages\n ? ([] as string[]).concat(messages as string[], error.message || '')\n : error.message,\n ) as FieldError;\n }\n };\n\n for (let index = 0; index < ajvErrors.length; index += 1) {\n const error = ajvErrors[index];\n\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((originalError) => {\n originalError.message = error.message;\n reduceError(originalError);\n });\n } else {\n reduceError(error);\n }\n }\n\n return parsedErrors;\n};\n\n/**\n * Creates a resolver for react-hook-form using Ajv schema validation\n * @param {Schema} schema - The Ajv schema to validate against\n * @param {Object} schemaOptions - Additional schema validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {string} [resolverOptions.mode='async'] - Validation mode\n * @returns {Resolver<Schema>} A resolver function compatible with react-hook-form\n * @example\n * const schema = ajv.compile({\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * age: { type: 'number' }\n * }\n * });\n *\n * useForm({\n * resolver: ajvResolver(schema)\n * });\n */\nexport const ajvResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n const ajv = new Ajv(\n Object.assign(\n {},\n {\n allErrors: true,\n validateSchema: true,\n },\n schemaOptions,\n ),\n );\n\n ajvErrors(ajv);\n addFormats(ajv);\n\n const validate = ajv.compile(\n Object.assign(\n { $async: resolverOptions && resolverOptions.mode === 'async' },\n schema,\n ),\n );\n\n // Ajv mutates the object passed to `validate` in place (e.g. to apply\n // `useDefaults`, `removeAdditional`, or `coerceTypes`). Validating a\n // clone keeps those mutations from leaking into react-hook-form's\n // internal form values, which are passed in by reference.\n const parsedValues = structuredClone(values);\n const valid = validate(parsedValues);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return valid\n ? { values: parsedValues, errors: {} }\n : {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n validate.errors as DefinedError[],\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n };\n"],"names":["parseErrorSchema","ajvErrors","validateAllFieldCriteria","parsedErrors","reduceError","error","keyword","instancePath","params","missingProperty","path","substring","replace","message","type","types","messages","appendErrors","concat","_loop","index","errors","forEach","originalError","length","ajvResolver","schema","schemaOptions","resolverOptions","values","_","options","ajv","Ajv","Object","assign","allErrors","validateSchema","addFormats","validate","compile","$async","mode","parsedValues","structuredClone","valid","shouldUseNativeValidation","validateFieldsNatively","Promise","resolve","toNestErrors","criteriaMode","e","reject"],"mappings":"sMAOA,IAAMA,EAAmB,SACvBC,EACAC,GAoCA,IAlCA,IAAMC,EAA2C,CAAA,EAE3CC,EAAc,SAACC,GAEG,aAAlBA,EAAMC,UACRD,EAAME,cAAoBF,IAAAA,EAAMG,OAAOC,iBAIzC,IAAMC,EAAOL,EAAME,aAAaI,UAAU,GAAGC,QAAQ,MAAO,KAS5D,GAPKT,EAAaO,KAChBP,EAAaO,GAAQ,CACnBG,QAASR,EAAMQ,QACfC,KAAMT,EAAMC,UAIZJ,EAA0B,CAC5B,IAAMa,EAAQZ,EAAaO,GAAMK,MAC3BC,EAAWD,GAASA,EAAMV,EAAMC,SAEtCH,EAAaO,GAAQO,EACnBP,EACAR,EACAC,EACAE,EAAMC,QACNU,EACK,GAAgBE,OAAOF,EAAsBX,EAAMQ,SAAW,IAC/DR,EAAMQ,QAEd,CACF,EAAEM,EAAAA,WAGA,IAAMd,EAAQJ,EAAUmB,GAEF,iBAAlBf,EAAMC,QACRD,EAAMG,OAAOa,OAAOC,QAAQ,SAACC,GAC3BA,EAAcV,QAAUR,EAAMQ,QAC9BT,EAAYmB,EACd,GAEAnB,EAAYC,EAEhB,EAXSe,EAAQ,EAAGA,EAAQnB,EAAUuB,OAAQJ,GAAS,EAACD,IAaxD,OAAOhB,CACT,EAsBasB,EACX,SAACC,EAAQC,EAAeC,GACjBC,gBADiBD,IAAAA,EAAkB,CAAA,GACnCC,SAAAA,EAAQC,EAAGC,GAAO,IACvB,IAAMC,EAAM,IAAIC,EACdC,OAAOC,OACL,GACA,CACEC,WAAW,EACXC,gBAAgB,GAElBV,IAIJ1B,EAAU+B,GACVM,EAAWN,GAEX,IAAMO,EAAWP,EAAIQ,QACnBN,OAAOC,OACL,CAAEM,OAAQb,GAA4C,UAAzBA,EAAgBc,MAC7ChB,IAQEiB,EAAeC,gBAAgBf,GAC/BgB,EAAQN,EAASI,GAIvB,OAFAZ,EAAQe,2BAA6BC,EAAuB,GAAIhB,GAEhEiB,QAAAC,QAAOJ,EACH,CAAEhB,OAAQc,EAActB,OAAQ,CAAA,GAChC,CACEQ,OAAQ,CAAE,EACVR,OAAQ6B,EACNlD,EACEuC,EAASlB,QACRU,EAAQe,2BACkB,QAAzBf,EAAQoB,cAEZpB,IAGV,CAAC,MAAAqB,GAAA,OAAAJ,QAAAK,OAAAD,EAAA,CAAA,CAAA"}
@@ -1,2 +1,2 @@
1
- !function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@hookform/resolvers"),require("ajv"),require("ajv-errors"),require("ajv-formats"),require("react-hook-form")):"function"==typeof define&&define.amd?define(["exports","@hookform/resolvers","ajv","ajv-errors","ajv-formats","react-hook-form"],r):r((e||self).hookformResolversAjv={},e.hookformResolvers,e.ajv,e.ajvErrors,e.ajvFormats,e.ReactHookForm)}(this,function(e,r,o,a,s,t){function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=/*#__PURE__*/i(o),f=/*#__PURE__*/i(a),l=/*#__PURE__*/i(s),u=function(e,r){for(var o={},a=function(e){"required"===e.keyword&&(e.instancePath+="/"+e.params.missingProperty);var a=e.instancePath.substring(1).replace(/\//g,".");if(o[a]||(o[a]={message:e.message,type:e.keyword}),r){var s=o[a].types,i=s&&s[e.keyword];o[a]=t.appendErrors(a,r,o,e.keyword,i?[].concat(i,e.message||""):e.message)}},s=function(){var r=e[i];"errorMessage"===r.keyword?r.params.errors.forEach(function(e){e.message=r.message,a(e)}):a(r)},i=0;i<e.length;i+=1)s();return o};e.ajvResolver=function(e,o,a){return void 0===a&&(a={}),function(s,t,i){try{var v=new n.default(Object.assign({},{allErrors:!0,validateSchema:!0},o));f.default(v),l.default(v);var c=v.compile(Object.assign({$async:a&&"async"===a.mode},e)),d=c(s);return i.shouldUseNativeValidation&&r.validateFieldsNatively({},i),Promise.resolve(d?{values:s,errors:{}}:{values:{},errors:r.toNestErrors(u(c.errors,!i.shouldUseNativeValidation&&"all"===i.criteriaMode),i)})}catch(e){return Promise.reject(e)}}}});
1
+ !function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@hookform/resolvers"),require("ajv"),require("ajv-errors"),require("ajv-formats"),require("react-hook-form")):"function"==typeof define&&define.amd?define(["exports","@hookform/resolvers","ajv","ajv-errors","ajv-formats","react-hook-form"],r):r((e||self).hookformResolversAjv={},e.hookformResolvers,e.ajv,e.ajvErrors,e.ajvFormats,e.ReactHookForm)}(this,function(e,r,o,a,s,t){function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=/*#__PURE__*/n(o),f=/*#__PURE__*/n(a),u=/*#__PURE__*/n(s),l=function(e,r){for(var o={},a=function(e){"required"===e.keyword&&(e.instancePath+="/"+e.params.missingProperty);var a=e.instancePath.substring(1).replace(/\//g,".");if(o[a]||(o[a]={message:e.message,type:e.keyword}),r){var s=o[a].types,n=s&&s[e.keyword];o[a]=t.appendErrors(a,r,o,e.keyword,n?[].concat(n,e.message||""):e.message)}},s=function(){var r=e[n];"errorMessage"===r.keyword?r.params.errors.forEach(function(e){e.message=r.message,a(e)}):a(r)},n=0;n<e.length;n+=1)s();return o};e.ajvResolver=function(e,o,a){return void 0===a&&(a={}),function(s,t,n){try{var c=new i.default(Object.assign({},{allErrors:!0,validateSchema:!0},o));f.default(c),u.default(c);var d=c.compile(Object.assign({$async:a&&"async"===a.mode},e)),v=structuredClone(s),m=d(v);return n.shouldUseNativeValidation&&r.validateFieldsNatively({},n),Promise.resolve(m?{values:v,errors:{}}:{values:{},errors:r.toNestErrors(l(d.errors,!n.shouldUseNativeValidation&&"all"===n.criteriaMode),n)})}catch(e){return Promise.reject(e)}}}});
2
2
  //# sourceMappingURL=ajv.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ajv.umd.js","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport addFormats from 'ajv-formats';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n const parsedErrors: Record<string, FieldError> = {};\n\n const reduceError = (error: AjvError) => {\n // Ajv will return empty instancePath when require error\n if (error.keyword === 'required') {\n error.instancePath += `/${error.params.missingProperty}`;\n }\n\n // `/deepObject/data` -> `deepObject.data`\n const path = error.instancePath.substring(1).replace(/\\//g, '.');\n\n if (!parsedErrors[path]) {\n parsedErrors[path] = {\n message: error.message,\n type: error.keyword,\n };\n }\n\n if (validateAllFieldCriteria) {\n const types = parsedErrors[path].types;\n const messages = types && types[error.keyword];\n\n parsedErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n parsedErrors,\n error.keyword,\n messages\n ? ([] as string[]).concat(messages as string[], error.message || '')\n : error.message,\n ) as FieldError;\n }\n };\n\n for (let index = 0; index < ajvErrors.length; index += 1) {\n const error = ajvErrors[index];\n\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((originalError) => {\n originalError.message = error.message;\n reduceError(originalError);\n });\n } else {\n reduceError(error);\n }\n }\n\n return parsedErrors;\n};\n\n/**\n * Creates a resolver for react-hook-form using Ajv schema validation\n * @param {Schema} schema - The Ajv schema to validate against\n * @param {Object} schemaOptions - Additional schema validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {string} [resolverOptions.mode='async'] - Validation mode\n * @returns {Resolver<Schema>} A resolver function compatible with react-hook-form\n * @example\n * const schema = ajv.compile({\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * age: { type: 'number' }\n * }\n * });\n *\n * useForm({\n * resolver: ajvResolver(schema)\n * });\n */\nexport const ajvResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n const ajv = new Ajv(\n Object.assign(\n {},\n {\n allErrors: true,\n validateSchema: true,\n },\n schemaOptions,\n ),\n );\n\n ajvErrors(ajv);\n addFormats(ajv);\n\n const validate = ajv.compile(\n Object.assign(\n { $async: resolverOptions && resolverOptions.mode === 'async' },\n schema,\n ),\n );\n\n const valid = validate(values);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return valid\n ? { values, errors: {} }\n : {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n validate.errors as DefinedError[],\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n };\n"],"names":["parseErrorSchema","ajvErrors","validateAllFieldCriteria","parsedErrors","reduceError","error","keyword","instancePath","params","missingProperty","path","substring","replace","message","type","types","messages","appendErrors","concat","_loop","index","errors","forEach","originalError","length","schema","schemaOptions","resolverOptions","values","_","options","ajv","Ajv","Object","assign","allErrors","validateSchema","addFormats","validate","compile","$async","mode","valid","shouldUseNativeValidation","validateFieldsNatively","Promise","resolve","toNestErrors","criteriaMode","e","reject"],"mappings":"koBAOMA,EAAmB,SACvBC,EACAC,GAoCA,IAlCA,IAAMC,EAA2C,CAAA,EAE3CC,EAAc,SAACC,GAEG,aAAlBA,EAAMC,UACRD,EAAME,cAAY,IAAQF,EAAMG,OAAOC,iBAIzC,IAAMC,EAAOL,EAAME,aAAaI,UAAU,GAAGC,QAAQ,MAAO,KAS5D,GAPKT,EAAaO,KAChBP,EAAaO,GAAQ,CACnBG,QAASR,EAAMQ,QACfC,KAAMT,EAAMC,UAIZJ,EAA0B,CAC5B,IAAMa,EAAQZ,EAAaO,GAAMK,MAC3BC,EAAWD,GAASA,EAAMV,EAAMC,SAEtCH,EAAaO,GAAQO,EAAAA,aACnBP,EACAR,EACAC,EACAE,EAAMC,QACNU,EACK,GAAgBE,OAAOF,EAAsBX,EAAMQ,SAAW,IAC/DR,EAAMQ,QAEd,CACF,EAAEM,EAAAA,WAGA,IAAMd,EAAQJ,EAAUmB,GAEF,iBAAlBf,EAAMC,QACRD,EAAMG,OAAOa,OAAOC,QAAQ,SAACC,GAC3BA,EAAcV,QAAUR,EAAMQ,QAC9BT,EAAYmB,EACd,GAEAnB,EAAYC,EAEhB,EAXSe,EAAQ,EAAGA,EAAQnB,EAAUuB,OAAQJ,GAAS,EAACD,IAaxD,OAAOhB,CACT,gBAuBE,SAACsB,EAAQC,EAAeC,GAAoB,YAAL,IAAfA,IAAAA,EAAkB,CAAA,GAAE,SACrCC,EAAQC,EAAGC,GAAO,IACvB,IAAMC,EAAM,IAAIC,EAAAA,QACdC,OAAOC,OACL,CAAE,EACF,CACEC,WAAW,EACXC,gBAAgB,GAElBV,IAIJzB,EAAS,QAAC8B,GACVM,EAAAA,QAAWN,GAEX,IAAMO,EAAWP,EAAIQ,QACnBN,OAAOC,OACL,CAAEM,OAAQb,GAA4C,UAAzBA,EAAgBc,MAC7ChB,IAIEiB,EAAQJ,EAASV,GAIvB,OAFAE,EAAQa,2BAA6BC,EAAAA,uBAAuB,CAAA,EAAId,GAEhEe,QAAAC,QAAOJ,EACH,CAAEd,OAAAA,EAAQP,OAAQ,CAAI,GACtB,CACEO,OAAQ,CAAA,EACRP,OAAQ0B,EAAYA,aAClB/C,EACEsC,EAASjB,QACRS,EAAQa,2BACkB,QAAzBb,EAAQkB,cAEZlB,IAGV,CAAC,MAAAmB,GAAA,OAAAJ,QAAAK,OAAAD,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"ajv.umd.js","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport addFormats from 'ajv-formats';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n const parsedErrors: Record<string, FieldError> = {};\n\n const reduceError = (error: AjvError) => {\n // Ajv will return empty instancePath when require error\n if (error.keyword === 'required') {\n error.instancePath += `/${error.params.missingProperty}`;\n }\n\n // `/deepObject/data` -> `deepObject.data`\n const path = error.instancePath.substring(1).replace(/\\//g, '.');\n\n if (!parsedErrors[path]) {\n parsedErrors[path] = {\n message: error.message,\n type: error.keyword,\n };\n }\n\n if (validateAllFieldCriteria) {\n const types = parsedErrors[path].types;\n const messages = types && types[error.keyword];\n\n parsedErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n parsedErrors,\n error.keyword,\n messages\n ? ([] as string[]).concat(messages as string[], error.message || '')\n : error.message,\n ) as FieldError;\n }\n };\n\n for (let index = 0; index < ajvErrors.length; index += 1) {\n const error = ajvErrors[index];\n\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((originalError) => {\n originalError.message = error.message;\n reduceError(originalError);\n });\n } else {\n reduceError(error);\n }\n }\n\n return parsedErrors;\n};\n\n/**\n * Creates a resolver for react-hook-form using Ajv schema validation\n * @param {Schema} schema - The Ajv schema to validate against\n * @param {Object} schemaOptions - Additional schema validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {string} [resolverOptions.mode='async'] - Validation mode\n * @returns {Resolver<Schema>} A resolver function compatible with react-hook-form\n * @example\n * const schema = ajv.compile({\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * age: { type: 'number' }\n * }\n * });\n *\n * useForm({\n * resolver: ajvResolver(schema)\n * });\n */\nexport const ajvResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n const ajv = new Ajv(\n Object.assign(\n {},\n {\n allErrors: true,\n validateSchema: true,\n },\n schemaOptions,\n ),\n );\n\n ajvErrors(ajv);\n addFormats(ajv);\n\n const validate = ajv.compile(\n Object.assign(\n { $async: resolverOptions && resolverOptions.mode === 'async' },\n schema,\n ),\n );\n\n // Ajv mutates the object passed to `validate` in place (e.g. to apply\n // `useDefaults`, `removeAdditional`, or `coerceTypes`). Validating a\n // clone keeps those mutations from leaking into react-hook-form's\n // internal form values, which are passed in by reference.\n const parsedValues = structuredClone(values);\n const valid = validate(parsedValues);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return valid\n ? { values: parsedValues, errors: {} }\n : {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n validate.errors as DefinedError[],\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n };\n"],"names":["parseErrorSchema","ajvErrors","validateAllFieldCriteria","parsedErrors","reduceError","error","keyword","instancePath","params","missingProperty","path","substring","replace","message","type","types","messages","appendErrors","concat","_loop","index","errors","forEach","originalError","length","schema","schemaOptions","resolverOptions","values","_","options","ajv","Ajv","Object","assign","allErrors","validateSchema","addFormats","validate","compile","$async","mode","parsedValues","structuredClone","valid","shouldUseNativeValidation","validateFieldsNatively","Promise","resolve","toNestErrors","criteriaMode","e","reject"],"mappings":"koBAOMA,EAAmB,SACvBC,EACAC,GAoCA,IAlCA,IAAMC,EAA2C,CAAA,EAE3CC,EAAc,SAACC,GAEG,aAAlBA,EAAMC,UACRD,EAAME,cAAoBF,IAAAA,EAAMG,OAAOC,iBAIzC,IAAMC,EAAOL,EAAME,aAAaI,UAAU,GAAGC,QAAQ,MAAO,KAS5D,GAPKT,EAAaO,KAChBP,EAAaO,GAAQ,CACnBG,QAASR,EAAMQ,QACfC,KAAMT,EAAMC,UAIZJ,EAA0B,CAC5B,IAAMa,EAAQZ,EAAaO,GAAMK,MAC3BC,EAAWD,GAASA,EAAMV,EAAMC,SAEtCH,EAAaO,GAAQO,EAAYA,aAC/BP,EACAR,EACAC,EACAE,EAAMC,QACNU,EACK,GAAgBE,OAAOF,EAAsBX,EAAMQ,SAAW,IAC/DR,EAAMQ,QAEd,CACF,EAAEM,EAAAA,WAGA,IAAMd,EAAQJ,EAAUmB,GAEF,iBAAlBf,EAAMC,QACRD,EAAMG,OAAOa,OAAOC,QAAQ,SAACC,GAC3BA,EAAcV,QAAUR,EAAMQ,QAC9BT,EAAYmB,EACd,GAEAnB,EAAYC,EAEhB,EAXSe,EAAQ,EAAGA,EAAQnB,EAAUuB,OAAQJ,GAAS,EAACD,IAaxD,OAAOhB,CACT,gBAuBE,SAACsB,EAAQC,EAAeC,GACjBC,gBADiBD,IAAAA,EAAkB,CAAA,GACnCC,SAAAA,EAAQC,EAAGC,GAAO,IACvB,IAAMC,EAAM,IAAIC,EAAG,QACjBC,OAAOC,OACL,GACA,CACEC,WAAW,EACXC,gBAAgB,GAElBV,IAIJzB,EAAAA,QAAU8B,GACVM,UAAWN,GAEX,IAAMO,EAAWP,EAAIQ,QACnBN,OAAOC,OACL,CAAEM,OAAQb,GAA4C,UAAzBA,EAAgBc,MAC7ChB,IAQEiB,EAAeC,gBAAgBf,GAC/BgB,EAAQN,EAASI,GAIvB,OAFAZ,EAAQe,2BAA6BC,EAAsBA,uBAAC,GAAIhB,GAEhEiB,QAAAC,QAAOJ,EACH,CAAEhB,OAAQc,EAAcrB,OAAQ,CAAA,GAChC,CACEO,OAAQ,CAAE,EACVP,OAAQ4B,EAAAA,aACNjD,EACEsC,EAASjB,QACRS,EAAQe,2BACkB,QAAzBf,EAAQoB,cAEZpB,IAGV,CAAC,MAAAqB,GAAA,OAAAJ,QAAAK,OAAAD,EAAA,CAAA,CAAA"}
@@ -1,3 +1,4 @@
1
+ import { JSONSchemaType } from 'ajv';
1
2
  import { ajvResolver } from '..';
2
3
  import {
3
4
  fields,
@@ -100,4 +101,43 @@ describe('ajvResolver', () => {
100
101
  ),
101
102
  ).toMatchSnapshot();
102
103
  });
104
+
105
+ it('should not mutate the input values object when `useDefaults` fills in missing properties (#647)', async () => {
106
+ interface DataWithDefaults {
107
+ user: { name: string; lastName: string };
108
+ }
109
+
110
+ const schemaWithDefaults: JSONSchemaType<DataWithDefaults> = {
111
+ type: 'object',
112
+ properties: {
113
+ user: {
114
+ type: 'object',
115
+ properties: {
116
+ name: { type: 'string', default: 'Camilo' },
117
+ lastName: { type: 'string', default: 'A random lastName' },
118
+ },
119
+ required: ['name', 'lastName'],
120
+ },
121
+ },
122
+ required: ['user'],
123
+ };
124
+
125
+ // Simulates react-hook-form's internal form values, which are passed
126
+ // into the resolver by reference and must not be mutated as a side
127
+ // effect of validation.
128
+ const formValues: Partial<DataWithDefaults> = { user: {} as any };
129
+
130
+ const result = await ajvResolver(schemaWithDefaults, {
131
+ useDefaults: true,
132
+ })(formValues as DataWithDefaults, undefined, {
133
+ fields,
134
+ shouldUseNativeValidation,
135
+ });
136
+
137
+ expect(formValues).toEqual({ user: {} });
138
+ expect(result).toEqual({
139
+ values: { user: { name: 'Camilo', lastName: 'A random lastName' } },
140
+ errors: {},
141
+ });
142
+ });
103
143
  });
package/ajv/src/ajv.ts CHANGED
@@ -103,12 +103,17 @@ export const ajvResolver: Resolver =
103
103
  ),
104
104
  );
105
105
 
106
- const valid = validate(values);
106
+ // Ajv mutates the object passed to `validate` in place (e.g. to apply
107
+ // `useDefaults`, `removeAdditional`, or `coerceTypes`). Validating a
108
+ // clone keeps those mutations from leaking into react-hook-form's
109
+ // internal form values, which are passed in by reference.
110
+ const parsedValues = structuredClone(values);
111
+ const valid = validate(parsedValues);
107
112
 
108
113
  options.shouldUseNativeValidation && validateFieldsNatively({}, options);
109
114
 
110
115
  return valid
111
- ? { values, errors: {} }
116
+ ? { values: parsedValues, errors: {} }
112
117
  : {
113
118
  values: {},
114
119
  errors: toNestErrors(
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@hookform/resolvers",
3
3
  "amdName": "hookformResolvers",
4
- "version": "5.5.2",
4
+ "version": "5.5.4",
5
5
  "description": "React Hook Form validation resolvers: Yup, Joi, Superstruct, Zod, Vest, Class Validator, io-ts, Nope, computed-types, TypeBox, arktype, Typanion, Effect-TS and VineJS",
6
6
  "main": "dist/resolvers.js",
7
7
  "module": "dist/resolvers.module.js",
package/zod/dist/zod.d.ts CHANGED
@@ -12,9 +12,7 @@ type NonRawResolverOptions = {
12
12
  interface Zod3Type<O = unknown, I = unknown> {
13
13
  _output: O;
14
14
  _input: I;
15
- _def: {
16
- typeName: string;
17
- };
15
+ _def: object;
18
16
  }
19
17
  interface Zod4Type<Output = unknown, Input = unknown> {
20
18
  _zod: {
package/zod/dist/zod.js CHANGED
@@ -1,2 +1,2 @@
1
- var r=require("@hookform/resolvers"),e=require("react-hook-form");function n(r){if(r&&r.__esModule)return r;var e=Object.create(null);return r&&Object.keys(r).forEach(function(n){if("default"!==n){var t=Object.getOwnPropertyDescriptor(r,n);Object.defineProperty(e,n,t.get?t:{enumerable:!0,get:function(){return r[n]}})}}),e.default=r,e}var t=/*#__PURE__*/n(require("zod/v4/core"));function o(){return o=Object.assign?Object.assign.bind():function(r){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var t in n)({}).hasOwnProperty.call(n,t)&&(r[t]=n[t])}return r},o.apply(null,arguments)}function i(r,e){try{var n=r()}catch(r){return e(r)}return n&&n.then?n.then(void 0,e):n}function s(r,n){for(var t={};r.length;){var o=r[0],i=o.code,s=o.message,a=o.path.join(".");if(!t[a])if("unionErrors"in o){var u,c,l=o.unionErrors.reduce(function(r,e){return e.errors.length<r.errors.length?e:r}).errors[0];t[a]={message:null!=(u=null==l?void 0:l.message)?u:s,type:null!=(c=null==l?void 0:l.code)?c:i}}else t[a]={message:s,type:i};if("unionErrors"in o&&o.unionErrors.forEach(function(e){return e.errors.forEach(function(e){return r.push(e)})}),n){var f=t[a].types,d=f&&f[o.code];t[a]=e.appendErrors(a,n,t,i,d?[].concat(d,o.message):o.message)}r.shift()}return t}function a(r,n){for(var t={},i=function(){var i=r[0],s=i.code,a=i.message,u=i.path.join(".");if(!t[u])if("invalid_union"===i.code&&i.errors.length>0){var c,l,f=i.errors.reduce(function(r,e){return e.length<r.length?e:r})[0];t[u]={message:null!=(c=null==f?void 0:f.message)?c:a,type:null!=(l=null==f?void 0:f.code)?l:s}}else t[u]={message:a,type:s};if("invalid_union"===i.code&&i.errors.forEach(function(e){return e.forEach(function(e){return r.push(o({},e,{path:[].concat(i.path,e.path)}))})}),n){var d=t[u].types,v=d&&d[i.code];t[u]=e.appendErrors(u,n,t,s,v?[].concat(v,i.message):i.message)}r.shift()};r.length;)i();return t}exports.zodResolver=function(e,n,o){if(void 0===o&&(o={}),function(r){return"_def"in r&&"object"==typeof r._def&&"typeName"in r._def}(e))return function(t,a,u){try{return Promise.resolve(i(function(){return Promise.resolve(e["sync"===o.mode?"parse":"parseAsync"](t,n)).then(function(e){return u.shouldUseNativeValidation&&r.validateFieldsNatively({},u),{errors:{},values:o.raw?Object.assign({},t):e}})},function(e){if(function(r){return Array.isArray(null==r?void 0:r.issues)}(e))return{values:{},errors:r.toNestErrors(s(e.errors,!u.shouldUseNativeValidation&&"all"===u.criteriaMode),u)};throw e}))}catch(r){return Promise.reject(r)}};if(function(r){return"_zod"in r&&"object"==typeof r._zod}(e))return function(s,u,c){try{return Promise.resolve(i(function(){function t(e){return c.shouldUseNativeValidation&&r.validateFieldsNatively({},c),{errors:{},values:o.raw?Object.assign({},s):e}}var i=e;return"sync"===o.mode?t(i.parse(s,n)):Promise.resolve(i.parseAsync(s,n)).then(t)},function(e){if(function(r){return r instanceof t.$ZodError}(e))return{values:{},errors:r.toNestErrors(a(e.issues,!c.shouldUseNativeValidation&&"all"===c.criteriaMode),c)};throw e}))}catch(r){return Promise.reject(r)}};throw new Error("Invalid input: not a Zod schema")};
1
+ var r=require("@hookform/resolvers"),e=require("react-hook-form");function n(r){if(r&&r.__esModule)return r;var e=Object.create(null);return r&&Object.keys(r).forEach(function(n){if("default"!==n){var t=Object.getOwnPropertyDescriptor(r,n);Object.defineProperty(e,n,t.get?t:{enumerable:!0,get:function(){return r[n]}})}}),e.default=r,e}var t=/*#__PURE__*/n(require("zod/v4/core"));function o(){return o=Object.assign?Object.assign.bind():function(r){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var t in n)({}).hasOwnProperty.call(n,t)&&(r[t]=n[t])}return r},o.apply(null,arguments)}function s(r,e){try{var n=r()}catch(r){return e(r)}return n&&n.then?n.then(void 0,e):n}function i(r,n){for(var t={};r.length;){var o=r[0],s=o.code,i=o.message,a=o.path.join(".");if(!t[a])if("unionErrors"in o){var u,c,l=o.unionErrors.reduce(function(r,e){return e.errors.length<r.errors.length?e:r}).errors[0];t[a]={message:null!=(u=null==l?void 0:l.message)?u:i,type:null!=(c=null==l?void 0:l.code)?c:s}}else t[a]={message:i,type:s};if("unionErrors"in o&&o.unionErrors.forEach(function(e){return e.errors.forEach(function(e){return r.push(e)})}),n){var f=t[a].types,d=f&&f[o.code];t[a]=e.appendErrors(a,n,t,s,d?[].concat(d,o.message):o.message)}r.shift()}return t}function a(r,n){for(var t={},s=function(){var s=r[0],i=s.code,a=s.message,u=s.path.join(".");if(!t[u])if("invalid_union"===s.code&&s.errors.length>0){var c,l,f=s.errors.reduce(function(r,e){return e.length<r.length?e:r})[0];t[u]={message:null!=(c=null==f?void 0:f.message)?c:a,type:null!=(l=null==f?void 0:f.code)?l:i}}else t[u]={message:a,type:i};if("invalid_union"===s.code&&s.errors.forEach(function(e){return e.forEach(function(e){return r.push(o({},e,{path:[].concat(s.path,e.path)}))})}),n){var d=t[u].types,v=d&&d[s.code];t[u]=e.appendErrors(u,n,t,i,v?[].concat(v,s.message):s.message)}r.shift()};r.length;)s();return t}exports.zodResolver=function(e,n,o){if(void 0===o&&(o={}),function(r){return"_zod"in r&&"object"==typeof r._zod}(e))return function(i,u,c){try{return Promise.resolve(s(function(){function t(e){return c.shouldUseNativeValidation&&r.validateFieldsNatively({},c),{errors:{},values:o.raw?Object.assign({},i):e}}var s=e;return"sync"===o.mode?t(s.parse(i,n)):Promise.resolve(s.parseAsync(i,n)).then(t)},function(e){if(function(r){return r instanceof t.$ZodError}(e))return{values:{},errors:r.toNestErrors(a(e.issues,!c.shouldUseNativeValidation&&"all"===c.criteriaMode),c)};throw e}))}catch(r){return Promise.reject(r)}};if(function(r){return"_def"in r&&"object"==typeof r._def}(e))return function(t,a,u){try{return Promise.resolve(s(function(){return Promise.resolve(e["sync"===o.mode?"parse":"parseAsync"](t,n)).then(function(e){return u.shouldUseNativeValidation&&r.validateFieldsNatively({},u),{errors:{},values:o.raw?Object.assign({},t):e}})},function(e){if(function(r){return Array.isArray(null==r?void 0:r.issues)}(e))return{values:{},errors:r.toNestErrors(i(e.errors,!u.shouldUseNativeValidation&&"all"===u.criteriaMode),u)};throw e}))}catch(r){return Promise.reject(r)}};throw new Error("Invalid input: not a Zod schema")};
2
2
  //# sourceMappingURL=zod.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zod.js","sources":["../src/zod.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport {\n FieldError,\n FieldValues,\n Resolver,\n ResolverError,\n ResolverSuccess,\n appendErrors,\n} from 'react-hook-form';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4/core';\n\nconst isZod3Error = (error: any): error is z3.ZodError => {\n return Array.isArray(error?.issues);\n};\nconst isZod3Schema = (schema: any): schema is z3.ZodSchema => {\n return (\n '_def' in schema &&\n typeof schema._def === 'object' &&\n 'typeName' in schema._def\n );\n};\nconst isZod4Error = (error: any): error is z4.$ZodError => {\n // instanceof is safe in Zod 4 (uses Symbol.hasInstance)\n return error instanceof z4.$ZodError;\n};\nconst isZod4Schema = (schema: any): schema is z4.$ZodType => {\n return '_zod' in schema && typeof schema._zod === 'object';\n};\n\nfunction parseZod3Issues(\n zodErrors: z3.ZodIssue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors: Record<string, FieldError> = {};\n for (; zodErrors.length; ) {\n const error = zodErrors[0];\n const { code, message, path } = error;\n const _path = path.join('.');\n\n if (!errors[_path]) {\n if ('unionErrors' in error) {\n // Surface the error from whichever union member came closest to\n // matching (fewest issues), rather than always the first member —\n // the first member isn't necessarily the one the input was meant for.\n const closestUnionError = error.unionErrors.reduce(\n (closest, current) =>\n current.errors.length < closest.errors.length ? current : closest,\n );\n // Fall back to the union issue's own message/code if the closest\n // member somehow has no issues of its own (shouldn't happen, but\n // avoids ever throwing on an unexpected/malformed union shape).\n const unionError = closestUnionError.errors[0];\n\n errors[_path] = {\n message: unionError?.message ?? message,\n type: unionError?.code ?? code,\n };\n } else {\n errors[_path] = { message, type: code };\n }\n }\n\n if ('unionErrors' in error) {\n error.unionErrors.forEach((unionError) =>\n unionError.errors.forEach((e) => zodErrors.push(e)),\n );\n }\n\n if (validateAllFieldCriteria) {\n const types = errors[_path].types;\n const messages = types && types[error.code];\n\n errors[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n errors,\n code,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n zodErrors.shift();\n }\n\n return errors;\n}\n\nfunction parseZod4Issues(\n zodErrors: z4.$ZodIssue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors: Record<string, FieldError> = {};\n // const _zodErrors = zodErrors as z4.$ZodISsue; //\n for (; zodErrors.length; ) {\n const error = zodErrors[0];\n const { code, message, path } = error;\n const _path = path.join('.');\n\n if (!errors[_path]) {\n if (error.code === 'invalid_union' && error.errors.length > 0) {\n // Surface the error from whichever union member came closest to\n // matching (fewest issues), rather than always the first member —\n // the first member isn't necessarily the one the input was meant for.\n const closestBranch = error.errors.reduce((closest, branch) =>\n branch.length < closest.length ? branch : closest,\n );\n // Fall back to the union issue's own message/code if the closest\n // branch somehow has no issues of its own (shouldn't happen — a\n // 0-issue branch means that branch matched — but this guarantees we\n // never throw on an unexpected/malformed union shape, e.g. a \"no\n // matching discriminator\" issue nested in a way we haven't seen).\n const unionError = closestBranch[0];\n\n errors[_path] = {\n message: unionError?.message ?? message,\n type: unionError?.code ?? code,\n };\n } else {\n errors[_path] = { message, type: code };\n }\n }\n\n if (error.code === 'invalid_union') {\n error.errors.forEach((unionError) =>\n unionError.forEach((e) =>\n zodErrors.push({ ...e, path: [...error.path, ...e.path] }),\n ),\n );\n }\n\n if (validateAllFieldCriteria) {\n const types = errors[_path].types;\n const messages = types && types[error.code];\n\n errors[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n errors,\n code,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n zodErrors.shift();\n }\n\n return errors;\n}\n\ntype RawResolverOptions = {\n mode?: 'async' | 'sync';\n raw: true;\n};\ntype NonRawResolverOptions = {\n mode?: 'async' | 'sync';\n raw?: false;\n};\n\n// minimal interfaces to avoid asssignability issues between versions\ninterface Zod3Type<O = unknown, I = unknown> {\n _output: O;\n _input: I;\n _def: {\n typeName: string;\n };\n}\n\n// minimal interface to avoid assignability issues between zod v4 patch/minor\n// releases, which brand the full `$ZodType` shape with an exact version literal\n// (e.g. `_zod.version.minor`)\ninterface Zod4Type<Output = unknown, Input = unknown> {\n _zod: {\n output: Output;\n input: Input;\n };\n}\n\n// some type magic to make versions pre-3.25.0 still work\ntype IsUnresolved<T> = PropertyKey extends keyof T ? true : false;\ntype UnresolvedFallback<T, Fallback> = IsUnresolved<typeof z3> extends true\n ? Fallback\n : T;\ntype FallbackIssue = {\n code: string;\n message: string;\n path: (string | number)[];\n};\ntype Zod3ParseParams = UnresolvedFallback<\n z3.ParseParams,\n // fallback if user is on <3.25.0\n {\n path?: (string | number)[];\n errorMap?: (\n iss: FallbackIssue,\n ctx: {\n defaultError: string;\n data: any;\n },\n ) => { message: string };\n async?: boolean;\n }\n>;\ntype Zod4ParseParams = UnresolvedFallback<\n z4.ParseContext<z4.$ZodIssue>,\n // fallback if user is on <3.25.0\n {\n readonly error?: (\n iss: FallbackIssue,\n ) => null | undefined | string | { message: string };\n readonly reportInput?: boolean;\n readonly jitless?: boolean;\n }\n>;\n\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: Zod3Type<Output, Input>,\n schemaOptions?: Zod3ParseParams,\n resolverOptions?: NonRawResolverOptions,\n): Resolver<Input, Context, Output>;\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: Zod3Type<Output, Input>,\n schemaOptions: Zod3ParseParams | undefined,\n resolverOptions: RawResolverOptions,\n): Resolver<Input, Context, Input>;\n// the Zod 4 overloads need to be generic for complicated reasons\nexport function zodResolver<\n Input extends FieldValues,\n Context,\n Output,\n T extends Zod4Type<Output, Input> = Zod4Type<Output, Input>,\n>(\n schema: T,\n schemaOptions?: Zod4ParseParams, // already partial\n resolverOptions?: NonRawResolverOptions,\n): Resolver<z4.input<T>, Context, z4.output<T>>;\nexport function zodResolver<\n Input extends FieldValues,\n Context,\n Output,\n T extends Zod4Type<Output, Input> = Zod4Type<Output, Input>,\n>(\n schema: Zod4Type<Output, Input>,\n schemaOptions: Zod4ParseParams | undefined, // already partial\n resolverOptions: RawResolverOptions,\n): Resolver<z4.input<T>, Context, z4.input<T>>;\n/**\n * Creates a resolver function for react-hook-form that validates form data using a Zod schema\n * @param {z3.ZodSchema<Input>} schema - The Zod schema used to validate the form data\n * @param {Partial<z3.ParseParams>} [schemaOptions] - Optional configuration options for Zod parsing\n * @param {Object} [resolverOptions] - Optional resolver-specific configuration\n * @param {('async'|'sync')} [resolverOptions.mode='async'] - Validation mode. Use 'sync' for synchronous validation\n * @param {boolean} [resolverOptions.raw=false] - If true, returns the raw form values instead of the parsed data\n * @returns {Resolver<z3.output<typeof schema>>} A resolver function compatible with react-hook-form\n * @throws {Error} Throws if validation fails with a non-Zod error\n * @example\n * const schema = z3.object({\n * name: z3.string().min(2),\n * age: z3.number().min(18)\n * });\n *\n * useForm({\n * resolver: zodResolver(schema)\n * });\n */\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: object,\n schemaOptions?: object,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Output | Input> {\n if (isZod3Schema(schema)) {\n return async (values: Input, _, options) => {\n try {\n const data = await schema[\n resolverOptions.mode === 'sync' ? 'parse' : 'parseAsync'\n ](values, schemaOptions);\n\n options.shouldUseNativeValidation &&\n validateFieldsNatively({}, options);\n\n return {\n errors: {},\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n } satisfies ResolverSuccess<Output | Input>;\n } catch (error) {\n if (isZod3Error(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseZod3Issues(\n error.errors,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n } satisfies ResolverError<Input>;\n }\n\n throw error;\n }\n };\n }\n\n if (isZod4Schema(schema)) {\n return async (values: Input, _, options) => {\n try {\n // Call the schema's own bound `parse`/`parseAsync` method rather\n // than the standalone `z4.parse`/`z4.parseAsync` functions. Those\n // standalone functions read from this module's own imported\n // `zod/v4/core`, which — under bundlers that can resolve `zod` and\n // `zod/v4/core` to two distinct module instances (e.g. Metro with\n // package-exports resolution enabled) — may not be the same zod\n // instance the schema was created with, silently dropping any\n // global config (`z.config()`) or locale the app configured on its\n // own zod instance. The schema's own method is always bound to\n // whichever zod instance actually created it.\n const classicSchema = schema as unknown as {\n parse: (values: unknown, schemaOptions: unknown) => unknown;\n parseAsync: (\n values: unknown,\n schemaOptions: unknown,\n ) => Promise<unknown>;\n };\n const data: any =\n resolverOptions.mode === 'sync'\n ? classicSchema.parse(values, schemaOptions)\n : await classicSchema.parseAsync(values, schemaOptions);\n\n options.shouldUseNativeValidation &&\n validateFieldsNatively({}, options);\n\n return {\n errors: {},\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n } satisfies ResolverSuccess<Output | Input>;\n } catch (error) {\n if (isZod4Error(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseZod4Issues(\n error.issues,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n } satisfies ResolverError<Input>;\n }\n\n throw error;\n }\n };\n }\n\n throw new Error('Invalid input: not a Zod schema');\n}\n"],"names":["parseZod3Issues","zodErrors","validateAllFieldCriteria","errors","length","error","code","message","_path","path","join","_unionError$message","_unionError$code","unionError","unionErrors","reduce","closest","current","type","forEach","e","push","types","messages","appendErrors","concat","shift","parseZod4Issues","_loop","_unionError$message2","_unionError$code2","branch","_extends","schema","schemaOptions","resolverOptions","_def","isZod3Schema","values","_","options","Promise","resolve","_catch","mode","then","data","shouldUseNativeValidation","validateFieldsNatively","raw","Object","assign","Array","isArray","issues","isZod3Error","toNestErrors","criteriaMode","reject","_zod","isZod4Schema","_temp2","classicSchema","parse","parseAsync","z4","$ZodError","isZod4Error","Error"],"mappings":"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"}
1
+ {"version":3,"file":"zod.js","sources":["../src/zod.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport {\n FieldError,\n FieldValues,\n Resolver,\n ResolverError,\n ResolverSuccess,\n appendErrors,\n} from 'react-hook-form';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4/core';\n\nconst isZod3Error = (error: any): error is z3.ZodError => {\n return Array.isArray(error?.issues);\n};\nconst isZod3Schema = (schema: any): schema is z3.ZodSchema => {\n // Deliberately doesn't require `typeName` in `_def` — dynamically selected\n // schemas typed via the generic `z.ZodType<Output>` annotation (rather than\n // a concrete subclass like `ZodObject`) don't statically expose `typeName`,\n // even though they're genuine Zod 3 schema instances at runtime.\n return '_def' in schema && typeof schema._def === 'object';\n};\nconst isZod4Error = (error: any): error is z4.$ZodError => {\n // instanceof is safe in Zod 4 (uses Symbol.hasInstance)\n return error instanceof z4.$ZodError;\n};\nconst isZod4Schema = (schema: any): schema is z4.$ZodType => {\n return '_zod' in schema && typeof schema._zod === 'object';\n};\n\nfunction parseZod3Issues(\n zodErrors: z3.ZodIssue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors: Record<string, FieldError> = {};\n for (; zodErrors.length; ) {\n const error = zodErrors[0];\n const { code, message, path } = error;\n const _path = path.join('.');\n\n if (!errors[_path]) {\n if ('unionErrors' in error) {\n // Surface the error from whichever union member came closest to\n // matching (fewest issues), rather than always the first member —\n // the first member isn't necessarily the one the input was meant for.\n const closestUnionError = error.unionErrors.reduce(\n (closest, current) =>\n current.errors.length < closest.errors.length ? current : closest,\n );\n // Fall back to the union issue's own message/code if the closest\n // member somehow has no issues of its own (shouldn't happen, but\n // avoids ever throwing on an unexpected/malformed union shape).\n const unionError = closestUnionError.errors[0];\n\n errors[_path] = {\n message: unionError?.message ?? message,\n type: unionError?.code ?? code,\n };\n } else {\n errors[_path] = { message, type: code };\n }\n }\n\n if ('unionErrors' in error) {\n error.unionErrors.forEach((unionError) =>\n unionError.errors.forEach((e) => zodErrors.push(e)),\n );\n }\n\n if (validateAllFieldCriteria) {\n const types = errors[_path].types;\n const messages = types && types[error.code];\n\n errors[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n errors,\n code,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n zodErrors.shift();\n }\n\n return errors;\n}\n\nfunction parseZod4Issues(\n zodErrors: z4.$ZodIssue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors: Record<string, FieldError> = {};\n // const _zodErrors = zodErrors as z4.$ZodISsue; //\n for (; zodErrors.length; ) {\n const error = zodErrors[0];\n const { code, message, path } = error;\n const _path = path.join('.');\n\n if (!errors[_path]) {\n if (error.code === 'invalid_union' && error.errors.length > 0) {\n // Surface the error from whichever union member came closest to\n // matching (fewest issues), rather than always the first member —\n // the first member isn't necessarily the one the input was meant for.\n const closestBranch = error.errors.reduce((closest, branch) =>\n branch.length < closest.length ? branch : closest,\n );\n // Fall back to the union issue's own message/code if the closest\n // branch somehow has no issues of its own (shouldn't happen — a\n // 0-issue branch means that branch matched — but this guarantees we\n // never throw on an unexpected/malformed union shape, e.g. a \"no\n // matching discriminator\" issue nested in a way we haven't seen).\n const unionError = closestBranch[0];\n\n errors[_path] = {\n message: unionError?.message ?? message,\n type: unionError?.code ?? code,\n };\n } else {\n errors[_path] = { message, type: code };\n }\n }\n\n if (error.code === 'invalid_union') {\n error.errors.forEach((unionError) =>\n unionError.forEach((e) =>\n zodErrors.push({ ...e, path: [...error.path, ...e.path] }),\n ),\n );\n }\n\n if (validateAllFieldCriteria) {\n const types = errors[_path].types;\n const messages = types && types[error.code];\n\n errors[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n errors,\n code,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n zodErrors.shift();\n }\n\n return errors;\n}\n\ntype RawResolverOptions = {\n mode?: 'async' | 'sync';\n raw: true;\n};\ntype NonRawResolverOptions = {\n mode?: 'async' | 'sync';\n raw?: false;\n};\n\n// minimal interfaces to avoid asssignability issues between versions\ninterface Zod3Type<O = unknown, I = unknown> {\n _output: O;\n _input: I;\n _def: object;\n}\n\n// minimal interface to avoid assignability issues between zod v4 patch/minor\n// releases, which brand the full `$ZodType` shape with an exact version literal\n// (e.g. `_zod.version.minor`)\ninterface Zod4Type<Output = unknown, Input = unknown> {\n _zod: {\n output: Output;\n input: Input;\n };\n}\n\n// some type magic to make versions pre-3.25.0 still work\ntype IsUnresolved<T> = PropertyKey extends keyof T ? true : false;\ntype UnresolvedFallback<T, Fallback> = IsUnresolved<typeof z3> extends true\n ? Fallback\n : T;\ntype FallbackIssue = {\n code: string;\n message: string;\n path: (string | number)[];\n};\ntype Zod3ParseParams = UnresolvedFallback<\n z3.ParseParams,\n // fallback if user is on <3.25.0\n {\n path?: (string | number)[];\n errorMap?: (\n iss: FallbackIssue,\n ctx: {\n defaultError: string;\n data: any;\n },\n ) => { message: string };\n async?: boolean;\n }\n>;\ntype Zod4ParseParams = UnresolvedFallback<\n z4.ParseContext<z4.$ZodIssue>,\n // fallback if user is on <3.25.0\n {\n readonly error?: (\n iss: FallbackIssue,\n ) => null | undefined | string | { message: string };\n readonly reportInput?: boolean;\n readonly jitless?: boolean;\n }\n>;\n\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: Zod3Type<Output, Input>,\n schemaOptions?: Zod3ParseParams,\n resolverOptions?: NonRawResolverOptions,\n): Resolver<Input, Context, Output>;\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: Zod3Type<Output, Input>,\n schemaOptions: Zod3ParseParams | undefined,\n resolverOptions: RawResolverOptions,\n): Resolver<Input, Context, Input>;\n// the Zod 4 overloads need to be generic for complicated reasons\nexport function zodResolver<\n Input extends FieldValues,\n Context,\n Output,\n T extends Zod4Type<Output, Input> = Zod4Type<Output, Input>,\n>(\n schema: T,\n schemaOptions?: Zod4ParseParams, // already partial\n resolverOptions?: NonRawResolverOptions,\n): Resolver<z4.input<T>, Context, z4.output<T>>;\nexport function zodResolver<\n Input extends FieldValues,\n Context,\n Output,\n T extends Zod4Type<Output, Input> = Zod4Type<Output, Input>,\n>(\n schema: Zod4Type<Output, Input>,\n schemaOptions: Zod4ParseParams | undefined, // already partial\n resolverOptions: RawResolverOptions,\n): Resolver<z4.input<T>, Context, z4.input<T>>;\n/**\n * Creates a resolver function for react-hook-form that validates form data using a Zod schema\n * @param {z3.ZodSchema<Input>} schema - The Zod schema used to validate the form data\n * @param {Partial<z3.ParseParams>} [schemaOptions] - Optional configuration options for Zod parsing\n * @param {Object} [resolverOptions] - Optional resolver-specific configuration\n * @param {('async'|'sync')} [resolverOptions.mode='async'] - Validation mode. Use 'sync' for synchronous validation\n * @param {boolean} [resolverOptions.raw=false] - If true, returns the raw form values instead of the parsed data\n * @returns {Resolver<z3.output<typeof schema>>} A resolver function compatible with react-hook-form\n * @throws {Error} Throws if validation fails with a non-Zod error\n * @example\n * const schema = z3.object({\n * name: z3.string().min(2),\n * age: z3.number().min(18)\n * });\n *\n * useForm({\n * resolver: zodResolver(schema)\n * });\n */\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: object,\n schemaOptions?: object,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Output | Input> {\n // Zod 4 is checked first: its `_zod` marker is unambiguous, whereas the\n // Zod 3 check below only requires an object-shaped `_def` (to support\n // dynamically-selected schemas typed via the generic `z.ZodType<Output>`\n // annotation, see `isZod3Schema`) — and Zod 4 schemas also have an\n // object-shaped `_def`, so they'd otherwise be misdetected as Zod 3.\n if (isZod4Schema(schema)) {\n return async (values: Input, _, options) => {\n try {\n // Call the schema's own bound `parse`/`parseAsync` method rather\n // than the standalone `z4.parse`/`z4.parseAsync` functions. Those\n // standalone functions read from this module's own imported\n // `zod/v4/core`, which — under bundlers that can resolve `zod` and\n // `zod/v4/core` to two distinct module instances (e.g. Metro with\n // package-exports resolution enabled) — may not be the same zod\n // instance the schema was created with, silently dropping any\n // global config (`z.config()`) or locale the app configured on its\n // own zod instance. The schema's own method is always bound to\n // whichever zod instance actually created it.\n const classicSchema = schema as unknown as {\n parse: (values: unknown, schemaOptions: unknown) => unknown;\n parseAsync: (\n values: unknown,\n schemaOptions: unknown,\n ) => Promise<unknown>;\n };\n const data: any =\n resolverOptions.mode === 'sync'\n ? classicSchema.parse(values, schemaOptions)\n : await classicSchema.parseAsync(values, schemaOptions);\n\n options.shouldUseNativeValidation &&\n validateFieldsNatively({}, options);\n\n return {\n errors: {},\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n } satisfies ResolverSuccess<Output | Input>;\n } catch (error) {\n if (isZod4Error(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseZod4Issues(\n error.issues,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n } satisfies ResolverError<Input>;\n }\n\n throw error;\n }\n };\n }\n\n if (isZod3Schema(schema)) {\n return async (values: Input, _, options) => {\n try {\n const data = await schema[\n resolverOptions.mode === 'sync' ? 'parse' : 'parseAsync'\n ](values, schemaOptions);\n\n options.shouldUseNativeValidation &&\n validateFieldsNatively({}, options);\n\n return {\n errors: {},\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n } satisfies ResolverSuccess<Output | Input>;\n } catch (error) {\n if (isZod3Error(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseZod3Issues(\n error.errors,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n } satisfies ResolverError<Input>;\n }\n\n throw error;\n }\n };\n }\n\n throw new Error('Invalid input: not a Zod schema');\n}\n"],"names":["parseZod3Issues","zodErrors","validateAllFieldCriteria","errors","length","error","code","message","_path","path","join","_unionError$message","_unionError$code","unionError","unionErrors","reduce","closest","current","type","forEach","e","push","types","messages","appendErrors","concat","shift","parseZod4Issues","_loop","_unionError$message2","_unionError$code2","branch","_extends","schema","schemaOptions","resolverOptions","_zod","isZod4Schema","values","_","options","Promise","resolve","_catch","_temp2","data","shouldUseNativeValidation","validateFieldsNatively","raw","Object","assign","classicSchema","mode","parse","parseAsync","then","z4","$ZodError","isZod4Error","toNestErrors","issues","criteriaMode","reject","_def","isZod3Schema","Array","isArray","isZod3Error","Error"],"mappings":"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"}
package/zod/dist/zod.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import{appendErrors as n}from"react-hook-form";import*as o from"zod/v4/core";function t(){return t=Object.assign?Object.assign.bind():function(r){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var o in n)({}).hasOwnProperty.call(n,o)&&(r[o]=n[o])}return r},t.apply(null,arguments)}function s(r,e){try{var n=r()}catch(r){return e(r)}return n&&n.then?n.then(void 0,e):n}function i(r,e){for(var o={};r.length;){var t=r[0],s=t.code,i=t.message,a=t.path.join(".");if(!o[a])if("unionErrors"in t){var u,c,l=t.unionErrors.reduce(function(r,e){return e.errors.length<r.errors.length?e:r}).errors[0];o[a]={message:null!=(u=null==l?void 0:l.message)?u:i,type:null!=(c=null==l?void 0:l.code)?c:s}}else o[a]={message:i,type:s};if("unionErrors"in t&&t.unionErrors.forEach(function(e){return e.errors.forEach(function(e){return r.push(e)})}),e){var f=o[a].types,d=f&&f[t.code];o[a]=n(a,e,o,s,d?[].concat(d,t.message):t.message)}r.shift()}return o}function a(r,e){for(var o={},s=function(){var s=r[0],i=s.code,a=s.message,u=s.path.join(".");if(!o[u])if("invalid_union"===s.code&&s.errors.length>0){var c,l,f=s.errors.reduce(function(r,e){return e.length<r.length?e:r})[0];o[u]={message:null!=(c=null==f?void 0:f.message)?c:a,type:null!=(l=null==f?void 0:f.code)?l:i}}else o[u]={message:a,type:i};if("invalid_union"===s.code&&s.errors.forEach(function(e){return e.forEach(function(e){return r.push(t({},e,{path:[].concat(s.path,e.path)}))})}),e){var d=o[u].types,h=d&&d[s.code];o[u]=n(u,e,o,i,h?[].concat(h,s.message):s.message)}r.shift()};r.length;)s();return o}function u(n,t,u){if(void 0===u&&(u={}),function(r){return"_def"in r&&"object"==typeof r._def&&"typeName"in r._def}(n))return function(o,a,c){try{return Promise.resolve(s(function(){return Promise.resolve(n["sync"===u.mode?"parse":"parseAsync"](o,t)).then(function(e){return c.shouldUseNativeValidation&&r({},c),{errors:{},values:u.raw?Object.assign({},o):e}})},function(r){if(function(r){return Array.isArray(null==r?void 0:r.issues)}(r))return{values:{},errors:e(i(r.errors,!c.shouldUseNativeValidation&&"all"===c.criteriaMode),c)};throw r}))}catch(r){return Promise.reject(r)}};if(function(r){return"_zod"in r&&"object"==typeof r._zod}(n))return function(i,c,l){try{return Promise.resolve(s(function(){function e(e){return l.shouldUseNativeValidation&&r({},l),{errors:{},values:u.raw?Object.assign({},i):e}}var o=n;return"sync"===u.mode?e(o.parse(i,t)):Promise.resolve(o.parseAsync(i,t)).then(e)},function(r){if(function(r){return r instanceof o.$ZodError}(r))return{values:{},errors:e(a(r.issues,!l.shouldUseNativeValidation&&"all"===l.criteriaMode),l)};throw r}))}catch(r){return Promise.reject(r)}};throw new Error("Invalid input: not a Zod schema")}export{u as zodResolver};
1
+ import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import{appendErrors as n}from"react-hook-form";import*as o from"zod/v4/core";function t(){return t=Object.assign?Object.assign.bind():function(r){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var o in n)({}).hasOwnProperty.call(n,o)&&(r[o]=n[o])}return r},t.apply(null,arguments)}function s(r,e){try{var n=r()}catch(r){return e(r)}return n&&n.then?n.then(void 0,e):n}function i(r,e){for(var o={};r.length;){var t=r[0],s=t.code,i=t.message,u=t.path.join(".");if(!o[u])if("unionErrors"in t){var a,c,l=t.unionErrors.reduce(function(r,e){return e.errors.length<r.errors.length?e:r}).errors[0];o[u]={message:null!=(a=null==l?void 0:l.message)?a:i,type:null!=(c=null==l?void 0:l.code)?c:s}}else o[u]={message:i,type:s};if("unionErrors"in t&&t.unionErrors.forEach(function(e){return e.errors.forEach(function(e){return r.push(e)})}),e){var f=o[u].types,d=f&&f[t.code];o[u]=n(u,e,o,s,d?[].concat(d,t.message):t.message)}r.shift()}return o}function u(r,e){for(var o={},s=function(){var s=r[0],i=s.code,u=s.message,a=s.path.join(".");if(!o[a])if("invalid_union"===s.code&&s.errors.length>0){var c,l,f=s.errors.reduce(function(r,e){return e.length<r.length?e:r})[0];o[a]={message:null!=(c=null==f?void 0:f.message)?c:u,type:null!=(l=null==f?void 0:f.code)?l:i}}else o[a]={message:u,type:i};if("invalid_union"===s.code&&s.errors.forEach(function(e){return e.forEach(function(e){return r.push(t({},e,{path:[].concat(s.path,e.path)}))})}),e){var d=o[a].types,h=d&&d[s.code];o[a]=n(a,e,o,i,h?[].concat(h,s.message):s.message)}r.shift()};r.length;)s();return o}function a(n,t,a){if(void 0===a&&(a={}),function(r){return"_zod"in r&&"object"==typeof r._zod}(n))return function(i,c,l){try{return Promise.resolve(s(function(){function e(e){return l.shouldUseNativeValidation&&r({},l),{errors:{},values:a.raw?Object.assign({},i):e}}var o=n;return"sync"===a.mode?e(o.parse(i,t)):Promise.resolve(o.parseAsync(i,t)).then(e)},function(r){if(function(r){return r instanceof o.$ZodError}(r))return{values:{},errors:e(u(r.issues,!l.shouldUseNativeValidation&&"all"===l.criteriaMode),l)};throw r}))}catch(r){return Promise.reject(r)}};if(function(r){return"_def"in r&&"object"==typeof r._def}(n))return function(o,u,c){try{return Promise.resolve(s(function(){return Promise.resolve(n["sync"===a.mode?"parse":"parseAsync"](o,t)).then(function(e){return c.shouldUseNativeValidation&&r({},c),{errors:{},values:a.raw?Object.assign({},o):e}})},function(r){if(function(r){return Array.isArray(null==r?void 0:r.issues)}(r))return{values:{},errors:e(i(r.errors,!c.shouldUseNativeValidation&&"all"===c.criteriaMode),c)};throw r}))}catch(r){return Promise.reject(r)}};throw new Error("Invalid input: not a Zod schema")}export{a as zodResolver};
2
2
  //# sourceMappingURL=zod.module.js.map
@@ -1,2 +1,2 @@
1
- import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import{appendErrors as o}from"react-hook-form";import*as s from"zod/v4/core";function n(){return n=Object.assign?Object.assign.bind():function(r){for(var e=1;e<arguments.length;e++){var o=arguments[e];for(var s in o)({}).hasOwnProperty.call(o,s)&&(r[s]=o[s])}return r},n.apply(null,arguments)}function t(r,e){const s={};for(;r.length;){const a=r[0],{code:i,message:c,path:l}=a,u=l.join(".");if(!s[u])if("unionErrors"in a){var n,t;const r=a.unionErrors.reduce((r,e)=>e.errors.length<r.errors.length?e:r).errors[0];s[u]={message:null!=(n=null==r?void 0:r.message)?n:c,type:null!=(t=null==r?void 0:r.code)?t:i}}else s[u]={message:c,type:i};if("unionErrors"in a&&a.unionErrors.forEach(e=>e.errors.forEach(e=>r.push(e))),e){const r=s[u].types,n=r&&r[a.code];s[u]=o(u,e,s,i,n?[].concat(n,a.message):a.message)}r.shift()}return s}function a(r,e){const s={};for(;r.length;){const i=r[0],{code:c,message:l,path:u}=i,d=u.join(".");if(!s[d])if("invalid_union"===i.code&&i.errors.length>0){var t,a;const r=i.errors.reduce((r,e)=>e.length<r.length?e:r)[0];s[d]={message:null!=(t=null==r?void 0:r.message)?t:l,type:null!=(a=null==r?void 0:r.code)?a:c}}else s[d]={message:l,type:c};if("invalid_union"===i.code&&i.errors.forEach(e=>e.forEach(e=>r.push(n({},e,{path:[...i.path,...e.path]})))),e){const r=s[d].types,n=r&&r[i.code];s[d]=o(d,e,s,c,n?[].concat(n,i.message):i.message)}r.shift()}return s}function i(o,n,i={}){if((r=>"_def"in r&&"object"==typeof r._def&&"typeName"in r._def)(o))return async(s,a,c)=>{try{const e=await o["sync"===i.mode?"parse":"parseAsync"](s,n);return c.shouldUseNativeValidation&&r({},c),{errors:{},values:i.raw?Object.assign({},s):e}}catch(r){if((r=>Array.isArray(null==r?void 0:r.issues))(r))return{values:{},errors:e(t(r.errors,!c.shouldUseNativeValidation&&"all"===c.criteriaMode),c)};throw r}};if((r=>"_zod"in r&&"object"==typeof r._zod)(o))return async(t,c,l)=>{try{const e=o,s="sync"===i.mode?e.parse(t,n):await e.parseAsync(t,n);return l.shouldUseNativeValidation&&r({},l),{errors:{},values:i.raw?Object.assign({},t):s}}catch(r){if((r=>r instanceof s.$ZodError)(r))return{values:{},errors:e(a(r.issues,!l.shouldUseNativeValidation&&"all"===l.criteriaMode),l)};throw r}};throw new Error("Invalid input: not a Zod schema")}export{i as zodResolver};
1
+ import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import{appendErrors as o}from"react-hook-form";import*as s from"zod/v4/core";function n(){return n=Object.assign?Object.assign.bind():function(r){for(var e=1;e<arguments.length;e++){var o=arguments[e];for(var s in o)({}).hasOwnProperty.call(o,s)&&(r[s]=o[s])}return r},n.apply(null,arguments)}function t(r,e){const s={};for(;r.length;){const a=r[0],{code:i,message:c,path:l}=a,u=l.join(".");if(!s[u])if("unionErrors"in a){var n,t;const r=a.unionErrors.reduce((r,e)=>e.errors.length<r.errors.length?e:r).errors[0];s[u]={message:null!=(n=null==r?void 0:r.message)?n:c,type:null!=(t=null==r?void 0:r.code)?t:i}}else s[u]={message:c,type:i};if("unionErrors"in a&&a.unionErrors.forEach(e=>e.errors.forEach(e=>r.push(e))),e){const r=s[u].types,n=r&&r[a.code];s[u]=o(u,e,s,i,n?[].concat(n,a.message):a.message)}r.shift()}return s}function a(r,e){const s={};for(;r.length;){const i=r[0],{code:c,message:l,path:u}=i,d=u.join(".");if(!s[d])if("invalid_union"===i.code&&i.errors.length>0){var t,a;const r=i.errors.reduce((r,e)=>e.length<r.length?e:r)[0];s[d]={message:null!=(t=null==r?void 0:r.message)?t:l,type:null!=(a=null==r?void 0:r.code)?a:c}}else s[d]={message:l,type:c};if("invalid_union"===i.code&&i.errors.forEach(e=>e.forEach(e=>r.push(n({},e,{path:[...i.path,...e.path]})))),e){const r=s[d].types,n=r&&r[i.code];s[d]=o(d,e,s,c,n?[].concat(n,i.message):i.message)}r.shift()}return s}function i(o,n,i={}){if((r=>"_zod"in r&&"object"==typeof r._zod)(o))return async(t,c,l)=>{try{const e=o,s="sync"===i.mode?e.parse(t,n):await e.parseAsync(t,n);return l.shouldUseNativeValidation&&r({},l),{errors:{},values:i.raw?Object.assign({},t):s}}catch(r){if((r=>r instanceof s.$ZodError)(r))return{values:{},errors:e(a(r.issues,!l.shouldUseNativeValidation&&"all"===l.criteriaMode),l)};throw r}};if((r=>"_def"in r&&"object"==typeof r._def)(o))return async(s,a,c)=>{try{const e=await o["sync"===i.mode?"parse":"parseAsync"](s,n);return c.shouldUseNativeValidation&&r({},c),{errors:{},values:i.raw?Object.assign({},s):e}}catch(r){if((r=>Array.isArray(null==r?void 0:r.issues))(r))return{values:{},errors:e(t(r.errors,!c.shouldUseNativeValidation&&"all"===c.criteriaMode),c)};throw r}};throw new Error("Invalid input: not a Zod schema")}export{i as zodResolver};
2
2
  //# sourceMappingURL=zod.modern.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"zod.modern.mjs","sources":["../src/zod.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport {\n FieldError,\n FieldValues,\n Resolver,\n ResolverError,\n ResolverSuccess,\n appendErrors,\n} from 'react-hook-form';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4/core';\n\nconst isZod3Error = (error: any): error is z3.ZodError => {\n return Array.isArray(error?.issues);\n};\nconst isZod3Schema = (schema: any): schema is z3.ZodSchema => {\n return (\n '_def' in schema &&\n typeof schema._def === 'object' &&\n 'typeName' in schema._def\n );\n};\nconst isZod4Error = (error: any): error is z4.$ZodError => {\n // instanceof is safe in Zod 4 (uses Symbol.hasInstance)\n return error instanceof z4.$ZodError;\n};\nconst isZod4Schema = (schema: any): schema is z4.$ZodType => {\n return '_zod' in schema && typeof schema._zod === 'object';\n};\n\nfunction parseZod3Issues(\n zodErrors: z3.ZodIssue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors: Record<string, FieldError> = {};\n for (; zodErrors.length; ) {\n const error = zodErrors[0];\n const { code, message, path } = error;\n const _path = path.join('.');\n\n if (!errors[_path]) {\n if ('unionErrors' in error) {\n // Surface the error from whichever union member came closest to\n // matching (fewest issues), rather than always the first member —\n // the first member isn't necessarily the one the input was meant for.\n const closestUnionError = error.unionErrors.reduce(\n (closest, current) =>\n current.errors.length < closest.errors.length ? current : closest,\n );\n // Fall back to the union issue's own message/code if the closest\n // member somehow has no issues of its own (shouldn't happen, but\n // avoids ever throwing on an unexpected/malformed union shape).\n const unionError = closestUnionError.errors[0];\n\n errors[_path] = {\n message: unionError?.message ?? message,\n type: unionError?.code ?? code,\n };\n } else {\n errors[_path] = { message, type: code };\n }\n }\n\n if ('unionErrors' in error) {\n error.unionErrors.forEach((unionError) =>\n unionError.errors.forEach((e) => zodErrors.push(e)),\n );\n }\n\n if (validateAllFieldCriteria) {\n const types = errors[_path].types;\n const messages = types && types[error.code];\n\n errors[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n errors,\n code,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n zodErrors.shift();\n }\n\n return errors;\n}\n\nfunction parseZod4Issues(\n zodErrors: z4.$ZodIssue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors: Record<string, FieldError> = {};\n // const _zodErrors = zodErrors as z4.$ZodISsue; //\n for (; zodErrors.length; ) {\n const error = zodErrors[0];\n const { code, message, path } = error;\n const _path = path.join('.');\n\n if (!errors[_path]) {\n if (error.code === 'invalid_union' && error.errors.length > 0) {\n // Surface the error from whichever union member came closest to\n // matching (fewest issues), rather than always the first member —\n // the first member isn't necessarily the one the input was meant for.\n const closestBranch = error.errors.reduce((closest, branch) =>\n branch.length < closest.length ? branch : closest,\n );\n // Fall back to the union issue's own message/code if the closest\n // branch somehow has no issues of its own (shouldn't happen — a\n // 0-issue branch means that branch matched — but this guarantees we\n // never throw on an unexpected/malformed union shape, e.g. a \"no\n // matching discriminator\" issue nested in a way we haven't seen).\n const unionError = closestBranch[0];\n\n errors[_path] = {\n message: unionError?.message ?? message,\n type: unionError?.code ?? code,\n };\n } else {\n errors[_path] = { message, type: code };\n }\n }\n\n if (error.code === 'invalid_union') {\n error.errors.forEach((unionError) =>\n unionError.forEach((e) =>\n zodErrors.push({ ...e, path: [...error.path, ...e.path] }),\n ),\n );\n }\n\n if (validateAllFieldCriteria) {\n const types = errors[_path].types;\n const messages = types && types[error.code];\n\n errors[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n errors,\n code,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n zodErrors.shift();\n }\n\n return errors;\n}\n\ntype RawResolverOptions = {\n mode?: 'async' | 'sync';\n raw: true;\n};\ntype NonRawResolverOptions = {\n mode?: 'async' | 'sync';\n raw?: false;\n};\n\n// minimal interfaces to avoid asssignability issues between versions\ninterface Zod3Type<O = unknown, I = unknown> {\n _output: O;\n _input: I;\n _def: {\n typeName: string;\n };\n}\n\n// minimal interface to avoid assignability issues between zod v4 patch/minor\n// releases, which brand the full `$ZodType` shape with an exact version literal\n// (e.g. `_zod.version.minor`)\ninterface Zod4Type<Output = unknown, Input = unknown> {\n _zod: {\n output: Output;\n input: Input;\n };\n}\n\n// some type magic to make versions pre-3.25.0 still work\ntype IsUnresolved<T> = PropertyKey extends keyof T ? true : false;\ntype UnresolvedFallback<T, Fallback> = IsUnresolved<typeof z3> extends true\n ? Fallback\n : T;\ntype FallbackIssue = {\n code: string;\n message: string;\n path: (string | number)[];\n};\ntype Zod3ParseParams = UnresolvedFallback<\n z3.ParseParams,\n // fallback if user is on <3.25.0\n {\n path?: (string | number)[];\n errorMap?: (\n iss: FallbackIssue,\n ctx: {\n defaultError: string;\n data: any;\n },\n ) => { message: string };\n async?: boolean;\n }\n>;\ntype Zod4ParseParams = UnresolvedFallback<\n z4.ParseContext<z4.$ZodIssue>,\n // fallback if user is on <3.25.0\n {\n readonly error?: (\n iss: FallbackIssue,\n ) => null | undefined | string | { message: string };\n readonly reportInput?: boolean;\n readonly jitless?: boolean;\n }\n>;\n\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: Zod3Type<Output, Input>,\n schemaOptions?: Zod3ParseParams,\n resolverOptions?: NonRawResolverOptions,\n): Resolver<Input, Context, Output>;\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: Zod3Type<Output, Input>,\n schemaOptions: Zod3ParseParams | undefined,\n resolverOptions: RawResolverOptions,\n): Resolver<Input, Context, Input>;\n// the Zod 4 overloads need to be generic for complicated reasons\nexport function zodResolver<\n Input extends FieldValues,\n Context,\n Output,\n T extends Zod4Type<Output, Input> = Zod4Type<Output, Input>,\n>(\n schema: T,\n schemaOptions?: Zod4ParseParams, // already partial\n resolverOptions?: NonRawResolverOptions,\n): Resolver<z4.input<T>, Context, z4.output<T>>;\nexport function zodResolver<\n Input extends FieldValues,\n Context,\n Output,\n T extends Zod4Type<Output, Input> = Zod4Type<Output, Input>,\n>(\n schema: Zod4Type<Output, Input>,\n schemaOptions: Zod4ParseParams | undefined, // already partial\n resolverOptions: RawResolverOptions,\n): Resolver<z4.input<T>, Context, z4.input<T>>;\n/**\n * Creates a resolver function for react-hook-form that validates form data using a Zod schema\n * @param {z3.ZodSchema<Input>} schema - The Zod schema used to validate the form data\n * @param {Partial<z3.ParseParams>} [schemaOptions] - Optional configuration options for Zod parsing\n * @param {Object} [resolverOptions] - Optional resolver-specific configuration\n * @param {('async'|'sync')} [resolverOptions.mode='async'] - Validation mode. Use 'sync' for synchronous validation\n * @param {boolean} [resolverOptions.raw=false] - If true, returns the raw form values instead of the parsed data\n * @returns {Resolver<z3.output<typeof schema>>} A resolver function compatible with react-hook-form\n * @throws {Error} Throws if validation fails with a non-Zod error\n * @example\n * const schema = z3.object({\n * name: z3.string().min(2),\n * age: z3.number().min(18)\n * });\n *\n * useForm({\n * resolver: zodResolver(schema)\n * });\n */\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: object,\n schemaOptions?: object,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Output | Input> {\n if (isZod3Schema(schema)) {\n return async (values: Input, _, options) => {\n try {\n const data = await schema[\n resolverOptions.mode === 'sync' ? 'parse' : 'parseAsync'\n ](values, schemaOptions);\n\n options.shouldUseNativeValidation &&\n validateFieldsNatively({}, options);\n\n return {\n errors: {},\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n } satisfies ResolverSuccess<Output | Input>;\n } catch (error) {\n if (isZod3Error(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseZod3Issues(\n error.errors,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n } satisfies ResolverError<Input>;\n }\n\n throw error;\n }\n };\n }\n\n if (isZod4Schema(schema)) {\n return async (values: Input, _, options) => {\n try {\n // Call the schema's own bound `parse`/`parseAsync` method rather\n // than the standalone `z4.parse`/`z4.parseAsync` functions. Those\n // standalone functions read from this module's own imported\n // `zod/v4/core`, which — under bundlers that can resolve `zod` and\n // `zod/v4/core` to two distinct module instances (e.g. Metro with\n // package-exports resolution enabled) — may not be the same zod\n // instance the schema was created with, silently dropping any\n // global config (`z.config()`) or locale the app configured on its\n // own zod instance. The schema's own method is always bound to\n // whichever zod instance actually created it.\n const classicSchema = schema as unknown as {\n parse: (values: unknown, schemaOptions: unknown) => unknown;\n parseAsync: (\n values: unknown,\n schemaOptions: unknown,\n ) => Promise<unknown>;\n };\n const data: any =\n resolverOptions.mode === 'sync'\n ? classicSchema.parse(values, schemaOptions)\n : await classicSchema.parseAsync(values, schemaOptions);\n\n options.shouldUseNativeValidation &&\n validateFieldsNatively({}, options);\n\n return {\n errors: {},\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n } satisfies ResolverSuccess<Output | Input>;\n } catch (error) {\n if (isZod4Error(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseZod4Issues(\n error.issues,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n } satisfies ResolverError<Input>;\n }\n\n throw error;\n }\n };\n }\n\n throw new Error('Invalid input: not a Zod schema');\n}\n"],"names":["parseZod3Issues","zodErrors","validateAllFieldCriteria","errors","length","error","code","message","path","_path","join","_unionError$message","_unionError$code","unionError","unionErrors","reduce","closest","current","type","forEach","e","push","types","messages","appendErrors","concat","shift","parseZod4Issues","_unionError$message2","_unionError$code2","branch","_extends","zodResolver","schema","schemaOptions","resolverOptions","_def","isZod3Schema","async","values","_","options","data","mode","shouldUseNativeValidation","validateFieldsNatively","raw","Object","assign","Array","isArray","issues","isZod3Error","toNestErrors","criteriaMode","_zod","isZod4Schema","classicSchema","parse","parseAsync","z4","$ZodError","isZod4Error","Error"],"mappings":"oXA8BA,SAASA,EACPC,EACAC,GAEA,MAAMC,EAAqC,CAAE,EAC7C,KAAOF,EAAUG,QAAU,CACzB,MAAMC,EAAQJ,EAAU,IAClBK,KAAEA,EAAIC,QAAEA,EAAOC,KAAEA,GAASH,EAC1BI,EAAQD,EAAKE,KAAK,KAExB,IAAKP,EAAOM,GACV,GAAI,gBAAiBJ,EAAO,CAAAM,IAAAA,EAAAC,EAI1B,MAOMC,EAPoBR,EAAMS,YAAYC,OAC1C,CAACC,EAASC,IACRA,EAAQd,OAAOC,OAASY,EAAQb,OAAOC,OAASa,EAAUD,GAKzBb,OAAO,GAE5CA,EAAOM,GAAS,CACdF,QAA4B,OAArBI,EAAY,MAAVE,OAAU,EAAVA,EAAYN,SAAOI,EAAIJ,EAChCW,KAAsBN,OAAlBA,EAAEC,MAAAA,OAAAA,EAAAA,EAAYP,MAAIM,EAAIN,EAE9B,MACEH,EAAOM,GAAS,CAAEF,UAASW,KAAMZ,GAUrC,GANI,gBAAiBD,GACnBA,EAAMS,YAAYK,QAASN,GACzBA,EAAWV,OAAOgB,QAASC,GAAMnB,EAAUoB,KAAKD,KAIhDlB,EAA0B,CAC5B,MAAMoB,EAAQnB,EAAOM,GAAOa,MACtBC,EAAWD,GAASA,EAAMjB,EAAMC,MAEtCH,EAAOM,GAASe,EACdf,EACAP,EACAC,EACAG,EACAiB,EACK,GAAgBE,OAAOF,EAAsBlB,EAAME,SACpDF,EAAME,QAEd,CAEAN,EAAUyB,OACZ,CAEA,OAAOvB,CACT,CAEA,SAASwB,EACP1B,EACAC,GAEA,MAAMC,EAAqC,CAAE,EAE7C,KAAOF,EAAUG,QAAU,CACzB,MAAMC,EAAQJ,EAAU,IAClBK,KAAEA,EAAIC,QAAEA,EAAOC,KAAEA,GAASH,EAC1BI,EAAQD,EAAKE,KAAK,KAExB,IAAKP,EAAOM,GACV,GAAmB,kBAAfJ,EAAMC,MAA4BD,EAAMF,OAAOC,OAAS,EAAG,CAAA,IAAAwB,EAAAC,EAI7D,MAQMhB,EARgBR,EAAMF,OAAOY,OAAO,CAACC,EAASc,IAClDA,EAAO1B,OAASY,EAAQZ,OAAS0B,EAASd,GAOX,GAEjCb,EAAOM,GAAS,CACdF,QAA4BqB,OAArBA,EAAEf,MAAAA,OAAAA,EAAAA,EAAYN,SAAOqB,EAAIrB,EAChCW,KAAsB,OAAlBW,EAAY,MAAVhB,OAAU,EAAVA,EAAYP,MAAIuB,EAAIvB,EAE9B,MACEH,EAAOM,GAAS,CAAEF,UAASW,KAAMZ,GAYrC,GARmB,kBAAfD,EAAMC,MACRD,EAAMF,OAAOgB,QAASN,GACpBA,EAAWM,QAASC,GAClBnB,EAAUoB,KAAIU,EAAMX,CAAAA,EAAAA,EAAGZ,CAAAA,KAAM,IAAIH,EAAMG,QAASY,EAAEZ,WAKpDN,EAA0B,CAC5B,MAAMoB,EAAQnB,EAAOM,GAAOa,MACtBC,EAAWD,GAASA,EAAMjB,EAAMC,MAEtCH,EAAOM,GAASe,EACdf,EACAP,EACAC,EACAG,EACAiB,EACK,GAAgBE,OAAOF,EAAsBlB,EAAME,SACpDF,EAAME,QAEd,CAEAN,EAAUyB,OACZ,CAEA,OAAOvB,CACT,CAqHM,SAAU6B,EACdC,EACAC,EACAC,EAGI,CAAA,GAEJ,GAtQoBF,IAElB,SAAUA,GACa,iBAAhBA,EAAOG,MACd,aAAcH,EAAOG,KAkQnBC,CAAaJ,GACf,OAAOK,MAAOC,EAAeC,EAAGC,KAC9B,IACE,MAAMC,QAAaT,EACQ,SAAzBE,EAAgBQ,KAAkB,QAAU,cAC5CJ,EAAQL,GAKV,OAHAO,EAAQG,2BACNC,EAAuB,CAAE,EAAEJ,GAEtB,CACLtC,OAAQ,CAAE,EACVoC,OAAQJ,EAAgBW,IAAMC,OAAOC,OAAO,CAAA,EAAIT,GAAUG,EAE9D,CAAE,MAAOrC,GACP,GAxRaA,IACZ4C,MAAMC,QAAa,MAAL7C,OAAK,EAALA,EAAO8C,QAuRlBC,CAAY/C,GACd,MAAO,CACLkC,OAAQ,CAAE,EACVpC,OAAQkD,EACNrD,EACEK,EAAMF,QACLsC,EAAQG,2BACkB,QAAzBH,EAAQa,cAEZb,IAKN,MAAMpC,CACR,GAIJ,GA7RoB4B,IACb,SAAUA,GAAiC,iBAAhBA,EAAOsB,KA4RrCC,CAAavB,GACf,OAAOK,MAAOC,EAAeC,EAAGC,KAC9B,IAWE,MAAMgB,EAAgBxB,EAOhBS,EACqB,SAAzBP,EAAgBQ,KACZc,EAAcC,MAAMnB,EAAQL,SACtBuB,EAAcE,WAAWpB,EAAQL,GAK7C,OAHAO,EAAQG,2BACNC,EAAuB,CAAE,EAAEJ,GAEtB,CACLtC,OAAQ,CAAA,EACRoC,OAAQJ,EAAgBW,IAAMC,OAAOC,OAAO,CAAE,EAAET,GAAUG,EAE9D,CAAE,MAAOrC,GACP,GAlUaA,IAEZA,aAAiBuD,EAAGC,UAgUjBC,CAAYzD,GACd,MAAO,CACLkC,OAAQ,CAAE,EACVpC,OAAQkD,EACN1B,EACEtB,EAAM8C,QACLV,EAAQG,2BACkB,QAAzBH,EAAQa,cAEZb,IAKN,MAAMpC,CACR,GAIJ,MAAU,IAAA0D,MAAM,kCAClB"}
1
+ {"version":3,"file":"zod.modern.mjs","sources":["../src/zod.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport {\n FieldError,\n FieldValues,\n Resolver,\n ResolverError,\n ResolverSuccess,\n appendErrors,\n} from 'react-hook-form';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4/core';\n\nconst isZod3Error = (error: any): error is z3.ZodError => {\n return Array.isArray(error?.issues);\n};\nconst isZod3Schema = (schema: any): schema is z3.ZodSchema => {\n // Deliberately doesn't require `typeName` in `_def` — dynamically selected\n // schemas typed via the generic `z.ZodType<Output>` annotation (rather than\n // a concrete subclass like `ZodObject`) don't statically expose `typeName`,\n // even though they're genuine Zod 3 schema instances at runtime.\n return '_def' in schema && typeof schema._def === 'object';\n};\nconst isZod4Error = (error: any): error is z4.$ZodError => {\n // instanceof is safe in Zod 4 (uses Symbol.hasInstance)\n return error instanceof z4.$ZodError;\n};\nconst isZod4Schema = (schema: any): schema is z4.$ZodType => {\n return '_zod' in schema && typeof schema._zod === 'object';\n};\n\nfunction parseZod3Issues(\n zodErrors: z3.ZodIssue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors: Record<string, FieldError> = {};\n for (; zodErrors.length; ) {\n const error = zodErrors[0];\n const { code, message, path } = error;\n const _path = path.join('.');\n\n if (!errors[_path]) {\n if ('unionErrors' in error) {\n // Surface the error from whichever union member came closest to\n // matching (fewest issues), rather than always the first member —\n // the first member isn't necessarily the one the input was meant for.\n const closestUnionError = error.unionErrors.reduce(\n (closest, current) =>\n current.errors.length < closest.errors.length ? current : closest,\n );\n // Fall back to the union issue's own message/code if the closest\n // member somehow has no issues of its own (shouldn't happen, but\n // avoids ever throwing on an unexpected/malformed union shape).\n const unionError = closestUnionError.errors[0];\n\n errors[_path] = {\n message: unionError?.message ?? message,\n type: unionError?.code ?? code,\n };\n } else {\n errors[_path] = { message, type: code };\n }\n }\n\n if ('unionErrors' in error) {\n error.unionErrors.forEach((unionError) =>\n unionError.errors.forEach((e) => zodErrors.push(e)),\n );\n }\n\n if (validateAllFieldCriteria) {\n const types = errors[_path].types;\n const messages = types && types[error.code];\n\n errors[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n errors,\n code,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n zodErrors.shift();\n }\n\n return errors;\n}\n\nfunction parseZod4Issues(\n zodErrors: z4.$ZodIssue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors: Record<string, FieldError> = {};\n // const _zodErrors = zodErrors as z4.$ZodISsue; //\n for (; zodErrors.length; ) {\n const error = zodErrors[0];\n const { code, message, path } = error;\n const _path = path.join('.');\n\n if (!errors[_path]) {\n if (error.code === 'invalid_union' && error.errors.length > 0) {\n // Surface the error from whichever union member came closest to\n // matching (fewest issues), rather than always the first member —\n // the first member isn't necessarily the one the input was meant for.\n const closestBranch = error.errors.reduce((closest, branch) =>\n branch.length < closest.length ? branch : closest,\n );\n // Fall back to the union issue's own message/code if the closest\n // branch somehow has no issues of its own (shouldn't happen — a\n // 0-issue branch means that branch matched — but this guarantees we\n // never throw on an unexpected/malformed union shape, e.g. a \"no\n // matching discriminator\" issue nested in a way we haven't seen).\n const unionError = closestBranch[0];\n\n errors[_path] = {\n message: unionError?.message ?? message,\n type: unionError?.code ?? code,\n };\n } else {\n errors[_path] = { message, type: code };\n }\n }\n\n if (error.code === 'invalid_union') {\n error.errors.forEach((unionError) =>\n unionError.forEach((e) =>\n zodErrors.push({ ...e, path: [...error.path, ...e.path] }),\n ),\n );\n }\n\n if (validateAllFieldCriteria) {\n const types = errors[_path].types;\n const messages = types && types[error.code];\n\n errors[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n errors,\n code,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n zodErrors.shift();\n }\n\n return errors;\n}\n\ntype RawResolverOptions = {\n mode?: 'async' | 'sync';\n raw: true;\n};\ntype NonRawResolverOptions = {\n mode?: 'async' | 'sync';\n raw?: false;\n};\n\n// minimal interfaces to avoid asssignability issues between versions\ninterface Zod3Type<O = unknown, I = unknown> {\n _output: O;\n _input: I;\n _def: object;\n}\n\n// minimal interface to avoid assignability issues between zod v4 patch/minor\n// releases, which brand the full `$ZodType` shape with an exact version literal\n// (e.g. `_zod.version.minor`)\ninterface Zod4Type<Output = unknown, Input = unknown> {\n _zod: {\n output: Output;\n input: Input;\n };\n}\n\n// some type magic to make versions pre-3.25.0 still work\ntype IsUnresolved<T> = PropertyKey extends keyof T ? true : false;\ntype UnresolvedFallback<T, Fallback> = IsUnresolved<typeof z3> extends true\n ? Fallback\n : T;\ntype FallbackIssue = {\n code: string;\n message: string;\n path: (string | number)[];\n};\ntype Zod3ParseParams = UnresolvedFallback<\n z3.ParseParams,\n // fallback if user is on <3.25.0\n {\n path?: (string | number)[];\n errorMap?: (\n iss: FallbackIssue,\n ctx: {\n defaultError: string;\n data: any;\n },\n ) => { message: string };\n async?: boolean;\n }\n>;\ntype Zod4ParseParams = UnresolvedFallback<\n z4.ParseContext<z4.$ZodIssue>,\n // fallback if user is on <3.25.0\n {\n readonly error?: (\n iss: FallbackIssue,\n ) => null | undefined | string | { message: string };\n readonly reportInput?: boolean;\n readonly jitless?: boolean;\n }\n>;\n\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: Zod3Type<Output, Input>,\n schemaOptions?: Zod3ParseParams,\n resolverOptions?: NonRawResolverOptions,\n): Resolver<Input, Context, Output>;\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: Zod3Type<Output, Input>,\n schemaOptions: Zod3ParseParams | undefined,\n resolverOptions: RawResolverOptions,\n): Resolver<Input, Context, Input>;\n// the Zod 4 overloads need to be generic for complicated reasons\nexport function zodResolver<\n Input extends FieldValues,\n Context,\n Output,\n T extends Zod4Type<Output, Input> = Zod4Type<Output, Input>,\n>(\n schema: T,\n schemaOptions?: Zod4ParseParams, // already partial\n resolverOptions?: NonRawResolverOptions,\n): Resolver<z4.input<T>, Context, z4.output<T>>;\nexport function zodResolver<\n Input extends FieldValues,\n Context,\n Output,\n T extends Zod4Type<Output, Input> = Zod4Type<Output, Input>,\n>(\n schema: Zod4Type<Output, Input>,\n schemaOptions: Zod4ParseParams | undefined, // already partial\n resolverOptions: RawResolverOptions,\n): Resolver<z4.input<T>, Context, z4.input<T>>;\n/**\n * Creates a resolver function for react-hook-form that validates form data using a Zod schema\n * @param {z3.ZodSchema<Input>} schema - The Zod schema used to validate the form data\n * @param {Partial<z3.ParseParams>} [schemaOptions] - Optional configuration options for Zod parsing\n * @param {Object} [resolverOptions] - Optional resolver-specific configuration\n * @param {('async'|'sync')} [resolverOptions.mode='async'] - Validation mode. Use 'sync' for synchronous validation\n * @param {boolean} [resolverOptions.raw=false] - If true, returns the raw form values instead of the parsed data\n * @returns {Resolver<z3.output<typeof schema>>} A resolver function compatible with react-hook-form\n * @throws {Error} Throws if validation fails with a non-Zod error\n * @example\n * const schema = z3.object({\n * name: z3.string().min(2),\n * age: z3.number().min(18)\n * });\n *\n * useForm({\n * resolver: zodResolver(schema)\n * });\n */\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: object,\n schemaOptions?: object,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Output | Input> {\n // Zod 4 is checked first: its `_zod` marker is unambiguous, whereas the\n // Zod 3 check below only requires an object-shaped `_def` (to support\n // dynamically-selected schemas typed via the generic `z.ZodType<Output>`\n // annotation, see `isZod3Schema`) — and Zod 4 schemas also have an\n // object-shaped `_def`, so they'd otherwise be misdetected as Zod 3.\n if (isZod4Schema(schema)) {\n return async (values: Input, _, options) => {\n try {\n // Call the schema's own bound `parse`/`parseAsync` method rather\n // than the standalone `z4.parse`/`z4.parseAsync` functions. Those\n // standalone functions read from this module's own imported\n // `zod/v4/core`, which — under bundlers that can resolve `zod` and\n // `zod/v4/core` to two distinct module instances (e.g. Metro with\n // package-exports resolution enabled) — may not be the same zod\n // instance the schema was created with, silently dropping any\n // global config (`z.config()`) or locale the app configured on its\n // own zod instance. The schema's own method is always bound to\n // whichever zod instance actually created it.\n const classicSchema = schema as unknown as {\n parse: (values: unknown, schemaOptions: unknown) => unknown;\n parseAsync: (\n values: unknown,\n schemaOptions: unknown,\n ) => Promise<unknown>;\n };\n const data: any =\n resolverOptions.mode === 'sync'\n ? classicSchema.parse(values, schemaOptions)\n : await classicSchema.parseAsync(values, schemaOptions);\n\n options.shouldUseNativeValidation &&\n validateFieldsNatively({}, options);\n\n return {\n errors: {},\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n } satisfies ResolverSuccess<Output | Input>;\n } catch (error) {\n if (isZod4Error(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseZod4Issues(\n error.issues,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n } satisfies ResolverError<Input>;\n }\n\n throw error;\n }\n };\n }\n\n if (isZod3Schema(schema)) {\n return async (values: Input, _, options) => {\n try {\n const data = await schema[\n resolverOptions.mode === 'sync' ? 'parse' : 'parseAsync'\n ](values, schemaOptions);\n\n options.shouldUseNativeValidation &&\n validateFieldsNatively({}, options);\n\n return {\n errors: {},\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n } satisfies ResolverSuccess<Output | Input>;\n } catch (error) {\n if (isZod3Error(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseZod3Issues(\n error.errors,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n } satisfies ResolverError<Input>;\n }\n\n throw error;\n }\n };\n }\n\n throw new Error('Invalid input: not a Zod schema');\n}\n"],"names":["parseZod3Issues","zodErrors","validateAllFieldCriteria","errors","length","error","code","message","path","_path","join","_unionError$message","_unionError$code","unionError","unionErrors","reduce","closest","current","type","forEach","e","push","types","messages","appendErrors","concat","shift","parseZod4Issues","_unionError$message2","_unionError$code2","branch","_extends","zodResolver","schema","schemaOptions","resolverOptions","_zod","isZod4Schema","async","values","_","options","classicSchema","data","mode","parse","parseAsync","shouldUseNativeValidation","validateFieldsNatively","raw","Object","assign","z4","$ZodError","isZod4Error","toNestErrors","issues","criteriaMode","_def","isZod3Schema","Array","isArray","isZod3Error","Error"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import{appendErrors as n}from"react-hook-form";import*as o from"zod/v4/core";function t(){return t=Object.assign?Object.assign.bind():function(r){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var o in n)({}).hasOwnProperty.call(n,o)&&(r[o]=n[o])}return r},t.apply(null,arguments)}function s(r,e){try{var n=r()}catch(r){return e(r)}return n&&n.then?n.then(void 0,e):n}function i(r,e){for(var o={};r.length;){var t=r[0],s=t.code,i=t.message,a=t.path.join(".");if(!o[a])if("unionErrors"in t){var u,c,l=t.unionErrors.reduce(function(r,e){return e.errors.length<r.errors.length?e:r}).errors[0];o[a]={message:null!=(u=null==l?void 0:l.message)?u:i,type:null!=(c=null==l?void 0:l.code)?c:s}}else o[a]={message:i,type:s};if("unionErrors"in t&&t.unionErrors.forEach(function(e){return e.errors.forEach(function(e){return r.push(e)})}),e){var f=o[a].types,d=f&&f[t.code];o[a]=n(a,e,o,s,d?[].concat(d,t.message):t.message)}r.shift()}return o}function a(r,e){for(var o={},s=function(){var s=r[0],i=s.code,a=s.message,u=s.path.join(".");if(!o[u])if("invalid_union"===s.code&&s.errors.length>0){var c,l,f=s.errors.reduce(function(r,e){return e.length<r.length?e:r})[0];o[u]={message:null!=(c=null==f?void 0:f.message)?c:a,type:null!=(l=null==f?void 0:f.code)?l:i}}else o[u]={message:a,type:i};if("invalid_union"===s.code&&s.errors.forEach(function(e){return e.forEach(function(e){return r.push(t({},e,{path:[].concat(s.path,e.path)}))})}),e){var d=o[u].types,h=d&&d[s.code];o[u]=n(u,e,o,i,h?[].concat(h,s.message):s.message)}r.shift()};r.length;)s();return o}function u(n,t,u){if(void 0===u&&(u={}),function(r){return"_def"in r&&"object"==typeof r._def&&"typeName"in r._def}(n))return function(o,a,c){try{return Promise.resolve(s(function(){return Promise.resolve(n["sync"===u.mode?"parse":"parseAsync"](o,t)).then(function(e){return c.shouldUseNativeValidation&&r({},c),{errors:{},values:u.raw?Object.assign({},o):e}})},function(r){if(function(r){return Array.isArray(null==r?void 0:r.issues)}(r))return{values:{},errors:e(i(r.errors,!c.shouldUseNativeValidation&&"all"===c.criteriaMode),c)};throw r}))}catch(r){return Promise.reject(r)}};if(function(r){return"_zod"in r&&"object"==typeof r._zod}(n))return function(i,c,l){try{return Promise.resolve(s(function(){function e(e){return l.shouldUseNativeValidation&&r({},l),{errors:{},values:u.raw?Object.assign({},i):e}}var o=n;return"sync"===u.mode?e(o.parse(i,t)):Promise.resolve(o.parseAsync(i,t)).then(e)},function(r){if(function(r){return r instanceof o.$ZodError}(r))return{values:{},errors:e(a(r.issues,!l.shouldUseNativeValidation&&"all"===l.criteriaMode),l)};throw r}))}catch(r){return Promise.reject(r)}};throw new Error("Invalid input: not a Zod schema")}export{u as zodResolver};
1
+ import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import{appendErrors as n}from"react-hook-form";import*as o from"zod/v4/core";function t(){return t=Object.assign?Object.assign.bind():function(r){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var o in n)({}).hasOwnProperty.call(n,o)&&(r[o]=n[o])}return r},t.apply(null,arguments)}function s(r,e){try{var n=r()}catch(r){return e(r)}return n&&n.then?n.then(void 0,e):n}function i(r,e){for(var o={};r.length;){var t=r[0],s=t.code,i=t.message,u=t.path.join(".");if(!o[u])if("unionErrors"in t){var a,c,l=t.unionErrors.reduce(function(r,e){return e.errors.length<r.errors.length?e:r}).errors[0];o[u]={message:null!=(a=null==l?void 0:l.message)?a:i,type:null!=(c=null==l?void 0:l.code)?c:s}}else o[u]={message:i,type:s};if("unionErrors"in t&&t.unionErrors.forEach(function(e){return e.errors.forEach(function(e){return r.push(e)})}),e){var f=o[u].types,d=f&&f[t.code];o[u]=n(u,e,o,s,d?[].concat(d,t.message):t.message)}r.shift()}return o}function u(r,e){for(var o={},s=function(){var s=r[0],i=s.code,u=s.message,a=s.path.join(".");if(!o[a])if("invalid_union"===s.code&&s.errors.length>0){var c,l,f=s.errors.reduce(function(r,e){return e.length<r.length?e:r})[0];o[a]={message:null!=(c=null==f?void 0:f.message)?c:u,type:null!=(l=null==f?void 0:f.code)?l:i}}else o[a]={message:u,type:i};if("invalid_union"===s.code&&s.errors.forEach(function(e){return e.forEach(function(e){return r.push(t({},e,{path:[].concat(s.path,e.path)}))})}),e){var d=o[a].types,h=d&&d[s.code];o[a]=n(a,e,o,i,h?[].concat(h,s.message):s.message)}r.shift()};r.length;)s();return o}function a(n,t,a){if(void 0===a&&(a={}),function(r){return"_zod"in r&&"object"==typeof r._zod}(n))return function(i,c,l){try{return Promise.resolve(s(function(){function e(e){return l.shouldUseNativeValidation&&r({},l),{errors:{},values:a.raw?Object.assign({},i):e}}var o=n;return"sync"===a.mode?e(o.parse(i,t)):Promise.resolve(o.parseAsync(i,t)).then(e)},function(r){if(function(r){return r instanceof o.$ZodError}(r))return{values:{},errors:e(u(r.issues,!l.shouldUseNativeValidation&&"all"===l.criteriaMode),l)};throw r}))}catch(r){return Promise.reject(r)}};if(function(r){return"_def"in r&&"object"==typeof r._def}(n))return function(o,u,c){try{return Promise.resolve(s(function(){return Promise.resolve(n["sync"===a.mode?"parse":"parseAsync"](o,t)).then(function(e){return c.shouldUseNativeValidation&&r({},c),{errors:{},values:a.raw?Object.assign({},o):e}})},function(r){if(function(r){return Array.isArray(null==r?void 0:r.issues)}(r))return{values:{},errors:e(i(r.errors,!c.shouldUseNativeValidation&&"all"===c.criteriaMode),c)};throw r}))}catch(r){return Promise.reject(r)}};throw new Error("Invalid input: not a Zod schema")}export{a as zodResolver};
2
2
  //# sourceMappingURL=zod.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zod.module.js","sources":["../src/zod.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport {\n FieldError,\n FieldValues,\n Resolver,\n ResolverError,\n ResolverSuccess,\n appendErrors,\n} from 'react-hook-form';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4/core';\n\nconst isZod3Error = (error: any): error is z3.ZodError => {\n return Array.isArray(error?.issues);\n};\nconst isZod3Schema = (schema: any): schema is z3.ZodSchema => {\n return (\n '_def' in schema &&\n typeof schema._def === 'object' &&\n 'typeName' in schema._def\n );\n};\nconst isZod4Error = (error: any): error is z4.$ZodError => {\n // instanceof is safe in Zod 4 (uses Symbol.hasInstance)\n return error instanceof z4.$ZodError;\n};\nconst isZod4Schema = (schema: any): schema is z4.$ZodType => {\n return '_zod' in schema && typeof schema._zod === 'object';\n};\n\nfunction parseZod3Issues(\n zodErrors: z3.ZodIssue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors: Record<string, FieldError> = {};\n for (; zodErrors.length; ) {\n const error = zodErrors[0];\n const { code, message, path } = error;\n const _path = path.join('.');\n\n if (!errors[_path]) {\n if ('unionErrors' in error) {\n // Surface the error from whichever union member came closest to\n // matching (fewest issues), rather than always the first member —\n // the first member isn't necessarily the one the input was meant for.\n const closestUnionError = error.unionErrors.reduce(\n (closest, current) =>\n current.errors.length < closest.errors.length ? current : closest,\n );\n // Fall back to the union issue's own message/code if the closest\n // member somehow has no issues of its own (shouldn't happen, but\n // avoids ever throwing on an unexpected/malformed union shape).\n const unionError = closestUnionError.errors[0];\n\n errors[_path] = {\n message: unionError?.message ?? message,\n type: unionError?.code ?? code,\n };\n } else {\n errors[_path] = { message, type: code };\n }\n }\n\n if ('unionErrors' in error) {\n error.unionErrors.forEach((unionError) =>\n unionError.errors.forEach((e) => zodErrors.push(e)),\n );\n }\n\n if (validateAllFieldCriteria) {\n const types = errors[_path].types;\n const messages = types && types[error.code];\n\n errors[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n errors,\n code,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n zodErrors.shift();\n }\n\n return errors;\n}\n\nfunction parseZod4Issues(\n zodErrors: z4.$ZodIssue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors: Record<string, FieldError> = {};\n // const _zodErrors = zodErrors as z4.$ZodISsue; //\n for (; zodErrors.length; ) {\n const error = zodErrors[0];\n const { code, message, path } = error;\n const _path = path.join('.');\n\n if (!errors[_path]) {\n if (error.code === 'invalid_union' && error.errors.length > 0) {\n // Surface the error from whichever union member came closest to\n // matching (fewest issues), rather than always the first member —\n // the first member isn't necessarily the one the input was meant for.\n const closestBranch = error.errors.reduce((closest, branch) =>\n branch.length < closest.length ? branch : closest,\n );\n // Fall back to the union issue's own message/code if the closest\n // branch somehow has no issues of its own (shouldn't happen — a\n // 0-issue branch means that branch matched — but this guarantees we\n // never throw on an unexpected/malformed union shape, e.g. a \"no\n // matching discriminator\" issue nested in a way we haven't seen).\n const unionError = closestBranch[0];\n\n errors[_path] = {\n message: unionError?.message ?? message,\n type: unionError?.code ?? code,\n };\n } else {\n errors[_path] = { message, type: code };\n }\n }\n\n if (error.code === 'invalid_union') {\n error.errors.forEach((unionError) =>\n unionError.forEach((e) =>\n zodErrors.push({ ...e, path: [...error.path, ...e.path] }),\n ),\n );\n }\n\n if (validateAllFieldCriteria) {\n const types = errors[_path].types;\n const messages = types && types[error.code];\n\n errors[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n errors,\n code,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n zodErrors.shift();\n }\n\n return errors;\n}\n\ntype RawResolverOptions = {\n mode?: 'async' | 'sync';\n raw: true;\n};\ntype NonRawResolverOptions = {\n mode?: 'async' | 'sync';\n raw?: false;\n};\n\n// minimal interfaces to avoid asssignability issues between versions\ninterface Zod3Type<O = unknown, I = unknown> {\n _output: O;\n _input: I;\n _def: {\n typeName: string;\n };\n}\n\n// minimal interface to avoid assignability issues between zod v4 patch/minor\n// releases, which brand the full `$ZodType` shape with an exact version literal\n// (e.g. `_zod.version.minor`)\ninterface Zod4Type<Output = unknown, Input = unknown> {\n _zod: {\n output: Output;\n input: Input;\n };\n}\n\n// some type magic to make versions pre-3.25.0 still work\ntype IsUnresolved<T> = PropertyKey extends keyof T ? true : false;\ntype UnresolvedFallback<T, Fallback> = IsUnresolved<typeof z3> extends true\n ? Fallback\n : T;\ntype FallbackIssue = {\n code: string;\n message: string;\n path: (string | number)[];\n};\ntype Zod3ParseParams = UnresolvedFallback<\n z3.ParseParams,\n // fallback if user is on <3.25.0\n {\n path?: (string | number)[];\n errorMap?: (\n iss: FallbackIssue,\n ctx: {\n defaultError: string;\n data: any;\n },\n ) => { message: string };\n async?: boolean;\n }\n>;\ntype Zod4ParseParams = UnresolvedFallback<\n z4.ParseContext<z4.$ZodIssue>,\n // fallback if user is on <3.25.0\n {\n readonly error?: (\n iss: FallbackIssue,\n ) => null | undefined | string | { message: string };\n readonly reportInput?: boolean;\n readonly jitless?: boolean;\n }\n>;\n\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: Zod3Type<Output, Input>,\n schemaOptions?: Zod3ParseParams,\n resolverOptions?: NonRawResolverOptions,\n): Resolver<Input, Context, Output>;\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: Zod3Type<Output, Input>,\n schemaOptions: Zod3ParseParams | undefined,\n resolverOptions: RawResolverOptions,\n): Resolver<Input, Context, Input>;\n// the Zod 4 overloads need to be generic for complicated reasons\nexport function zodResolver<\n Input extends FieldValues,\n Context,\n Output,\n T extends Zod4Type<Output, Input> = Zod4Type<Output, Input>,\n>(\n schema: T,\n schemaOptions?: Zod4ParseParams, // already partial\n resolverOptions?: NonRawResolverOptions,\n): Resolver<z4.input<T>, Context, z4.output<T>>;\nexport function zodResolver<\n Input extends FieldValues,\n Context,\n Output,\n T extends Zod4Type<Output, Input> = Zod4Type<Output, Input>,\n>(\n schema: Zod4Type<Output, Input>,\n schemaOptions: Zod4ParseParams | undefined, // already partial\n resolverOptions: RawResolverOptions,\n): Resolver<z4.input<T>, Context, z4.input<T>>;\n/**\n * Creates a resolver function for react-hook-form that validates form data using a Zod schema\n * @param {z3.ZodSchema<Input>} schema - The Zod schema used to validate the form data\n * @param {Partial<z3.ParseParams>} [schemaOptions] - Optional configuration options for Zod parsing\n * @param {Object} [resolverOptions] - Optional resolver-specific configuration\n * @param {('async'|'sync')} [resolverOptions.mode='async'] - Validation mode. Use 'sync' for synchronous validation\n * @param {boolean} [resolverOptions.raw=false] - If true, returns the raw form values instead of the parsed data\n * @returns {Resolver<z3.output<typeof schema>>} A resolver function compatible with react-hook-form\n * @throws {Error} Throws if validation fails with a non-Zod error\n * @example\n * const schema = z3.object({\n * name: z3.string().min(2),\n * age: z3.number().min(18)\n * });\n *\n * useForm({\n * resolver: zodResolver(schema)\n * });\n */\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: object,\n schemaOptions?: object,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Output | Input> {\n if (isZod3Schema(schema)) {\n return async (values: Input, _, options) => {\n try {\n const data = await schema[\n resolverOptions.mode === 'sync' ? 'parse' : 'parseAsync'\n ](values, schemaOptions);\n\n options.shouldUseNativeValidation &&\n validateFieldsNatively({}, options);\n\n return {\n errors: {},\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n } satisfies ResolverSuccess<Output | Input>;\n } catch (error) {\n if (isZod3Error(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseZod3Issues(\n error.errors,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n } satisfies ResolverError<Input>;\n }\n\n throw error;\n }\n };\n }\n\n if (isZod4Schema(schema)) {\n return async (values: Input, _, options) => {\n try {\n // Call the schema's own bound `parse`/`parseAsync` method rather\n // than the standalone `z4.parse`/`z4.parseAsync` functions. Those\n // standalone functions read from this module's own imported\n // `zod/v4/core`, which — under bundlers that can resolve `zod` and\n // `zod/v4/core` to two distinct module instances (e.g. Metro with\n // package-exports resolution enabled) — may not be the same zod\n // instance the schema was created with, silently dropping any\n // global config (`z.config()`) or locale the app configured on its\n // own zod instance. The schema's own method is always bound to\n // whichever zod instance actually created it.\n const classicSchema = schema as unknown as {\n parse: (values: unknown, schemaOptions: unknown) => unknown;\n parseAsync: (\n values: unknown,\n schemaOptions: unknown,\n ) => Promise<unknown>;\n };\n const data: any =\n resolverOptions.mode === 'sync'\n ? classicSchema.parse(values, schemaOptions)\n : await classicSchema.parseAsync(values, schemaOptions);\n\n options.shouldUseNativeValidation &&\n validateFieldsNatively({}, options);\n\n return {\n errors: {},\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n } satisfies ResolverSuccess<Output | Input>;\n } catch (error) {\n if (isZod4Error(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseZod4Issues(\n error.issues,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n } satisfies ResolverError<Input>;\n }\n\n throw error;\n }\n };\n }\n\n throw new Error('Invalid input: not a Zod schema');\n}\n"],"names":["parseZod3Issues","zodErrors","validateAllFieldCriteria","errors","length","error","code","message","_path","path","join","_unionError$message","_unionError$code","unionError","unionErrors","reduce","closest","current","type","forEach","e","push","types","messages","appendErrors","concat","shift","parseZod4Issues","_loop","_unionError$message2","_unionError$code2","branch","_extends","zodResolver","schema","schemaOptions","resolverOptions","_def","isZod3Schema","values","_","options","Promise","resolve","_catch","mode","then","data","shouldUseNativeValidation","validateFieldsNatively","raw","Object","assign","Array","isArray","issues","isZod3Error","toNestErrors","criteriaMode","reject","_zod","isZod4Schema","_temp2","classicSchema","parse","parseAsync","z4","$ZodError","isZod4Error","Error"],"mappings":"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"}
1
+ {"version":3,"file":"zod.module.js","sources":["../src/zod.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport {\n FieldError,\n FieldValues,\n Resolver,\n ResolverError,\n ResolverSuccess,\n appendErrors,\n} from 'react-hook-form';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4/core';\n\nconst isZod3Error = (error: any): error is z3.ZodError => {\n return Array.isArray(error?.issues);\n};\nconst isZod3Schema = (schema: any): schema is z3.ZodSchema => {\n // Deliberately doesn't require `typeName` in `_def` — dynamically selected\n // schemas typed via the generic `z.ZodType<Output>` annotation (rather than\n // a concrete subclass like `ZodObject`) don't statically expose `typeName`,\n // even though they're genuine Zod 3 schema instances at runtime.\n return '_def' in schema && typeof schema._def === 'object';\n};\nconst isZod4Error = (error: any): error is z4.$ZodError => {\n // instanceof is safe in Zod 4 (uses Symbol.hasInstance)\n return error instanceof z4.$ZodError;\n};\nconst isZod4Schema = (schema: any): schema is z4.$ZodType => {\n return '_zod' in schema && typeof schema._zod === 'object';\n};\n\nfunction parseZod3Issues(\n zodErrors: z3.ZodIssue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors: Record<string, FieldError> = {};\n for (; zodErrors.length; ) {\n const error = zodErrors[0];\n const { code, message, path } = error;\n const _path = path.join('.');\n\n if (!errors[_path]) {\n if ('unionErrors' in error) {\n // Surface the error from whichever union member came closest to\n // matching (fewest issues), rather than always the first member —\n // the first member isn't necessarily the one the input was meant for.\n const closestUnionError = error.unionErrors.reduce(\n (closest, current) =>\n current.errors.length < closest.errors.length ? current : closest,\n );\n // Fall back to the union issue's own message/code if the closest\n // member somehow has no issues of its own (shouldn't happen, but\n // avoids ever throwing on an unexpected/malformed union shape).\n const unionError = closestUnionError.errors[0];\n\n errors[_path] = {\n message: unionError?.message ?? message,\n type: unionError?.code ?? code,\n };\n } else {\n errors[_path] = { message, type: code };\n }\n }\n\n if ('unionErrors' in error) {\n error.unionErrors.forEach((unionError) =>\n unionError.errors.forEach((e) => zodErrors.push(e)),\n );\n }\n\n if (validateAllFieldCriteria) {\n const types = errors[_path].types;\n const messages = types && types[error.code];\n\n errors[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n errors,\n code,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n zodErrors.shift();\n }\n\n return errors;\n}\n\nfunction parseZod4Issues(\n zodErrors: z4.$ZodIssue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors: Record<string, FieldError> = {};\n // const _zodErrors = zodErrors as z4.$ZodISsue; //\n for (; zodErrors.length; ) {\n const error = zodErrors[0];\n const { code, message, path } = error;\n const _path = path.join('.');\n\n if (!errors[_path]) {\n if (error.code === 'invalid_union' && error.errors.length > 0) {\n // Surface the error from whichever union member came closest to\n // matching (fewest issues), rather than always the first member —\n // the first member isn't necessarily the one the input was meant for.\n const closestBranch = error.errors.reduce((closest, branch) =>\n branch.length < closest.length ? branch : closest,\n );\n // Fall back to the union issue's own message/code if the closest\n // branch somehow has no issues of its own (shouldn't happen — a\n // 0-issue branch means that branch matched — but this guarantees we\n // never throw on an unexpected/malformed union shape, e.g. a \"no\n // matching discriminator\" issue nested in a way we haven't seen).\n const unionError = closestBranch[0];\n\n errors[_path] = {\n message: unionError?.message ?? message,\n type: unionError?.code ?? code,\n };\n } else {\n errors[_path] = { message, type: code };\n }\n }\n\n if (error.code === 'invalid_union') {\n error.errors.forEach((unionError) =>\n unionError.forEach((e) =>\n zodErrors.push({ ...e, path: [...error.path, ...e.path] }),\n ),\n );\n }\n\n if (validateAllFieldCriteria) {\n const types = errors[_path].types;\n const messages = types && types[error.code];\n\n errors[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n errors,\n code,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n zodErrors.shift();\n }\n\n return errors;\n}\n\ntype RawResolverOptions = {\n mode?: 'async' | 'sync';\n raw: true;\n};\ntype NonRawResolverOptions = {\n mode?: 'async' | 'sync';\n raw?: false;\n};\n\n// minimal interfaces to avoid asssignability issues between versions\ninterface Zod3Type<O = unknown, I = unknown> {\n _output: O;\n _input: I;\n _def: object;\n}\n\n// minimal interface to avoid assignability issues between zod v4 patch/minor\n// releases, which brand the full `$ZodType` shape with an exact version literal\n// (e.g. `_zod.version.minor`)\ninterface Zod4Type<Output = unknown, Input = unknown> {\n _zod: {\n output: Output;\n input: Input;\n };\n}\n\n// some type magic to make versions pre-3.25.0 still work\ntype IsUnresolved<T> = PropertyKey extends keyof T ? true : false;\ntype UnresolvedFallback<T, Fallback> = IsUnresolved<typeof z3> extends true\n ? Fallback\n : T;\ntype FallbackIssue = {\n code: string;\n message: string;\n path: (string | number)[];\n};\ntype Zod3ParseParams = UnresolvedFallback<\n z3.ParseParams,\n // fallback if user is on <3.25.0\n {\n path?: (string | number)[];\n errorMap?: (\n iss: FallbackIssue,\n ctx: {\n defaultError: string;\n data: any;\n },\n ) => { message: string };\n async?: boolean;\n }\n>;\ntype Zod4ParseParams = UnresolvedFallback<\n z4.ParseContext<z4.$ZodIssue>,\n // fallback if user is on <3.25.0\n {\n readonly error?: (\n iss: FallbackIssue,\n ) => null | undefined | string | { message: string };\n readonly reportInput?: boolean;\n readonly jitless?: boolean;\n }\n>;\n\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: Zod3Type<Output, Input>,\n schemaOptions?: Zod3ParseParams,\n resolverOptions?: NonRawResolverOptions,\n): Resolver<Input, Context, Output>;\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: Zod3Type<Output, Input>,\n schemaOptions: Zod3ParseParams | undefined,\n resolverOptions: RawResolverOptions,\n): Resolver<Input, Context, Input>;\n// the Zod 4 overloads need to be generic for complicated reasons\nexport function zodResolver<\n Input extends FieldValues,\n Context,\n Output,\n T extends Zod4Type<Output, Input> = Zod4Type<Output, Input>,\n>(\n schema: T,\n schemaOptions?: Zod4ParseParams, // already partial\n resolverOptions?: NonRawResolverOptions,\n): Resolver<z4.input<T>, Context, z4.output<T>>;\nexport function zodResolver<\n Input extends FieldValues,\n Context,\n Output,\n T extends Zod4Type<Output, Input> = Zod4Type<Output, Input>,\n>(\n schema: Zod4Type<Output, Input>,\n schemaOptions: Zod4ParseParams | undefined, // already partial\n resolverOptions: RawResolverOptions,\n): Resolver<z4.input<T>, Context, z4.input<T>>;\n/**\n * Creates a resolver function for react-hook-form that validates form data using a Zod schema\n * @param {z3.ZodSchema<Input>} schema - The Zod schema used to validate the form data\n * @param {Partial<z3.ParseParams>} [schemaOptions] - Optional configuration options for Zod parsing\n * @param {Object} [resolverOptions] - Optional resolver-specific configuration\n * @param {('async'|'sync')} [resolverOptions.mode='async'] - Validation mode. Use 'sync' for synchronous validation\n * @param {boolean} [resolverOptions.raw=false] - If true, returns the raw form values instead of the parsed data\n * @returns {Resolver<z3.output<typeof schema>>} A resolver function compatible with react-hook-form\n * @throws {Error} Throws if validation fails with a non-Zod error\n * @example\n * const schema = z3.object({\n * name: z3.string().min(2),\n * age: z3.number().min(18)\n * });\n *\n * useForm({\n * resolver: zodResolver(schema)\n * });\n */\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: object,\n schemaOptions?: object,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Output | Input> {\n // Zod 4 is checked first: its `_zod` marker is unambiguous, whereas the\n // Zod 3 check below only requires an object-shaped `_def` (to support\n // dynamically-selected schemas typed via the generic `z.ZodType<Output>`\n // annotation, see `isZod3Schema`) — and Zod 4 schemas also have an\n // object-shaped `_def`, so they'd otherwise be misdetected as Zod 3.\n if (isZod4Schema(schema)) {\n return async (values: Input, _, options) => {\n try {\n // Call the schema's own bound `parse`/`parseAsync` method rather\n // than the standalone `z4.parse`/`z4.parseAsync` functions. Those\n // standalone functions read from this module's own imported\n // `zod/v4/core`, which — under bundlers that can resolve `zod` and\n // `zod/v4/core` to two distinct module instances (e.g. Metro with\n // package-exports resolution enabled) — may not be the same zod\n // instance the schema was created with, silently dropping any\n // global config (`z.config()`) or locale the app configured on its\n // own zod instance. The schema's own method is always bound to\n // whichever zod instance actually created it.\n const classicSchema = schema as unknown as {\n parse: (values: unknown, schemaOptions: unknown) => unknown;\n parseAsync: (\n values: unknown,\n schemaOptions: unknown,\n ) => Promise<unknown>;\n };\n const data: any =\n resolverOptions.mode === 'sync'\n ? classicSchema.parse(values, schemaOptions)\n : await classicSchema.parseAsync(values, schemaOptions);\n\n options.shouldUseNativeValidation &&\n validateFieldsNatively({}, options);\n\n return {\n errors: {},\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n } satisfies ResolverSuccess<Output | Input>;\n } catch (error) {\n if (isZod4Error(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseZod4Issues(\n error.issues,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n } satisfies ResolverError<Input>;\n }\n\n throw error;\n }\n };\n }\n\n if (isZod3Schema(schema)) {\n return async (values: Input, _, options) => {\n try {\n const data = await schema[\n resolverOptions.mode === 'sync' ? 'parse' : 'parseAsync'\n ](values, schemaOptions);\n\n options.shouldUseNativeValidation &&\n validateFieldsNatively({}, options);\n\n return {\n errors: {},\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n } satisfies ResolverSuccess<Output | Input>;\n } catch (error) {\n if (isZod3Error(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseZod3Issues(\n error.errors,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n } satisfies ResolverError<Input>;\n }\n\n throw error;\n }\n };\n }\n\n throw new Error('Invalid input: not a Zod schema');\n}\n"],"names":["parseZod3Issues","zodErrors","validateAllFieldCriteria","errors","length","error","code","message","_path","path","join","_unionError$message","_unionError$code","unionError","unionErrors","reduce","closest","current","type","forEach","e","push","types","messages","appendErrors","concat","shift","parseZod4Issues","_loop","_unionError$message2","_unionError$code2","branch","_extends","zodResolver","schema","schemaOptions","resolverOptions","_zod","isZod4Schema","values","_","options","Promise","resolve","_catch","_temp2","data","shouldUseNativeValidation","validateFieldsNatively","raw","Object","assign","classicSchema","mode","parse","parseAsync","then","z4","$ZodError","isZod4Error","toNestErrors","issues","criteriaMode","reject","_def","isZod3Schema","Array","isArray","isZod3Error","Error"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- !function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@hookform/resolvers"),require("react-hook-form"),require("zod/v4/core")):"function"==typeof define&&define.amd?define(["exports","@hookform/resolvers","react-hook-form","zod/v4/core"],r):r((e||self).hookformResolversZod={},e.hookformResolvers,e.ReactHookForm,e.z4)}(this,function(e,r,n,o){function t(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach(function(n){if("default"!==n){var o=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(r,n,o.get?o:{enumerable:!0,get:function(){return e[n]}})}}),r.default=e,r}var s=/*#__PURE__*/t(o);function i(){return i=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var n=arguments[r];for(var o in n)({}).hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},i.apply(null,arguments)}function a(e,r){try{var n=e()}catch(e){return r(e)}return n&&n.then?n.then(void 0,r):n}function u(e,r){for(var o={};e.length;){var t=e[0],s=t.code,i=t.message,a=t.path.join(".");if(!o[a])if("unionErrors"in t){var u,c,f=t.unionErrors.reduce(function(e,r){return r.errors.length<e.errors.length?r:e}).errors[0];o[a]={message:null!=(u=null==f?void 0:f.message)?u:i,type:null!=(c=null==f?void 0:f.code)?c:s}}else o[a]={message:i,type:s};if("unionErrors"in t&&t.unionErrors.forEach(function(r){return r.errors.forEach(function(r){return e.push(r)})}),r){var l=o[a].types,d=l&&l[t.code];o[a]=n.appendErrors(a,r,o,s,d?[].concat(d,t.message):t.message)}e.shift()}return o}function c(e,r){for(var o={},t=function(){var t=e[0],s=t.code,a=t.message,u=t.path.join(".");if(!o[u])if("invalid_union"===t.code&&t.errors.length>0){var c,f,l=t.errors.reduce(function(e,r){return r.length<e.length?r:e})[0];o[u]={message:null!=(c=null==l?void 0:l.message)?c:a,type:null!=(f=null==l?void 0:l.code)?f:s}}else o[u]={message:a,type:s};if("invalid_union"===t.code&&t.errors.forEach(function(r){return r.forEach(function(r){return e.push(i({},r,{path:[].concat(t.path,r.path)}))})}),r){var d=o[u].types,v=d&&d[t.code];o[u]=n.appendErrors(u,r,o,s,v?[].concat(v,t.message):t.message)}e.shift()};e.length;)t();return o}e.zodResolver=function(e,n,o){if(void 0===o&&(o={}),function(e){return"_def"in e&&"object"==typeof e._def&&"typeName"in e._def}(e))return function(t,s,i){try{return Promise.resolve(a(function(){return Promise.resolve(e["sync"===o.mode?"parse":"parseAsync"](t,n)).then(function(e){return i.shouldUseNativeValidation&&r.validateFieldsNatively({},i),{errors:{},values:o.raw?Object.assign({},t):e}})},function(e){if(function(e){return Array.isArray(null==e?void 0:e.issues)}(e))return{values:{},errors:r.toNestErrors(u(e.errors,!i.shouldUseNativeValidation&&"all"===i.criteriaMode),i)};throw e}))}catch(e){return Promise.reject(e)}};if(function(e){return"_zod"in e&&"object"==typeof e._zod}(e))return function(t,i,u){try{return Promise.resolve(a(function(){function s(e){return u.shouldUseNativeValidation&&r.validateFieldsNatively({},u),{errors:{},values:o.raw?Object.assign({},t):e}}var i=e;return"sync"===o.mode?s(i.parse(t,n)):Promise.resolve(i.parseAsync(t,n)).then(s)},function(e){if(function(e){return e instanceof s.$ZodError}(e))return{values:{},errors:r.toNestErrors(c(e.issues,!u.shouldUseNativeValidation&&"all"===u.criteriaMode),u)};throw e}))}catch(e){return Promise.reject(e)}};throw new Error("Invalid input: not a Zod schema")}});
1
+ !function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@hookform/resolvers"),require("react-hook-form"),require("zod/v4/core")):"function"==typeof define&&define.amd?define(["exports","@hookform/resolvers","react-hook-form","zod/v4/core"],r):r((e||self).hookformResolversZod={},e.hookformResolvers,e.ReactHookForm,e.z4)}(this,function(e,r,o,n){function t(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach(function(o){if("default"!==o){var n=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(r,o,n.get?n:{enumerable:!0,get:function(){return e[o]}})}}),r.default=e,r}var s=/*#__PURE__*/t(n);function i(){return i=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var o=arguments[r];for(var n in o)({}).hasOwnProperty.call(o,n)&&(e[n]=o[n])}return e},i.apply(null,arguments)}function u(e,r){try{var o=e()}catch(e){return r(e)}return o&&o.then?o.then(void 0,r):o}function a(e,r){for(var n={};e.length;){var t=e[0],s=t.code,i=t.message,u=t.path.join(".");if(!n[u])if("unionErrors"in t){var a,c,l=t.unionErrors.reduce(function(e,r){return r.errors.length<e.errors.length?r:e}).errors[0];n[u]={message:null!=(a=null==l?void 0:l.message)?a:i,type:null!=(c=null==l?void 0:l.code)?c:s}}else n[u]={message:i,type:s};if("unionErrors"in t&&t.unionErrors.forEach(function(r){return r.errors.forEach(function(r){return e.push(r)})}),r){var f=n[u].types,d=f&&f[t.code];n[u]=o.appendErrors(u,r,n,s,d?[].concat(d,t.message):t.message)}e.shift()}return n}function c(e,r){for(var n={},t=function(){var t=e[0],s=t.code,u=t.message,a=t.path.join(".");if(!n[a])if("invalid_union"===t.code&&t.errors.length>0){var c,l,f=t.errors.reduce(function(e,r){return r.length<e.length?r:e})[0];n[a]={message:null!=(c=null==f?void 0:f.message)?c:u,type:null!=(l=null==f?void 0:f.code)?l:s}}else n[a]={message:u,type:s};if("invalid_union"===t.code&&t.errors.forEach(function(r){return r.forEach(function(r){return e.push(i({},r,{path:[].concat(t.path,r.path)}))})}),r){var d=n[a].types,v=d&&d[t.code];n[a]=o.appendErrors(a,r,n,s,v?[].concat(v,t.message):t.message)}e.shift()};e.length;)t();return n}e.zodResolver=function(e,o,n){if(void 0===n&&(n={}),function(e){return"_zod"in e&&"object"==typeof e._zod}(e))return function(t,i,a){try{return Promise.resolve(u(function(){function s(e){return a.shouldUseNativeValidation&&r.validateFieldsNatively({},a),{errors:{},values:n.raw?Object.assign({},t):e}}var i=e;return"sync"===n.mode?s(i.parse(t,o)):Promise.resolve(i.parseAsync(t,o)).then(s)},function(e){if(function(e){return e instanceof s.$ZodError}(e))return{values:{},errors:r.toNestErrors(c(e.issues,!a.shouldUseNativeValidation&&"all"===a.criteriaMode),a)};throw e}))}catch(e){return Promise.reject(e)}};if(function(e){return"_def"in e&&"object"==typeof e._def}(e))return function(t,s,i){try{return Promise.resolve(u(function(){return Promise.resolve(e["sync"===n.mode?"parse":"parseAsync"](t,o)).then(function(e){return i.shouldUseNativeValidation&&r.validateFieldsNatively({},i),{errors:{},values:n.raw?Object.assign({},t):e}})},function(e){if(function(e){return Array.isArray(null==e?void 0:e.issues)}(e))return{values:{},errors:r.toNestErrors(a(e.errors,!i.shouldUseNativeValidation&&"all"===i.criteriaMode),i)};throw e}))}catch(e){return Promise.reject(e)}};throw new Error("Invalid input: not a Zod schema")}});
2
2
  //# sourceMappingURL=zod.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zod.umd.js","sources":["../src/zod.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport {\n FieldError,\n FieldValues,\n Resolver,\n ResolverError,\n ResolverSuccess,\n appendErrors,\n} from 'react-hook-form';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4/core';\n\nconst isZod3Error = (error: any): error is z3.ZodError => {\n return Array.isArray(error?.issues);\n};\nconst isZod3Schema = (schema: any): schema is z3.ZodSchema => {\n return (\n '_def' in schema &&\n typeof schema._def === 'object' &&\n 'typeName' in schema._def\n );\n};\nconst isZod4Error = (error: any): error is z4.$ZodError => {\n // instanceof is safe in Zod 4 (uses Symbol.hasInstance)\n return error instanceof z4.$ZodError;\n};\nconst isZod4Schema = (schema: any): schema is z4.$ZodType => {\n return '_zod' in schema && typeof schema._zod === 'object';\n};\n\nfunction parseZod3Issues(\n zodErrors: z3.ZodIssue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors: Record<string, FieldError> = {};\n for (; zodErrors.length; ) {\n const error = zodErrors[0];\n const { code, message, path } = error;\n const _path = path.join('.');\n\n if (!errors[_path]) {\n if ('unionErrors' in error) {\n // Surface the error from whichever union member came closest to\n // matching (fewest issues), rather than always the first member —\n // the first member isn't necessarily the one the input was meant for.\n const closestUnionError = error.unionErrors.reduce(\n (closest, current) =>\n current.errors.length < closest.errors.length ? current : closest,\n );\n // Fall back to the union issue's own message/code if the closest\n // member somehow has no issues of its own (shouldn't happen, but\n // avoids ever throwing on an unexpected/malformed union shape).\n const unionError = closestUnionError.errors[0];\n\n errors[_path] = {\n message: unionError?.message ?? message,\n type: unionError?.code ?? code,\n };\n } else {\n errors[_path] = { message, type: code };\n }\n }\n\n if ('unionErrors' in error) {\n error.unionErrors.forEach((unionError) =>\n unionError.errors.forEach((e) => zodErrors.push(e)),\n );\n }\n\n if (validateAllFieldCriteria) {\n const types = errors[_path].types;\n const messages = types && types[error.code];\n\n errors[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n errors,\n code,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n zodErrors.shift();\n }\n\n return errors;\n}\n\nfunction parseZod4Issues(\n zodErrors: z4.$ZodIssue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors: Record<string, FieldError> = {};\n // const _zodErrors = zodErrors as z4.$ZodISsue; //\n for (; zodErrors.length; ) {\n const error = zodErrors[0];\n const { code, message, path } = error;\n const _path = path.join('.');\n\n if (!errors[_path]) {\n if (error.code === 'invalid_union' && error.errors.length > 0) {\n // Surface the error from whichever union member came closest to\n // matching (fewest issues), rather than always the first member —\n // the first member isn't necessarily the one the input was meant for.\n const closestBranch = error.errors.reduce((closest, branch) =>\n branch.length < closest.length ? branch : closest,\n );\n // Fall back to the union issue's own message/code if the closest\n // branch somehow has no issues of its own (shouldn't happen — a\n // 0-issue branch means that branch matched — but this guarantees we\n // never throw on an unexpected/malformed union shape, e.g. a \"no\n // matching discriminator\" issue nested in a way we haven't seen).\n const unionError = closestBranch[0];\n\n errors[_path] = {\n message: unionError?.message ?? message,\n type: unionError?.code ?? code,\n };\n } else {\n errors[_path] = { message, type: code };\n }\n }\n\n if (error.code === 'invalid_union') {\n error.errors.forEach((unionError) =>\n unionError.forEach((e) =>\n zodErrors.push({ ...e, path: [...error.path, ...e.path] }),\n ),\n );\n }\n\n if (validateAllFieldCriteria) {\n const types = errors[_path].types;\n const messages = types && types[error.code];\n\n errors[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n errors,\n code,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n zodErrors.shift();\n }\n\n return errors;\n}\n\ntype RawResolverOptions = {\n mode?: 'async' | 'sync';\n raw: true;\n};\ntype NonRawResolverOptions = {\n mode?: 'async' | 'sync';\n raw?: false;\n};\n\n// minimal interfaces to avoid asssignability issues between versions\ninterface Zod3Type<O = unknown, I = unknown> {\n _output: O;\n _input: I;\n _def: {\n typeName: string;\n };\n}\n\n// minimal interface to avoid assignability issues between zod v4 patch/minor\n// releases, which brand the full `$ZodType` shape with an exact version literal\n// (e.g. `_zod.version.minor`)\ninterface Zod4Type<Output = unknown, Input = unknown> {\n _zod: {\n output: Output;\n input: Input;\n };\n}\n\n// some type magic to make versions pre-3.25.0 still work\ntype IsUnresolved<T> = PropertyKey extends keyof T ? true : false;\ntype UnresolvedFallback<T, Fallback> = IsUnresolved<typeof z3> extends true\n ? Fallback\n : T;\ntype FallbackIssue = {\n code: string;\n message: string;\n path: (string | number)[];\n};\ntype Zod3ParseParams = UnresolvedFallback<\n z3.ParseParams,\n // fallback if user is on <3.25.0\n {\n path?: (string | number)[];\n errorMap?: (\n iss: FallbackIssue,\n ctx: {\n defaultError: string;\n data: any;\n },\n ) => { message: string };\n async?: boolean;\n }\n>;\ntype Zod4ParseParams = UnresolvedFallback<\n z4.ParseContext<z4.$ZodIssue>,\n // fallback if user is on <3.25.0\n {\n readonly error?: (\n iss: FallbackIssue,\n ) => null | undefined | string | { message: string };\n readonly reportInput?: boolean;\n readonly jitless?: boolean;\n }\n>;\n\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: Zod3Type<Output, Input>,\n schemaOptions?: Zod3ParseParams,\n resolverOptions?: NonRawResolverOptions,\n): Resolver<Input, Context, Output>;\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: Zod3Type<Output, Input>,\n schemaOptions: Zod3ParseParams | undefined,\n resolverOptions: RawResolverOptions,\n): Resolver<Input, Context, Input>;\n// the Zod 4 overloads need to be generic for complicated reasons\nexport function zodResolver<\n Input extends FieldValues,\n Context,\n Output,\n T extends Zod4Type<Output, Input> = Zod4Type<Output, Input>,\n>(\n schema: T,\n schemaOptions?: Zod4ParseParams, // already partial\n resolverOptions?: NonRawResolverOptions,\n): Resolver<z4.input<T>, Context, z4.output<T>>;\nexport function zodResolver<\n Input extends FieldValues,\n Context,\n Output,\n T extends Zod4Type<Output, Input> = Zod4Type<Output, Input>,\n>(\n schema: Zod4Type<Output, Input>,\n schemaOptions: Zod4ParseParams | undefined, // already partial\n resolverOptions: RawResolverOptions,\n): Resolver<z4.input<T>, Context, z4.input<T>>;\n/**\n * Creates a resolver function for react-hook-form that validates form data using a Zod schema\n * @param {z3.ZodSchema<Input>} schema - The Zod schema used to validate the form data\n * @param {Partial<z3.ParseParams>} [schemaOptions] - Optional configuration options for Zod parsing\n * @param {Object} [resolverOptions] - Optional resolver-specific configuration\n * @param {('async'|'sync')} [resolverOptions.mode='async'] - Validation mode. Use 'sync' for synchronous validation\n * @param {boolean} [resolverOptions.raw=false] - If true, returns the raw form values instead of the parsed data\n * @returns {Resolver<z3.output<typeof schema>>} A resolver function compatible with react-hook-form\n * @throws {Error} Throws if validation fails with a non-Zod error\n * @example\n * const schema = z3.object({\n * name: z3.string().min(2),\n * age: z3.number().min(18)\n * });\n *\n * useForm({\n * resolver: zodResolver(schema)\n * });\n */\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: object,\n schemaOptions?: object,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Output | Input> {\n if (isZod3Schema(schema)) {\n return async (values: Input, _, options) => {\n try {\n const data = await schema[\n resolverOptions.mode === 'sync' ? 'parse' : 'parseAsync'\n ](values, schemaOptions);\n\n options.shouldUseNativeValidation &&\n validateFieldsNatively({}, options);\n\n return {\n errors: {},\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n } satisfies ResolverSuccess<Output | Input>;\n } catch (error) {\n if (isZod3Error(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseZod3Issues(\n error.errors,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n } satisfies ResolverError<Input>;\n }\n\n throw error;\n }\n };\n }\n\n if (isZod4Schema(schema)) {\n return async (values: Input, _, options) => {\n try {\n // Call the schema's own bound `parse`/`parseAsync` method rather\n // than the standalone `z4.parse`/`z4.parseAsync` functions. Those\n // standalone functions read from this module's own imported\n // `zod/v4/core`, which — under bundlers that can resolve `zod` and\n // `zod/v4/core` to two distinct module instances (e.g. Metro with\n // package-exports resolution enabled) — may not be the same zod\n // instance the schema was created with, silently dropping any\n // global config (`z.config()`) or locale the app configured on its\n // own zod instance. The schema's own method is always bound to\n // whichever zod instance actually created it.\n const classicSchema = schema as unknown as {\n parse: (values: unknown, schemaOptions: unknown) => unknown;\n parseAsync: (\n values: unknown,\n schemaOptions: unknown,\n ) => Promise<unknown>;\n };\n const data: any =\n resolverOptions.mode === 'sync'\n ? classicSchema.parse(values, schemaOptions)\n : await classicSchema.parseAsync(values, schemaOptions);\n\n options.shouldUseNativeValidation &&\n validateFieldsNatively({}, options);\n\n return {\n errors: {},\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n } satisfies ResolverSuccess<Output | Input>;\n } catch (error) {\n if (isZod4Error(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseZod4Issues(\n error.issues,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n } satisfies ResolverError<Input>;\n }\n\n throw error;\n }\n };\n }\n\n throw new Error('Invalid input: not a Zod schema');\n}\n"],"names":["parseZod3Issues","zodErrors","validateAllFieldCriteria","errors","length","error","code","message","_path","path","join","_unionError$message","_unionError$code","unionError","unionErrors","reduce","closest","current","type","forEach","e","push","types","messages","appendErrors","concat","shift","parseZod4Issues","_loop","_unionError$message2","_unionError$code2","branch","_extends","schema","schemaOptions","resolverOptions","_def","isZod3Schema","values","_","options","Promise","resolve","_catch","mode","then","data","shouldUseNativeValidation","validateFieldsNatively","raw","Object","assign","Array","isArray","issues","isZod3Error","toNestErrors","criteriaMode","reject","_zod","isZod4Schema","_temp2","classicSchema","parse","parseAsync","z4","$ZodError","isZod4Error","Error"],"mappings":"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"}
1
+ {"version":3,"file":"zod.umd.js","sources":["../src/zod.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport {\n FieldError,\n FieldValues,\n Resolver,\n ResolverError,\n ResolverSuccess,\n appendErrors,\n} from 'react-hook-form';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4/core';\n\nconst isZod3Error = (error: any): error is z3.ZodError => {\n return Array.isArray(error?.issues);\n};\nconst isZod3Schema = (schema: any): schema is z3.ZodSchema => {\n // Deliberately doesn't require `typeName` in `_def` — dynamically selected\n // schemas typed via the generic `z.ZodType<Output>` annotation (rather than\n // a concrete subclass like `ZodObject`) don't statically expose `typeName`,\n // even though they're genuine Zod 3 schema instances at runtime.\n return '_def' in schema && typeof schema._def === 'object';\n};\nconst isZod4Error = (error: any): error is z4.$ZodError => {\n // instanceof is safe in Zod 4 (uses Symbol.hasInstance)\n return error instanceof z4.$ZodError;\n};\nconst isZod4Schema = (schema: any): schema is z4.$ZodType => {\n return '_zod' in schema && typeof schema._zod === 'object';\n};\n\nfunction parseZod3Issues(\n zodErrors: z3.ZodIssue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors: Record<string, FieldError> = {};\n for (; zodErrors.length; ) {\n const error = zodErrors[0];\n const { code, message, path } = error;\n const _path = path.join('.');\n\n if (!errors[_path]) {\n if ('unionErrors' in error) {\n // Surface the error from whichever union member came closest to\n // matching (fewest issues), rather than always the first member —\n // the first member isn't necessarily the one the input was meant for.\n const closestUnionError = error.unionErrors.reduce(\n (closest, current) =>\n current.errors.length < closest.errors.length ? current : closest,\n );\n // Fall back to the union issue's own message/code if the closest\n // member somehow has no issues of its own (shouldn't happen, but\n // avoids ever throwing on an unexpected/malformed union shape).\n const unionError = closestUnionError.errors[0];\n\n errors[_path] = {\n message: unionError?.message ?? message,\n type: unionError?.code ?? code,\n };\n } else {\n errors[_path] = { message, type: code };\n }\n }\n\n if ('unionErrors' in error) {\n error.unionErrors.forEach((unionError) =>\n unionError.errors.forEach((e) => zodErrors.push(e)),\n );\n }\n\n if (validateAllFieldCriteria) {\n const types = errors[_path].types;\n const messages = types && types[error.code];\n\n errors[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n errors,\n code,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n zodErrors.shift();\n }\n\n return errors;\n}\n\nfunction parseZod4Issues(\n zodErrors: z4.$ZodIssue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors: Record<string, FieldError> = {};\n // const _zodErrors = zodErrors as z4.$ZodISsue; //\n for (; zodErrors.length; ) {\n const error = zodErrors[0];\n const { code, message, path } = error;\n const _path = path.join('.');\n\n if (!errors[_path]) {\n if (error.code === 'invalid_union' && error.errors.length > 0) {\n // Surface the error from whichever union member came closest to\n // matching (fewest issues), rather than always the first member —\n // the first member isn't necessarily the one the input was meant for.\n const closestBranch = error.errors.reduce((closest, branch) =>\n branch.length < closest.length ? branch : closest,\n );\n // Fall back to the union issue's own message/code if the closest\n // branch somehow has no issues of its own (shouldn't happen — a\n // 0-issue branch means that branch matched — but this guarantees we\n // never throw on an unexpected/malformed union shape, e.g. a \"no\n // matching discriminator\" issue nested in a way we haven't seen).\n const unionError = closestBranch[0];\n\n errors[_path] = {\n message: unionError?.message ?? message,\n type: unionError?.code ?? code,\n };\n } else {\n errors[_path] = { message, type: code };\n }\n }\n\n if (error.code === 'invalid_union') {\n error.errors.forEach((unionError) =>\n unionError.forEach((e) =>\n zodErrors.push({ ...e, path: [...error.path, ...e.path] }),\n ),\n );\n }\n\n if (validateAllFieldCriteria) {\n const types = errors[_path].types;\n const messages = types && types[error.code];\n\n errors[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n errors,\n code,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n zodErrors.shift();\n }\n\n return errors;\n}\n\ntype RawResolverOptions = {\n mode?: 'async' | 'sync';\n raw: true;\n};\ntype NonRawResolverOptions = {\n mode?: 'async' | 'sync';\n raw?: false;\n};\n\n// minimal interfaces to avoid asssignability issues between versions\ninterface Zod3Type<O = unknown, I = unknown> {\n _output: O;\n _input: I;\n _def: object;\n}\n\n// minimal interface to avoid assignability issues between zod v4 patch/minor\n// releases, which brand the full `$ZodType` shape with an exact version literal\n// (e.g. `_zod.version.minor`)\ninterface Zod4Type<Output = unknown, Input = unknown> {\n _zod: {\n output: Output;\n input: Input;\n };\n}\n\n// some type magic to make versions pre-3.25.0 still work\ntype IsUnresolved<T> = PropertyKey extends keyof T ? true : false;\ntype UnresolvedFallback<T, Fallback> = IsUnresolved<typeof z3> extends true\n ? Fallback\n : T;\ntype FallbackIssue = {\n code: string;\n message: string;\n path: (string | number)[];\n};\ntype Zod3ParseParams = UnresolvedFallback<\n z3.ParseParams,\n // fallback if user is on <3.25.0\n {\n path?: (string | number)[];\n errorMap?: (\n iss: FallbackIssue,\n ctx: {\n defaultError: string;\n data: any;\n },\n ) => { message: string };\n async?: boolean;\n }\n>;\ntype Zod4ParseParams = UnresolvedFallback<\n z4.ParseContext<z4.$ZodIssue>,\n // fallback if user is on <3.25.0\n {\n readonly error?: (\n iss: FallbackIssue,\n ) => null | undefined | string | { message: string };\n readonly reportInput?: boolean;\n readonly jitless?: boolean;\n }\n>;\n\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: Zod3Type<Output, Input>,\n schemaOptions?: Zod3ParseParams,\n resolverOptions?: NonRawResolverOptions,\n): Resolver<Input, Context, Output>;\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: Zod3Type<Output, Input>,\n schemaOptions: Zod3ParseParams | undefined,\n resolverOptions: RawResolverOptions,\n): Resolver<Input, Context, Input>;\n// the Zod 4 overloads need to be generic for complicated reasons\nexport function zodResolver<\n Input extends FieldValues,\n Context,\n Output,\n T extends Zod4Type<Output, Input> = Zod4Type<Output, Input>,\n>(\n schema: T,\n schemaOptions?: Zod4ParseParams, // already partial\n resolverOptions?: NonRawResolverOptions,\n): Resolver<z4.input<T>, Context, z4.output<T>>;\nexport function zodResolver<\n Input extends FieldValues,\n Context,\n Output,\n T extends Zod4Type<Output, Input> = Zod4Type<Output, Input>,\n>(\n schema: Zod4Type<Output, Input>,\n schemaOptions: Zod4ParseParams | undefined, // already partial\n resolverOptions: RawResolverOptions,\n): Resolver<z4.input<T>, Context, z4.input<T>>;\n/**\n * Creates a resolver function for react-hook-form that validates form data using a Zod schema\n * @param {z3.ZodSchema<Input>} schema - The Zod schema used to validate the form data\n * @param {Partial<z3.ParseParams>} [schemaOptions] - Optional configuration options for Zod parsing\n * @param {Object} [resolverOptions] - Optional resolver-specific configuration\n * @param {('async'|'sync')} [resolverOptions.mode='async'] - Validation mode. Use 'sync' for synchronous validation\n * @param {boolean} [resolverOptions.raw=false] - If true, returns the raw form values instead of the parsed data\n * @returns {Resolver<z3.output<typeof schema>>} A resolver function compatible with react-hook-form\n * @throws {Error} Throws if validation fails with a non-Zod error\n * @example\n * const schema = z3.object({\n * name: z3.string().min(2),\n * age: z3.number().min(18)\n * });\n *\n * useForm({\n * resolver: zodResolver(schema)\n * });\n */\nexport function zodResolver<Input extends FieldValues, Context, Output>(\n schema: object,\n schemaOptions?: object,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Output | Input> {\n // Zod 4 is checked first: its `_zod` marker is unambiguous, whereas the\n // Zod 3 check below only requires an object-shaped `_def` (to support\n // dynamically-selected schemas typed via the generic `z.ZodType<Output>`\n // annotation, see `isZod3Schema`) — and Zod 4 schemas also have an\n // object-shaped `_def`, so they'd otherwise be misdetected as Zod 3.\n if (isZod4Schema(schema)) {\n return async (values: Input, _, options) => {\n try {\n // Call the schema's own bound `parse`/`parseAsync` method rather\n // than the standalone `z4.parse`/`z4.parseAsync` functions. Those\n // standalone functions read from this module's own imported\n // `zod/v4/core`, which — under bundlers that can resolve `zod` and\n // `zod/v4/core` to two distinct module instances (e.g. Metro with\n // package-exports resolution enabled) — may not be the same zod\n // instance the schema was created with, silently dropping any\n // global config (`z.config()`) or locale the app configured on its\n // own zod instance. The schema's own method is always bound to\n // whichever zod instance actually created it.\n const classicSchema = schema as unknown as {\n parse: (values: unknown, schemaOptions: unknown) => unknown;\n parseAsync: (\n values: unknown,\n schemaOptions: unknown,\n ) => Promise<unknown>;\n };\n const data: any =\n resolverOptions.mode === 'sync'\n ? classicSchema.parse(values, schemaOptions)\n : await classicSchema.parseAsync(values, schemaOptions);\n\n options.shouldUseNativeValidation &&\n validateFieldsNatively({}, options);\n\n return {\n errors: {},\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n } satisfies ResolverSuccess<Output | Input>;\n } catch (error) {\n if (isZod4Error(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseZod4Issues(\n error.issues,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n } satisfies ResolverError<Input>;\n }\n\n throw error;\n }\n };\n }\n\n if (isZod3Schema(schema)) {\n return async (values: Input, _, options) => {\n try {\n const data = await schema[\n resolverOptions.mode === 'sync' ? 'parse' : 'parseAsync'\n ](values, schemaOptions);\n\n options.shouldUseNativeValidation &&\n validateFieldsNatively({}, options);\n\n return {\n errors: {},\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n } satisfies ResolverSuccess<Output | Input>;\n } catch (error) {\n if (isZod3Error(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseZod3Issues(\n error.errors,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n } satisfies ResolverError<Input>;\n }\n\n throw error;\n }\n };\n }\n\n throw new Error('Invalid input: not a Zod schema');\n}\n"],"names":["parseZod3Issues","zodErrors","validateAllFieldCriteria","errors","length","error","code","message","_path","path","join","_unionError$message","_unionError$code","unionError","unionErrors","reduce","closest","current","type","forEach","e","push","types","messages","appendErrors","concat","shift","parseZod4Issues","_loop","_unionError$message2","_unionError$code2","branch","_extends","schema","schemaOptions","resolverOptions","_zod","isZod4Schema","values","_","options","Promise","resolve","_catch","_temp2","data","shouldUseNativeValidation","validateFieldsNatively","raw","Object","assign","classicSchema","mode","parse","parseAsync","then","z4","$ZodError","isZod4Error","toNestErrors","issues","criteriaMode","reject","_def","isZod3Schema","Array","isArray","isZod3Error","Error"],"mappings":"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"}
@@ -214,4 +214,27 @@ describe('zodResolver', () => {
214
214
  }>
215
215
  >();
216
216
  });
217
+
218
+ it('should accept a dynamically selected schema typed via the generic z.ZodType annotation', async () => {
219
+ // https://github.com/react-hook-form/resolvers/issues/782 — schemas
220
+ // chosen conditionally between two shapes and annotated with the base
221
+ // `z.ZodType<Output>` (rather than a concrete subclass like `ZodObject`)
222
+ // don't statically expose `_def.typeName`, even though they're genuine
223
+ // Zod 3 schema instances at runtime.
224
+ const updateSchema = z.object({ id: z.string(), name: z.string() });
225
+ const createSchema = z.object({ name: z.string() });
226
+ const useUpdateSchema = true;
227
+ const dynamicSchema = (
228
+ useUpdateSchema ? updateSchema : createSchema
229
+ ) as z.ZodType<{ name: string }>;
230
+
231
+ const resolver = zodResolver(dynamicSchema);
232
+
233
+ const result = await resolver({ id: '1', name: 'John' } as any, undefined, {
234
+ fields: {},
235
+ shouldUseNativeValidation,
236
+ });
237
+
238
+ expect(result.errors).toEqual({});
239
+ });
217
240
  });
@@ -208,6 +208,30 @@ describe('zodResolver', () => {
208
208
  });
209
209
  });
210
210
 
211
+ it('should not misdetect a zod4 schema as zod3 (both have an object-shaped `_def`)', async () => {
212
+ // The zod3 detection was loosened to only require an object-shaped
213
+ // `_def` (see issue #782 — dynamically selected schemas typed via the
214
+ // generic `z.ZodType<Output>` annotation don't statically expose
215
+ // `_def.typeName`). Zod 4 schemas also have an object-shaped `_def`
216
+ // (just without `typeName`), so zod4 must be detected first via its
217
+ // unambiguous `_zod` marker — otherwise this would incorrectly take the
218
+ // zod3 code path and mishandle zod4's error shape.
219
+ const testSchema = z.object({ name: z.string() });
220
+
221
+ const result = await zodResolver(testSchema)(
222
+ { name: 123 as any },
223
+ undefined,
224
+ {
225
+ fields: {},
226
+ shouldUseNativeValidation,
227
+ },
228
+ );
229
+
230
+ expect(result.errors).toMatchObject({
231
+ name: { type: 'invalid_type' },
232
+ });
233
+ });
234
+
211
235
  it('should throw any error unrelated to Zod', async () => {
212
236
  const schemaWithCustomError = schema.refine(() => {
213
237
  throw Error('custom error');
package/zod/src/zod.ts CHANGED
@@ -14,11 +14,11 @@ const isZod3Error = (error: any): error is z3.ZodError => {
14
14
  return Array.isArray(error?.issues);
15
15
  };
16
16
  const isZod3Schema = (schema: any): schema is z3.ZodSchema => {
17
- return (
18
- '_def' in schema &&
19
- typeof schema._def === 'object' &&
20
- 'typeName' in schema._def
21
- );
17
+ // Deliberately doesn't require `typeName` in `_def` — dynamically selected
18
+ // schemas typed via the generic `z.ZodType<Output>` annotation (rather than
19
+ // a concrete subclass like `ZodObject`) don't statically expose `typeName`,
20
+ // even though they're genuine Zod 3 schema instances at runtime.
21
+ return '_def' in schema && typeof schema._def === 'object';
22
22
  };
23
23
  const isZod4Error = (error: any): error is z4.$ZodError => {
24
24
  // instanceof is safe in Zod 4 (uses Symbol.hasInstance)
@@ -165,9 +165,7 @@ type NonRawResolverOptions = {
165
165
  interface Zod3Type<O = unknown, I = unknown> {
166
166
  _output: O;
167
167
  _input: I;
168
- _def: {
169
- typeName: string;
170
- };
168
+ _def: object;
171
169
  }
172
170
 
173
171
  // minimal interface to avoid assignability issues between zod v4 patch/minor
@@ -275,12 +273,35 @@ export function zodResolver<Input extends FieldValues, Context, Output>(
275
273
  raw?: boolean;
276
274
  } = {},
277
275
  ): Resolver<Input, Context, Output | Input> {
278
- if (isZod3Schema(schema)) {
276
+ // Zod 4 is checked first: its `_zod` marker is unambiguous, whereas the
277
+ // Zod 3 check below only requires an object-shaped `_def` (to support
278
+ // dynamically-selected schemas typed via the generic `z.ZodType<Output>`
279
+ // annotation, see `isZod3Schema`) — and Zod 4 schemas also have an
280
+ // object-shaped `_def`, so they'd otherwise be misdetected as Zod 3.
281
+ if (isZod4Schema(schema)) {
279
282
  return async (values: Input, _, options) => {
280
283
  try {
281
- const data = await schema[
282
- resolverOptions.mode === 'sync' ? 'parse' : 'parseAsync'
283
- ](values, schemaOptions);
284
+ // Call the schema's own bound `parse`/`parseAsync` method rather
285
+ // than the standalone `z4.parse`/`z4.parseAsync` functions. Those
286
+ // standalone functions read from this module's own imported
287
+ // `zod/v4/core`, which — under bundlers that can resolve `zod` and
288
+ // `zod/v4/core` to two distinct module instances (e.g. Metro with
289
+ // package-exports resolution enabled) — may not be the same zod
290
+ // instance the schema was created with, silently dropping any
291
+ // global config (`z.config()`) or locale the app configured on its
292
+ // own zod instance. The schema's own method is always bound to
293
+ // whichever zod instance actually created it.
294
+ const classicSchema = schema as unknown as {
295
+ parse: (values: unknown, schemaOptions: unknown) => unknown;
296
+ parseAsync: (
297
+ values: unknown,
298
+ schemaOptions: unknown,
299
+ ) => Promise<unknown>;
300
+ };
301
+ const data: any =
302
+ resolverOptions.mode === 'sync'
303
+ ? classicSchema.parse(values, schemaOptions)
304
+ : await classicSchema.parseAsync(values, schemaOptions);
284
305
 
285
306
  options.shouldUseNativeValidation &&
286
307
  validateFieldsNatively({}, options);
@@ -290,12 +311,12 @@ export function zodResolver<Input extends FieldValues, Context, Output>(
290
311
  values: resolverOptions.raw ? Object.assign({}, values) : data,
291
312
  } satisfies ResolverSuccess<Output | Input>;
292
313
  } catch (error) {
293
- if (isZod3Error(error)) {
314
+ if (isZod4Error(error)) {
294
315
  return {
295
316
  values: {},
296
317
  errors: toNestErrors(
297
- parseZod3Issues(
298
- error.errors,
318
+ parseZod4Issues(
319
+ error.issues,
299
320
  !options.shouldUseNativeValidation &&
300
321
  options.criteriaMode === 'all',
301
322
  ),
@@ -309,30 +330,12 @@ export function zodResolver<Input extends FieldValues, Context, Output>(
309
330
  };
310
331
  }
311
332
 
312
- if (isZod4Schema(schema)) {
333
+ if (isZod3Schema(schema)) {
313
334
  return async (values: Input, _, options) => {
314
335
  try {
315
- // Call the schema's own bound `parse`/`parseAsync` method rather
316
- // than the standalone `z4.parse`/`z4.parseAsync` functions. Those
317
- // standalone functions read from this module's own imported
318
- // `zod/v4/core`, which — under bundlers that can resolve `zod` and
319
- // `zod/v4/core` to two distinct module instances (e.g. Metro with
320
- // package-exports resolution enabled) — may not be the same zod
321
- // instance the schema was created with, silently dropping any
322
- // global config (`z.config()`) or locale the app configured on its
323
- // own zod instance. The schema's own method is always bound to
324
- // whichever zod instance actually created it.
325
- const classicSchema = schema as unknown as {
326
- parse: (values: unknown, schemaOptions: unknown) => unknown;
327
- parseAsync: (
328
- values: unknown,
329
- schemaOptions: unknown,
330
- ) => Promise<unknown>;
331
- };
332
- const data: any =
333
- resolverOptions.mode === 'sync'
334
- ? classicSchema.parse(values, schemaOptions)
335
- : await classicSchema.parseAsync(values, schemaOptions);
336
+ const data = await schema[
337
+ resolverOptions.mode === 'sync' ? 'parse' : 'parseAsync'
338
+ ](values, schemaOptions);
336
339
 
337
340
  options.shouldUseNativeValidation &&
338
341
  validateFieldsNatively({}, options);
@@ -342,12 +345,12 @@ export function zodResolver<Input extends FieldValues, Context, Output>(
342
345
  values: resolverOptions.raw ? Object.assign({}, values) : data,
343
346
  } satisfies ResolverSuccess<Output | Input>;
344
347
  } catch (error) {
345
- if (isZod4Error(error)) {
348
+ if (isZod3Error(error)) {
346
349
  return {
347
350
  values: {},
348
351
  errors: toNestErrors(
349
- parseZod4Issues(
350
- error.issues,
352
+ parseZod3Issues(
353
+ error.errors,
351
354
  !options.shouldUseNativeValidation &&
352
355
  options.criteriaMode === 'all',
353
356
  ),