@hookform/resolvers 5.5.0 → 5.5.2

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@hookform/resolvers",
3
3
  "amdName": "hookformResolvers",
4
- "version": "5.5.0",
4
+ "version": "5.5.2",
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.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 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=o.unionErrors.reduce(function(r,e){return e.errors.length<r.errors.length?e:r}).errors[0];t[a]={message:u.message,type:u.code}}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 c=t[a].types,f=c&&c[o.code];t[a]=e.appendErrors(a,n,t,s,f?[].concat(f,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=s.errors.reduce(function(r,e){return e.length<r.length?e:r})[0];t[u]={message:c.message,type:c.code}}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 f=t[u].types,l=f&&f[s.code];t[u]=e.appendErrors(u,n,t,i,l?[].concat(l,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"_def"in r&&"object"==typeof r._def&&"typeName"in 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)}};if(function(r){return"_zod"in r&&"object"==typeof r._zod}(e))return function(i,u,c){try{return Promise.resolve(s(function(){return Promise.resolve(("sync"===o.mode?t.parse:t.parseAsync)(e,i,n)).then(function(e){return c.shouldUseNativeValidation&&r.validateFieldsNatively({},c),{errors:{},values:o.raw?Object.assign({},i):e}})},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 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")};
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 const unionError = closestUnionError.errors[0];\n\n errors[_path] = {\n message: unionError.message,\n type: unionError.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 const unionError = closestBranch[0];\n\n errors[_path] = {\n message: unionError.message,\n type: unionError.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 const parseFn =\n resolverOptions.mode === 'sync' ? z4.parse : z4.parseAsync;\n const data: any = await parseFn(schema, 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","unionErrors","reduce","closest","current","type","forEach","e","push","types","messages","appendErrors","concat","shift","parseZod4Issues","_loop","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","z4","parse","parseAsync","$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 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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"}
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=t.unionErrors.reduce(function(r,e){return e.errors.length<r.errors.length?e:r}).errors[0];o[a]={message:u.message,type:u.code}}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 c=o[a].types,f=c&&c[t.code];o[a]=n(a,e,o,s,f?[].concat(f,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=s.errors.reduce(function(r,e){return e.length<r.length?e:r})[0];o[u]={message:c.message,type:c.code}}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 f=o[u].types,l=f&&f[s.code];o[u]=n(u,e,o,i,l?[].concat(l,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,f){try{return Promise.resolve(s(function(){return Promise.resolve(("sync"===u.mode?o.parse:o.parseAsync)(n,i,t)).then(function(e){return f.shouldUseNativeValidation&&r({},f),{errors:{},values:u.raw?Object.assign({},i):e}})},function(r){if(function(r){return r instanceof o.$ZodError}(r))return{values:{},errors:e(a(r.issues,!f.shouldUseNativeValidation&&"all"===f.criteriaMode),f)};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,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};
2
2
  //# sourceMappingURL=zod.module.js.map
@@ -1,2 +1,2 @@
1
- import{validateFieldsNatively as e,toNestErrors as r}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(e){for(var r=1;r<arguments.length;r++){var o=arguments[r];for(var s in o)({}).hasOwnProperty.call(o,s)&&(e[s]=o[s])}return e},n.apply(null,arguments)}function t(e,r){const s={};for(;e.length;){const n=e[0],{code:t,message:a,path:i}=n,c=i.join(".");if(!s[c])if("unionErrors"in n){const e=n.unionErrors.reduce((e,r)=>r.errors.length<e.errors.length?r:e).errors[0];s[c]={message:e.message,type:e.code}}else s[c]={message:a,type:t};if("unionErrors"in n&&n.unionErrors.forEach(r=>r.errors.forEach(r=>e.push(r))),r){const e=s[c].types,a=e&&e[n.code];s[c]=o(c,r,s,t,a?[].concat(a,n.message):n.message)}e.shift()}return s}function a(e,r){const s={};for(;e.length;){const t=e[0],{code:a,message:i,path:c}=t,u=c.join(".");if(!s[u])if("invalid_union"===t.code&&t.errors.length>0){const e=t.errors.reduce((e,r)=>r.length<e.length?r:e)[0];s[u]={message:e.message,type:e.code}}else s[u]={message:i,type:a};if("invalid_union"===t.code&&t.errors.forEach(r=>r.forEach(r=>e.push(n({},r,{path:[...t.path,...r.path]})))),r){const e=s[u].types,n=e&&e[t.code];s[u]=o(u,r,s,a,n?[].concat(n,t.message):t.message)}e.shift()}return s}function i(o,n,i={}){if((e=>"_def"in e&&"object"==typeof e._def&&"typeName"in e._def)(o))return async(s,a,c)=>{try{const r=await o["sync"===i.mode?"parse":"parseAsync"](s,n);return c.shouldUseNativeValidation&&e({},c),{errors:{},values:i.raw?Object.assign({},s):r}}catch(e){if((e=>Array.isArray(null==e?void 0:e.issues))(e))return{values:{},errors:r(t(e.errors,!c.shouldUseNativeValidation&&"all"===c.criteriaMode),c)};throw e}};if((e=>"_zod"in e&&"object"==typeof e._zod)(o))return async(t,c,u)=>{try{const r="sync"===i.mode?s.parse:s.parseAsync,a=await r(o,t,n);return u.shouldUseNativeValidation&&e({},u),{errors:{},values:i.raw?Object.assign({},t):a}}catch(e){if((e=>e instanceof s.$ZodError)(e))return{values:{},errors:r(a(e.issues,!u.shouldUseNativeValidation&&"all"===u.criteriaMode),u)};throw e}};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=>"_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};
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 const unionError = closestUnionError.errors[0];\n\n errors[_path] = {\n message: unionError.message,\n type: unionError.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 const unionError = closestBranch[0];\n\n errors[_path] = {\n message: unionError.message,\n type: unionError.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 const parseFn =\n resolverOptions.mode === 'sync' ? z4.parse : z4.parseAsync;\n const data: any = await parseFn(schema, 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","unionErrors","reduce","closest","current","type","forEach","e","push","types","messages","appendErrors","concat","shift","parseZod4Issues","branch","_extends","zodResolver","schema","schemaOptions","resolverOptions","_def","isZod3Schema","values","_","options","data","mode","shouldUseNativeValidation","validateFieldsNatively","raw","Object","assign","Array","isArray","issues","isZod3Error","toNestErrors","criteriaMode","_zod","isZod4Schema","async","parseFn","z4","parse","parseAsync","$ZodError","isZod4Error","Error"],"mappings":"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"}
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":"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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=t.unionErrors.reduce(function(r,e){return e.errors.length<r.errors.length?e:r}).errors[0];o[a]={message:u.message,type:u.code}}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 c=o[a].types,f=c&&c[t.code];o[a]=n(a,e,o,s,f?[].concat(f,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=s.errors.reduce(function(r,e){return e.length<r.length?e:r})[0];o[u]={message:c.message,type:c.code}}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 f=o[u].types,l=f&&f[s.code];o[u]=n(u,e,o,i,l?[].concat(l,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,f){try{return Promise.resolve(s(function(){return Promise.resolve(("sync"===u.mode?o.parse:o.parseAsync)(n,i,t)).then(function(e){return f.shouldUseNativeValidation&&r({},f),{errors:{},values:u.raw?Object.assign({},i):e}})},function(r){if(function(r){return r instanceof o.$ZodError}(r))return{values:{},errors:e(a(r.issues,!f.shouldUseNativeValidation&&"all"===f.criteriaMode),f)};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,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};
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 const unionError = closestUnionError.errors[0];\n\n errors[_path] = {\n message: unionError.message,\n type: unionError.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 const unionError = closestBranch[0];\n\n errors[_path] = {\n message: unionError.message,\n type: unionError.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 const parseFn =\n resolverOptions.mode === 'sync' ? z4.parse : z4.parseAsync;\n const data: any = await parseFn(schema, 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","unionErrors","reduce","closest","current","type","forEach","e","push","types","messages","appendErrors","concat","shift","parseZod4Issues","_loop","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","z4","parse","parseAsync","$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 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,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,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 a(e,r){try{var o=e()}catch(e){return r(e)}return o&&o.then?o.then(void 0,r):o}function u(e,r){for(var n={};e.length;){var t=e[0],s=t.code,i=t.message,a=t.path.join(".");if(!n[a])if("unionErrors"in t){var u=t.unionErrors.reduce(function(e,r){return r.errors.length<e.errors.length?r:e}).errors[0];n[a]={message:u.message,type:u.code}}else n[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 c=n[a].types,f=c&&c[t.code];n[a]=o.appendErrors(a,r,n,s,f?[].concat(f,t.message):t.message)}e.shift()}return n}function c(e,r){for(var n={},t=function(){var t=e[0],s=t.code,a=t.message,u=t.path.join(".");if(!n[u])if("invalid_union"===t.code&&t.errors.length>0){var c=t.errors.reduce(function(e,r){return r.length<e.length?r:e})[0];n[u]={message:c.message,type:c.code}}else n[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 f=n[u].types,l=f&&f[t.code];n[u]=o.appendErrors(u,r,n,s,l?[].concat(l,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"_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"===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(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(){return Promise.resolve(("sync"===n.mode?s.parse:s.parseAsync)(e,t,o)).then(function(e){return u.shouldUseNativeValidation&&r.validateFieldsNatively({},u),{errors:{},values:n.raw?Object.assign({},t):e}})},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,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")}});
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 const unionError = closestUnionError.errors[0];\n\n errors[_path] = {\n message: unionError.message,\n type: unionError.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 const unionError = closestBranch[0];\n\n errors[_path] = {\n message: unionError.message,\n type: unionError.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 const parseFn =\n resolverOptions.mode === 'sync' ? z4.parse : z4.parseAsync;\n const data: any = await parseFn(schema, 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","unionErrors","reduce","closest","current","type","forEach","e","push","types","messages","appendErrors","concat","shift","parseZod4Issues","_loop","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","z4","parse","parseAsync","$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 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,7 +1,6 @@
1
1
  import { renderHook } from '@testing-library/react';
2
2
  import { Resolver, SubmitHandler, useForm } from 'react-hook-form';
3
3
  import { z } from 'zod/v4-mini';
4
- import * as v4Core from 'zod/v4/core';
5
4
  import { zodResolver } from '..';
6
5
  import {
7
6
  fields,
@@ -14,7 +13,7 @@ const shouldUseNativeValidation = false;
14
13
 
15
14
  describe('zodResolver', () => {
16
15
  it('should return values from zodResolver when validation pass & raw=true', async () => {
17
- const parseAsyncSpy = vi.spyOn(v4Core, 'parseAsync');
16
+ const parseAsyncSpy = vi.spyOn(schema, 'parseAsync');
18
17
 
19
18
  const result = await zodResolver(schema, undefined, {
20
19
  raw: true,
@@ -30,8 +29,8 @@ describe('zodResolver', () => {
30
29
  });
31
30
 
32
31
  it('should return parsed values from zodResolver with `mode: sync` when validation pass', async () => {
33
- const parseSpy = vi.spyOn(v4Core, 'parse');
34
- const parseAsyncSpy = vi.spyOn(v4Core, 'parseAsync');
32
+ const parseSpy = vi.spyOn(schema, 'parse');
33
+ const parseAsyncSpy = vi.spyOn(schema, 'parseAsync');
35
34
 
36
35
  const result = await zodResolver(schema, undefined, {
37
36
  mode: 'sync',
@@ -52,8 +51,8 @@ describe('zodResolver', () => {
52
51
  });
53
52
 
54
53
  it('should return a single error from zodResolver with `mode: sync` when validation fails', async () => {
55
- const parseSpy = vi.spyOn(v4Core, 'parse');
56
- const parseAsyncSpy = vi.spyOn(v4Core, 'parseAsync');
54
+ const parseSpy = vi.spyOn(schema, 'parse');
55
+ const parseAsyncSpy = vi.spyOn(schema, 'parseAsync');
57
56
 
58
57
  const result = await zodResolver(schema, undefined, {
59
58
  mode: 'sync',
@@ -1,7 +1,6 @@
1
1
  import { renderHook } from '@testing-library/react';
2
2
  import { Resolver, SubmitHandler, useForm } from 'react-hook-form';
3
3
  import { z } from 'zod/v4';
4
- import * as v4Core from 'zod/v4/core';
5
4
  import { zodResolver } from '..';
6
5
  import { fields, invalidData, schema, validData } from './__fixtures__/data-v4';
7
6
 
@@ -9,7 +8,7 @@ const shouldUseNativeValidation = false;
9
8
 
10
9
  describe('zodResolver', () => {
11
10
  it('should return values from zodResolver when validation pass & raw=true', async () => {
12
- const parseAsyncSpy = vi.spyOn(v4Core, 'parseAsync');
11
+ const parseAsyncSpy = vi.spyOn(schema, 'parseAsync');
13
12
 
14
13
  const result = await zodResolver(schema, undefined, {
15
14
  raw: true,
@@ -23,8 +22,8 @@ describe('zodResolver', () => {
23
22
  });
24
23
 
25
24
  it('should return parsed values from zodResolver with `mode: sync` when validation pass', async () => {
26
- const parseSpy = vi.spyOn(v4Core, 'parse');
27
- const parseAsyncSpy = vi.spyOn(v4Core, 'parseAsync');
25
+ const parseSpy = vi.spyOn(schema, 'parse');
26
+ const parseAsyncSpy = vi.spyOn(schema, 'parseAsync');
28
27
 
29
28
  const result = await zodResolver(schema, undefined, {
30
29
  mode: 'sync',
@@ -46,8 +45,8 @@ describe('zodResolver', () => {
46
45
  });
47
46
 
48
47
  it('should return a single error from zodResolver with `mode: sync` when validation fails', async () => {
49
- const parseSpy = vi.spyOn(v4Core, 'parse');
50
- const parseAsyncSpy = vi.spyOn(v4Core, 'parseAsync');
48
+ const parseSpy = vi.spyOn(schema, 'parse');
49
+ const parseAsyncSpy = vi.spyOn(schema, 'parseAsync');
51
50
 
52
51
  const result = await zodResolver(schema, undefined, {
53
52
  mode: 'sync',
@@ -108,6 +107,107 @@ describe('zodResolver', () => {
108
107
  });
109
108
  });
110
109
 
110
+ it('should not throw when a discriminated union is submitted without its discriminator set', async () => {
111
+ // https://github.com/react-hook-form/resolvers/issues/ (zod4
112
+ // discriminatedUnion with no matching discriminator used to throw
113
+ // "t.errors[0] is undefined" / "Cannot read properties of undefined
114
+ // (reading '0')" instead of reporting a validation error).
115
+ const unionSchema = z.discriminatedUnion('type', [
116
+ z.object({ type: z.literal('foo') }),
117
+ z.object({ type: z.literal('bar') }),
118
+ ]);
119
+
120
+ const result = await zodResolver(unionSchema)(
121
+ {} as unknown as z.input<typeof unionSchema>,
122
+ undefined,
123
+ { fields: {}, shouldUseNativeValidation },
124
+ );
125
+
126
+ expect(result.errors).toMatchObject({
127
+ type: { type: 'invalid_union' },
128
+ });
129
+ });
130
+
131
+ it('should not throw when a discriminated union member is itself a discriminated union whose discriminator is missing', async () => {
132
+ // https://github.com/react-hook-form/resolvers/issues/... (nested
133
+ // discriminatedUnion whose own discriminator is absent used to throw
134
+ // "Cannot read properties of undefined (reading '0')" instead of
135
+ // reporting a validation error).
136
+ const baseNested = {
137
+ type: z.literal('b'),
138
+ name: z.string().nonempty(),
139
+ nested_type: z.enum(['nested_1', 'nested_2']),
140
+ };
141
+
142
+ const nestedUnionSchema = z.object({
143
+ my_array: z.array(
144
+ z.discriminatedUnion('type', [
145
+ z.object({
146
+ type: z.literal('a'),
147
+ name: z.string().nonempty(),
148
+ }),
149
+ z.discriminatedUnion('nested_type', [
150
+ z.object({
151
+ ...baseNested,
152
+ nested_type: z.literal('nested_1'),
153
+ role_other: z.string().nonempty(),
154
+ }),
155
+ z.object({
156
+ ...baseNested,
157
+ nested_type: z.literal('nested_2'),
158
+ }),
159
+ ]),
160
+ ]),
161
+ ),
162
+ });
163
+
164
+ const result = await zodResolver(nestedUnionSchema)(
165
+ // `type: 'b'` matches the second (nested) union, but its own
166
+ // `nested_type` discriminator is missing.
167
+ { my_array: [{ type: 'b' }] } as unknown as z.input<
168
+ typeof nestedUnionSchema
169
+ >,
170
+ undefined,
171
+ { fields: {}, shouldUseNativeValidation },
172
+ );
173
+
174
+ expect(result.errors).toMatchObject({
175
+ my_array: [{ nested_type: { type: 'invalid_union' } }],
176
+ });
177
+ });
178
+
179
+ it("should use the schema's own bound parse/parseAsync method rather than a standalone zod/v4/core import", async () => {
180
+ // Bundlers that can resolve `zod` and `zod/v4/core` to two distinct
181
+ // module instances (e.g. Metro with package-exports resolution enabled)
182
+ // would silently drop any `z.config()`/locale the app configured on its
183
+ // own zod instance if this resolver called a standalone parse function
184
+ // from its own `zod/v4/core` import instead of the schema's own method.
185
+ // Proven here by making the schema's own `parseAsync` throw a distinct
186
+ // error and asserting the resolver actually surfaces it, rather than
187
+ // independently re-validating via some other zod reference.
188
+ const testSchema = z.object({ name: z.string() });
189
+ const customIssue: z.core.$ZodIssue = {
190
+ code: 'custom',
191
+ message: 'error from the schema instance, not a separate zod import',
192
+ path: ['name'],
193
+ input: undefined,
194
+ };
195
+ vi.spyOn(testSchema, 'parseAsync').mockRejectedValueOnce(
196
+ new z.core.$ZodError([customIssue]),
197
+ );
198
+
199
+ const result = await zodResolver(testSchema)({ name: '' }, undefined, {
200
+ fields: {},
201
+ shouldUseNativeValidation,
202
+ });
203
+
204
+ expect(result.errors).toMatchObject({
205
+ name: {
206
+ message: 'error from the schema instance, not a separate zod import',
207
+ },
208
+ });
209
+ });
210
+
111
211
  it('should throw any error unrelated to Zod', async () => {
112
212
  const schemaWithCustomError = schema.refine(() => {
113
213
  throw Error('custom error');
package/zod/src/zod.ts CHANGED
@@ -47,11 +47,14 @@ function parseZod3Issues(
47
47
  (closest, current) =>
48
48
  current.errors.length < closest.errors.length ? current : closest,
49
49
  );
50
+ // Fall back to the union issue's own message/code if the closest
51
+ // member somehow has no issues of its own (shouldn't happen, but
52
+ // avoids ever throwing on an unexpected/malformed union shape).
50
53
  const unionError = closestUnionError.errors[0];
51
54
 
52
55
  errors[_path] = {
53
- message: unionError.message,
54
- type: unionError.code,
56
+ message: unionError?.message ?? message,
57
+ type: unionError?.code ?? code,
55
58
  };
56
59
  } else {
57
60
  errors[_path] = { message, type: code };
@@ -104,11 +107,16 @@ function parseZod4Issues(
104
107
  const closestBranch = error.errors.reduce((closest, branch) =>
105
108
  branch.length < closest.length ? branch : closest,
106
109
  );
110
+ // Fall back to the union issue's own message/code if the closest
111
+ // branch somehow has no issues of its own (shouldn't happen — a
112
+ // 0-issue branch means that branch matched — but this guarantees we
113
+ // never throw on an unexpected/malformed union shape, e.g. a "no
114
+ // matching discriminator" issue nested in a way we haven't seen).
107
115
  const unionError = closestBranch[0];
108
116
 
109
117
  errors[_path] = {
110
- message: unionError.message,
111
- type: unionError.code,
118
+ message: unionError?.message ?? message,
119
+ type: unionError?.code ?? code,
112
120
  };
113
121
  } else {
114
122
  errors[_path] = { message, type: code };
@@ -304,9 +312,27 @@ export function zodResolver<Input extends FieldValues, Context, Output>(
304
312
  if (isZod4Schema(schema)) {
305
313
  return async (values: Input, _, options) => {
306
314
  try {
307
- const parseFn =
308
- resolverOptions.mode === 'sync' ? z4.parse : z4.parseAsync;
309
- const data: any = await parseFn(schema, values, schemaOptions);
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);
310
336
 
311
337
  options.shouldUseNativeValidation &&
312
338
  validateFieldsNatively({}, options);