import type { FieldError, FieldErrors, FieldValues, Resolver, ResolverOptions, ResolverResult, } from "react-hook-form"; import type { ZodType } from "zod/v4"; export function createZodResolver( schema: ZodType, ): Resolver { return ( values: T, _context: unknown, _options?: ResolverOptions, ): ResolverResult => { const result = schema.safeParse(values); if (result.success) { return { values: result.data, errors: {}, }; } const errors: Record< string, FieldError & { params?: Record } > = {}; for (const issue of result.error.issues) { const { path, code, message, ...params } = issue; const key = path.join("."); const suffix = "format" in params ? params.format : "origin" in params ? params.origin : "expected" in params ? params.expected : ""; const newCode = code.replace(/_([a-z])/g, (_, char) => char.toUpperCase()) + (suffix ? `.${suffix}` : ""); const fieldError: FieldError & { params?: Record } = { type: newCode, message: message, ...(Object.keys(params).length ? { params } : {}), }; if (!errors[key]) { errors[key] = fieldError; } } return { values: {} as Record, errors: errors as FieldErrors, }; }; }