@hookform/resolvers 3.6.0 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -46,6 +46,7 @@
46
46
  - [ArkType](#arktype)
47
47
  - [Valibot](#valibot)
48
48
  - [effect-ts](#effect-ts)
49
+ - [VineJS](#vinejs)
49
50
  - [Backers](#backers)
50
51
  - [Sponsors](#sponsors)
51
52
  - [Contributors](#contributors)
@@ -629,40 +630,52 @@ function TestComponent({ onSubmit }: Props) {
629
630
  }
630
631
  ```
631
632
 
632
- ## Backers
633
+ ### [VineJS](https://github.com/vinejs/vine)
633
634
 
634
- Thanks goes to all our backers! [[Become a backer](https://opencollective.com/react-hook-form#backer)].
635
+ VineJS is a form data validation library for Node.js
635
636
 
636
- <a href="https://opencollective.com/react-hook-form#backers">
637
- <img src="https://opencollective.com/react-hook-form/backers.svg?width=950" />
638
- </a>
637
+ [![npm](https://img.shields.io/bundlephobia/minzip/@vinejs/vine?style=for-the-badge)](https://bundlephobia.com/result?p=@vinejs/vine)
639
638
 
640
- ### Sponsors
639
+ ```typescript jsx
640
+ import { useForm } from 'react-hook-form';
641
+ import { vineResolver } from '@hookform/resolvers/vine';
642
+ import vine from '@vinejs/vine';
641
643
 
642
- Thanks go to these kind and lovely sponsors!
644
+ const schema = vine.compile(
645
+ vine.object({
646
+ username: vine.string().minLength(1),
647
+ password: vine.string().minLength(1),
648
+ }),
649
+ );
643
650
 
644
- <a target="_blank" href='https://wantedlyinc.com'>
645
- <img width="94" src="https://images.opencollective.com/wantedly/d94e44e/logo/256.png" />
646
- </a>
647
- <a target="_blank" href='https://toss.im'>
648
- <img width="94" src="https://images.opencollective.com/toss/3ed69b3/logo/256.png" />
649
- </a>
650
- <a target="_blank" href="https://graphcms.com">
651
- <img width="94" src="https://avatars.githubusercontent.com/u/31031438" />
652
- </a>
653
- <a target="_blank" href="https://www.beekai.com/">
654
- <img width="94" src="https://www.beekai.com/marketing/logo/logo.svg" />
655
- </a>
656
- <a target="_blank" href="https://kanamekey.com">
657
- <img width="94" src="https://images.opencollective.com/kaname/d15fd98/logo/256.png" />
658
- </a>
659
- <a target="_blank" href="https://formcarry.com/">
660
- <img width="94" src="https://images.opencollective.com/formcarry/a40a4ea/logo/256.png" />
651
+ const App = () => {
652
+ const { register, handleSubmit } = useForm({
653
+ resolver: vineResolver(schema),
654
+ });
655
+
656
+ return (
657
+ <form onSubmit={handleSubmit((d) => console.log(d))}>
658
+ <input {...register('username')} />
659
+ {errors.username && <span role="alert">{errors.username.message}</span>}
660
+ <input {...register('password')} />
661
+ {errors.password && <span role="alert">{errors.password.message}</span>}
662
+ <button type="submit">submit</button>
663
+ </form>
664
+ );
665
+ };
666
+ ```
667
+
668
+ ## Backers
669
+
670
+ Thanks go to all our backers! [[Become a backer](https://opencollective.com/react-hook-form#backer)].
671
+
672
+ <a href="https://opencollective.com/react-hook-form#backers">
673
+ <img src="https://opencollective.com/react-hook-form/backers.svg?width=950" />
661
674
  </a>
662
675
 
663
676
  ## Contributors
664
677
 
665
- Thanks goes to these wonderful people! [[Become a contributor](CONTRIBUTING.md)].
678
+ Thanks go to these wonderful people! [[Become a contributor](CONTRIBUTING.md)].
666
679
 
667
680
  <a href="https://github.com/react-hook-form/react-hook-form/graphs/contributors">
668
681
  <img src="https://opencollective.com/react-hook-form/contributors.svg?width=950" />
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@hookform/resolvers",
3
3
  "amdName": "hookformResolvers",
4
- "version": "3.6.0",
5
- "description": "React Hook Form validation resolvers: Yup, Joi, Superstruct, Zod, Vest, Class Validator, io-ts, Nope, computed-types, TypeBox, arktype, Typanion and Effect-TS",
4
+ "version": "3.7.0",
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",
8
8
  "umd:main": "dist/resolvers.umd.js",
@@ -105,6 +105,12 @@
105
105
  "import": "./effect-ts/dist/effect-ts.mjs",
106
106
  "require": "./effect-ts/dist/effect-ts.js"
107
107
  },
108
+ "./vine": {
109
+ "types": "./vine/dist/index.d.ts",
110
+ "umd": "./vine/dist/vine.umd.js",
111
+ "import": "./vine/dist/vine.mjs",
112
+ "require": "./vine/dist/vine.js"
113
+ },
108
114
  "./package.json": "./package.json",
109
115
  "./*": "./*"
110
116
  },
@@ -154,7 +160,10 @@
154
160
  "valibot/dist",
155
161
  "effect-ts/package.json",
156
162
  "effect-ts/src",
157
- "effect-ts/dist"
163
+ "effect-ts/dist",
164
+ "vine/package.json",
165
+ "vine/src",
166
+ "vine/dist"
158
167
  ],
159
168
  "publishConfig": {
160
169
  "access": "public"
@@ -178,6 +187,7 @@
178
187
  "build:arktype": "microbundle --cwd arktype --globals @hookform/resolvers=hookformResolvers,react-hook-form=ReactHookForm",
179
188
  "build:valibot": "microbundle --cwd valibot --globals @hookform/resolvers=hookformResolvers,react-hook-form=ReactHookForm",
180
189
  "build:effect-ts": "microbundle --cwd effect-ts --globals @hookform/resolvers=hookformResolvers,react-hook-form=ReactHookForm,@effect/schema=EffectSchema,@effect/schema/AST=EffectSchemaAST,@effect/schema/ArrayFormatter=EffectSchemaArrayFormatter",
190
+ "build:vine": "microbundle --cwd vine --globals @hookform/resolvers=hookformResolvers,react-hook-form=ReactHookForm,@vinejs/vine=vine",
181
191
  "postbuild": "node ./config/node-13-exports.js",
182
192
  "lint": "eslint . --ext .ts,.js --ignore-path .gitignore",
183
193
  "lint:types": "tsc",
@@ -207,7 +217,8 @@
207
217
  "typanion",
208
218
  "ajv",
209
219
  "TypeBox",
210
- "arktype"
220
+ "arktype",
221
+ "vine"
211
222
  ],
212
223
  "repository": {
213
224
  "type": "git",
@@ -230,6 +241,7 @@
230
241
  "@types/react": "^18.2.20",
231
242
  "@typescript-eslint/eslint-plugin": "^6.4.1",
232
243
  "@typescript-eslint/parser": "^6.4.1",
244
+ "@vinejs/vine": "^2.0.0",
233
245
  "@vitejs/plugin-react": "^4.0.4",
234
246
  "ajv": "^8.12.0",
235
247
  "ajv-errors": "^3.0.0",
@@ -262,7 +274,7 @@
262
274
  "superstruct": "^1.0.3",
263
275
  "typanion": "^3.14.0",
264
276
  "typescript": "^5.1.6",
265
- "valibot": "0.31.0-rc.12",
277
+ "valibot": "0.35.0",
266
278
  "vest": "^4.6.11",
267
279
  "vite": "^4.4.9",
268
280
  "vite-tsconfig-paths": "^4.2.0",
@@ -13,6 +13,6 @@
13
13
  "peerDependencies": {
14
14
  "@hookform/resolvers": "^2.0.0",
15
15
  "react-hook-form": "^7.0.0",
16
- "valibot": ">=0.31.0 <1"
16
+ "valibot": ">=0.33.0 <1"
17
17
  }
18
18
  }
@@ -0,0 +1,2 @@
1
+ export * from './vine';
2
+ export * from './types';
@@ -0,0 +1,6 @@
1
+ import { FieldValues, ResolverResult, ResolverOptions } from 'react-hook-form';
2
+ import { VineValidator } from '@vinejs/vine';
3
+ import { ValidationOptions } from '@vinejs/vine/build/src/types';
4
+ export type Resolver = <T extends VineValidator<any, any>>(schema: T, schemaOptions?: ValidationOptions<any>, resolverOptions?: {
5
+ raw?: boolean;
6
+ }) => <TFieldValues extends FieldValues, TContext>(values: TFieldValues, context: TContext | undefined, options: ResolverOptions<TFieldValues>) => Promise<ResolverResult<TFieldValues>>;
@@ -0,0 +1,2 @@
1
+ import type { Resolver } from './types';
2
+ export declare const vineResolver: Resolver;
@@ -0,0 +1,2 @@
1
+ var r=require("react-hook-form"),e=require("@hookform/resolvers"),t=require("@vinejs/vine");function n(r,e){(null==e||e>r.length)&&(e=r.length);for(var t=0,n=new Array(e);t<e;t++)n[t]=r[t];return n}var o=function(e,t){for(var o,a={},i=function(r,e){var t="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(t)return(t=t.call(r)).next.bind(t);if(Array.isArray(r)||(t=function(r,e){if(r){if("string"==typeof r)return n(r,e);var t=Object.prototype.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?n(r,e):void 0}}(r))){t&&(r=t);var o=0;return function(){return o>=r.length?{done:!0}:{done:!1,value:r[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e);!(o=i()).done;){var s=o.value,u=s.rule,l=s.message,c=s.field;if(c in a||(a[c]={message:l,type:u}),t){var v=a[c].types,f=v&&v[u];a[c]=r.appendErrors(c,t,a,u,f?[].concat(f,[l]):l)}}return a};exports.vineResolver=function(r,n,a){return void 0===a&&(a={}),function(i,s,u){try{return Promise.resolve(function(t,o){try{var s=Promise.resolve(r.validate(i,n)).then(function(r){return u.shouldUseNativeValidation&&e.validateFieldsNatively({},u),{errors:{},values:a.raw?i:r}})}catch(r){return o(r)}return s&&s.then?s.then(void 0,o):s}(0,function(r){if(r instanceof t.errors.E_VALIDATION_ERROR)return{values:{},errors:e.toNestErrors(o(r.messages,!u.shouldUseNativeValidation&&"all"===u.criteriaMode),u)};throw r}))}catch(r){return Promise.reject(r)}}};
2
+ //# sourceMappingURL=vine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vine.js","sources":["../src/vine.ts"],"sourcesContent":["import { appendErrors, FieldError, FieldErrors } from 'react-hook-form';\nimport { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { SimpleErrorReporter, errors } from '@vinejs/vine';\nimport type { Resolver } from './types';\n\nconst parseErrorSchema = (\n vineErrors: SimpleErrorReporter['errors'],\n validateAllFieldCriteria: boolean,\n) => {\n const schemaErrors: Record<string, FieldError> = {};\n\n for (const error of vineErrors) {\n const { field, rule, message } = error;\n const path = field;\n\n if (!(path in schemaErrors)) {\n schemaErrors[path] = { message, type: rule };\n }\n\n if (validateAllFieldCriteria) {\n const { types } = schemaErrors[path];\n const messages = types && types[rule];\n\n schemaErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n schemaErrors,\n rule,\n messages ? [...(messages as string[]), message] : message,\n ) as FieldError;\n }\n }\n\n return schemaErrors;\n};\n\nexport const vineResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n try {\n const data = await schema.validate(values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? values : data,\n };\n } catch (error: any) {\n if (error instanceof errors.E_VALIDATION_ERROR) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.messages,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n"],"names":["parseErrorSchema","vineErrors","validateAllFieldCriteria","_step","schemaErrors","_iterator","_createForOfIteratorHelperLoose","done","error","value","rule","message","path","field","type","types","messages","appendErrors","concat","schema","schemaOptions","resolverOptions","values","_","options","Promise","resolve","validate","then","data","shouldUseNativeValidation","validateFieldsNatively","errors","raw","_catch","E_VALIDATION_ERROR","toNestErrors","criteriaMode","e","reject"],"mappings":"sMAKA,IAAMA,EAAmB,SACvBC,EACAC,GAIA,IAFA,IAE8BC,EAFxBC,EAA2C,CAAA,EAEjDC,2qBAAAC,CAAoBL,KAAUE,EAAAE,KAAAE,MAAE,CAArB,IAAAC,EAAKL,EAAAM,MACCC,EAAkBF,EAAlBE,KAAMC,EAAYH,EAAZG,QACfC,EAD2BJ,EAAzBK,MAOR,GAJMD,KAAQR,IACZA,EAAaQ,GAAQ,CAAED,QAAAA,EAASG,KAAMJ,IAGpCR,EAA0B,CAC5B,IAAQa,EAAUX,EAAaQ,GAAvBG,MACFC,EAAWD,GAASA,EAAML,GAEhCN,EAAaQ,GAAQK,EAAYA,aAC/BL,EACAV,EACAE,EACAM,EACAM,EAAQE,GAAAA,OAAQF,EAAqB,CAAEL,IAAWA,EAErD,CACF,CAED,OAAOP,CACT,uBAGE,SAACe,EAAQC,EAAeC,eAAAA,IAAAA,IAAAA,EAAkB,aACnCC,EAAQC,EAAGC,OAAWC,OAAAA,QAAAC,gCACvBD,QAAAC,QACiBP,EAAOQ,SAASL,EAAQF,IAAcQ,cAAnDC,GAIN,OAFAL,EAAQM,2BAA6BC,EAAAA,uBAAuB,CAAA,EAAIP,GAEzD,CACLQ,OAAQ,CAAA,EACRV,OAAQD,EAAgBY,IAAMX,EAASO,EACvC,4DATuBK,CAAA,WAUlB1B,GACP,GAAIA,aAAiBwB,SAAOG,mBAC1B,MAAO,CACLb,OAAQ,GACRU,OAAQI,EAAAA,aACNpC,EACEQ,EAAMQ,UACLQ,EAAQM,2BACkB,QAAzBN,EAAQa,cAEZb,IAKN,MAAMhB,CACP,GACH,CAAC,MAAA8B,GAAA,OAAAb,QAAAc,OAAAD,EAAA,CAAA,CAAA"}
@@ -0,0 +1,2 @@
1
+ import{appendErrors as r}from"react-hook-form";import{validateFieldsNatively as e,toNestErrors as t}from"@hookform/resolvers";import{errors as n}from"@vinejs/vine";function o(r,e){(null==e||e>r.length)&&(e=r.length);for(var t=0,n=new Array(e);t<e;t++)n[t]=r[t];return n}var a=function(e,t){for(var n,a={},i=function(r,e){var t="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(t)return(t=t.call(r)).next.bind(t);if(Array.isArray(r)||(t=function(r,e){if(r){if("string"==typeof r)return o(r,e);var t=Object.prototype.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?o(r,e):void 0}}(r))){t&&(r=t);var n=0;return function(){return n>=r.length?{done:!0}:{done:!1,value:r[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e);!(n=i()).done;){var u=n.value,s=u.rule,l=u.message,c=u.field;if(c in a||(a[c]={message:l,type:s}),t){var f=a[c].types,v=f&&f[s];a[c]=r(c,t,a,s,v?[].concat(v,[l]):l)}}return a},i=function(r,o,i){return void 0===i&&(i={}),function(u,s,l){try{return Promise.resolve(function(t,n){try{var a=Promise.resolve(r.validate(u,o)).then(function(r){return l.shouldUseNativeValidation&&e({},l),{errors:{},values:i.raw?u:r}})}catch(r){return n(r)}return a&&a.then?a.then(void 0,n):a}(0,function(r){if(r instanceof n.E_VALIDATION_ERROR)return{values:{},errors:t(a(r.messages,!l.shouldUseNativeValidation&&"all"===l.criteriaMode),l)};throw r}))}catch(r){return Promise.reject(r)}}};export{i as vineResolver};
2
+ //# sourceMappingURL=vine.module.js.map
@@ -0,0 +1,2 @@
1
+ import{appendErrors as e}from"react-hook-form";import{validateFieldsNatively as o,toNestErrors as r}from"@hookform/resolvers";import{errors as s}from"@vinejs/vine";const t=(o,r)=>{const s={};for(const t of o){const{field:o,rule:a,message:i}=t,n=o;if(n in s||(s[n]={message:i,type:a}),r){const{types:o}=s[n],t=o&&o[a];s[n]=e(n,r,s,a,t?[...t,i]:i)}}return s},a=(e,a,i={})=>async(n,c,l)=>{try{const r=await e.validate(n,a);return l.shouldUseNativeValidation&&o({},l),{errors:{},values:i.raw?n:r}}catch(e){if(e instanceof s.E_VALIDATION_ERROR)return{values:{},errors:r(t(e.messages,!l.shouldUseNativeValidation&&"all"===l.criteriaMode),l)};throw e}};export{a as vineResolver};
2
+ //# sourceMappingURL=vine.modern.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vine.modern.mjs","sources":["../src/vine.ts"],"sourcesContent":["import { appendErrors, FieldError, FieldErrors } from 'react-hook-form';\nimport { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { SimpleErrorReporter, errors } from '@vinejs/vine';\nimport type { Resolver } from './types';\n\nconst parseErrorSchema = (\n vineErrors: SimpleErrorReporter['errors'],\n validateAllFieldCriteria: boolean,\n) => {\n const schemaErrors: Record<string, FieldError> = {};\n\n for (const error of vineErrors) {\n const { field, rule, message } = error;\n const path = field;\n\n if (!(path in schemaErrors)) {\n schemaErrors[path] = { message, type: rule };\n }\n\n if (validateAllFieldCriteria) {\n const { types } = schemaErrors[path];\n const messages = types && types[rule];\n\n schemaErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n schemaErrors,\n rule,\n messages ? [...(messages as string[]), message] : message,\n ) as FieldError;\n }\n }\n\n return schemaErrors;\n};\n\nexport const vineResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n try {\n const data = await schema.validate(values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? values : data,\n };\n } catch (error: any) {\n if (error instanceof errors.E_VALIDATION_ERROR) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.messages,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n"],"names":["parseErrorSchema","vineErrors","validateAllFieldCriteria","schemaErrors","error","field","rule","message","path","type","types","messages","appendErrors","vineResolver","schema","schemaOptions","resolverOptions","async","values","_","options","data","validate","shouldUseNativeValidation","validateFieldsNatively","errors","raw","E_VALIDATION_ERROR","toNestErrors","criteriaMode"],"mappings":"oKAKA,MAAMA,EAAmBA,CACvBC,EACAC,KAEA,MAAMC,EAA2C,CAAA,EAEjD,IAAK,MAAMC,KAASH,EAAY,CAC9B,MAAMI,MAAEA,EAAKC,KAAEA,EAAIC,QAAEA,GAAYH,EAC3BI,EAAOH,EAMb,GAJMG,KAAQL,IACZA,EAAaK,GAAQ,CAAED,UAASE,KAAMH,IAGpCJ,EAA0B,CAC5B,MAAMQ,MAAEA,GAAUP,EAAaK,GACzBG,EAAWD,GAASA,EAAMJ,GAEhCH,EAAaK,GAAQI,EACnBJ,EACAN,EACAC,EACAG,EACAK,EAAW,IAAKA,EAAuBJ,GAAWA,EAErD,CACF,CAED,OAAOJ,GAGIU,EACXA,CAACC,EAAQC,EAAeC,EAAkB,CAAE,IAC5CC,MAAOC,EAAQC,EAAGC,KAChB,IACE,MAAMC,QAAaP,EAAOQ,SAASJ,EAAQH,GAI3C,OAFAK,EAAQG,2BAA6BC,EAAuB,CAAE,EAAEJ,GAEzD,CACLK,OAAQ,CAAiB,EACzBP,OAAQF,EAAgBU,IAAMR,EAASG,EAE1C,CAAC,MAAOjB,GACP,GAAIA,aAAiBqB,EAAOE,mBAC1B,MAAO,CACLT,OAAQ,CAAA,EACRO,OAAQG,EACN5B,EACEI,EAAMO,UACLS,EAAQG,2BACkB,QAAzBH,EAAQS,cAEZT,IAKN,MAAMhB,CACP"}
@@ -0,0 +1,2 @@
1
+ import{appendErrors as r}from"react-hook-form";import{validateFieldsNatively as e,toNestErrors as t}from"@hookform/resolvers";import{errors as n}from"@vinejs/vine";function o(r,e){(null==e||e>r.length)&&(e=r.length);for(var t=0,n=new Array(e);t<e;t++)n[t]=r[t];return n}var a=function(e,t){for(var n,a={},i=function(r,e){var t="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(t)return(t=t.call(r)).next.bind(t);if(Array.isArray(r)||(t=function(r,e){if(r){if("string"==typeof r)return o(r,e);var t=Object.prototype.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?o(r,e):void 0}}(r))){t&&(r=t);var n=0;return function(){return n>=r.length?{done:!0}:{done:!1,value:r[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e);!(n=i()).done;){var u=n.value,s=u.rule,l=u.message,c=u.field;if(c in a||(a[c]={message:l,type:s}),t){var f=a[c].types,v=f&&f[s];a[c]=r(c,t,a,s,v?[].concat(v,[l]):l)}}return a},i=function(r,o,i){return void 0===i&&(i={}),function(u,s,l){try{return Promise.resolve(function(t,n){try{var a=Promise.resolve(r.validate(u,o)).then(function(r){return l.shouldUseNativeValidation&&e({},l),{errors:{},values:i.raw?u:r}})}catch(r){return n(r)}return a&&a.then?a.then(void 0,n):a}(0,function(r){if(r instanceof n.E_VALIDATION_ERROR)return{values:{},errors:t(a(r.messages,!l.shouldUseNativeValidation&&"all"===l.criteriaMode),l)};throw r}))}catch(r){return Promise.reject(r)}}};export{i as vineResolver};
2
+ //# sourceMappingURL=vine.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vine.module.js","sources":["../src/vine.ts"],"sourcesContent":["import { appendErrors, FieldError, FieldErrors } from 'react-hook-form';\nimport { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { SimpleErrorReporter, errors } from '@vinejs/vine';\nimport type { Resolver } from './types';\n\nconst parseErrorSchema = (\n vineErrors: SimpleErrorReporter['errors'],\n validateAllFieldCriteria: boolean,\n) => {\n const schemaErrors: Record<string, FieldError> = {};\n\n for (const error of vineErrors) {\n const { field, rule, message } = error;\n const path = field;\n\n if (!(path in schemaErrors)) {\n schemaErrors[path] = { message, type: rule };\n }\n\n if (validateAllFieldCriteria) {\n const { types } = schemaErrors[path];\n const messages = types && types[rule];\n\n schemaErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n schemaErrors,\n rule,\n messages ? [...(messages as string[]), message] : message,\n ) as FieldError;\n }\n }\n\n return schemaErrors;\n};\n\nexport const vineResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n try {\n const data = await schema.validate(values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? values : data,\n };\n } catch (error: any) {\n if (error instanceof errors.E_VALIDATION_ERROR) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.messages,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n"],"names":["parseErrorSchema","vineErrors","validateAllFieldCriteria","_step","schemaErrors","_iterator","_createForOfIteratorHelperLoose","done","error","value","rule","message","path","field","type","types","messages","appendErrors","concat","vineResolver","schema","schemaOptions","resolverOptions","values","_","options","Promise","resolve","validate","then","data","shouldUseNativeValidation","validateFieldsNatively","errors","raw","_catch","E_VALIDATION_ERROR","toNestErrors","criteriaMode","e","reject"],"mappings":"8QAKA,IAAMA,EAAmB,SACvBC,EACAC,GAIA,IAFA,IAE8BC,EAFxBC,EAA2C,CAAA,EAEjDC,2qBAAAC,CAAoBL,KAAUE,EAAAE,KAAAE,MAAE,CAArB,IAAAC,EAAKL,EAAAM,MACCC,EAAkBF,EAAlBE,KAAMC,EAAYH,EAAZG,QACfC,EAD2BJ,EAAzBK,MAOR,GAJMD,KAAQR,IACZA,EAAaQ,GAAQ,CAAED,QAAAA,EAASG,KAAMJ,IAGpCR,EAA0B,CAC5B,IAAQa,EAAUX,EAAaQ,GAAvBG,MACFC,EAAWD,GAASA,EAAML,GAEhCN,EAAaQ,GAAQK,EACnBL,EACAV,EACAE,EACAM,EACAM,EAAQE,GAAAA,OAAQF,EAAqB,CAAEL,IAAWA,EAErD,CACF,CAED,OAAOP,CACT,EAEae,EACX,SAACC,EAAQC,EAAeC,eAAAA,IAAAA,IAAAA,EAAkB,aACnCC,EAAQC,EAAGC,OAAWC,OAAAA,QAAAC,gCACvBD,QAAAC,QACiBP,EAAOQ,SAASL,EAAQF,IAAcQ,cAAnDC,GAIN,OAFAL,EAAQM,2BAA6BC,EAAuB,CAAA,EAAIP,GAEzD,CACLQ,OAAQ,CAAA,EACRV,OAAQD,EAAgBY,IAAMX,EAASO,EACvC,4DATuBK,CAAA,WAUlB3B,GACP,GAAIA,aAAiByB,EAAOG,mBAC1B,MAAO,CACLb,OAAQ,GACRU,OAAQI,EACNrC,EACEQ,EAAMQ,UACLS,EAAQM,2BACkB,QAAzBN,EAAQa,cAEZb,IAKN,MAAMjB,CACP,GACH,CAAC,MAAA+B,GAAA,OAAAb,QAAAc,OAAAD,EAAA,CAAA,CAAA"}
@@ -0,0 +1,2 @@
1
+ !function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("react-hook-form"),require("@hookform/resolvers"),require("@vinejs/vine")):"function"==typeof define&&define.amd?define(["exports","react-hook-form","@hookform/resolvers","@vinejs/vine"],r):r((e||self).hookformResolversVine={},e.ReactHookForm,e.hookformResolvers,e.vine)}(this,function(e,r,t,o){function n(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,o=new Array(r);t<r;t++)o[t]=e[t];return o}var i=function(e,t){for(var o,i={},a=function(e,r){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=function(e,r){if(e){if("string"==typeof e)return n(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?n(e,r):void 0}}(e))){t&&(e=t);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e);!(o=a()).done;){var s=o.value,l=s.rule,u=s.message,f=s.field;if(f in i||(i[f]={message:u,type:l}),t){var c=i[f].types,v=c&&c[l];i[f]=r.appendErrors(f,t,i,l,v?[].concat(v,[u]):u)}}return i};e.vineResolver=function(e,r,n){return void 0===n&&(n={}),function(a,s,l){try{return Promise.resolve(function(o,i){try{var s=Promise.resolve(e.validate(a,r)).then(function(e){return l.shouldUseNativeValidation&&t.validateFieldsNatively({},l),{errors:{},values:n.raw?a:e}})}catch(e){return i(e)}return s&&s.then?s.then(void 0,i):s}(0,function(e){if(e instanceof o.errors.E_VALIDATION_ERROR)return{values:{},errors:t.toNestErrors(i(e.messages,!l.shouldUseNativeValidation&&"all"===l.criteriaMode),l)};throw e}))}catch(e){return Promise.reject(e)}}}});
2
+ //# sourceMappingURL=vine.umd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vine.umd.js","sources":["../src/vine.ts"],"sourcesContent":["import { appendErrors, FieldError, FieldErrors } from 'react-hook-form';\nimport { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { SimpleErrorReporter, errors } from '@vinejs/vine';\nimport type { Resolver } from './types';\n\nconst parseErrorSchema = (\n vineErrors: SimpleErrorReporter['errors'],\n validateAllFieldCriteria: boolean,\n) => {\n const schemaErrors: Record<string, FieldError> = {};\n\n for (const error of vineErrors) {\n const { field, rule, message } = error;\n const path = field;\n\n if (!(path in schemaErrors)) {\n schemaErrors[path] = { message, type: rule };\n }\n\n if (validateAllFieldCriteria) {\n const { types } = schemaErrors[path];\n const messages = types && types[rule];\n\n schemaErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n schemaErrors,\n rule,\n messages ? [...(messages as string[]), message] : message,\n ) as FieldError;\n }\n }\n\n return schemaErrors;\n};\n\nexport const vineResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n try {\n const data = await schema.validate(values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? values : data,\n };\n } catch (error: any) {\n if (error instanceof errors.E_VALIDATION_ERROR) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.messages,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n"],"names":["parseErrorSchema","vineErrors","validateAllFieldCriteria","_step","schemaErrors","_iterator","_createForOfIteratorHelperLoose","done","error","value","rule","message","path","field","type","types","messages","appendErrors","concat","schema","schemaOptions","resolverOptions","values","_","options","Promise","resolve","validate","then","data","shouldUseNativeValidation","validateFieldsNatively","errors","raw","_catch","E_VALIDATION_ERROR","toNestErrors","criteriaMode","e","reject"],"mappings":"mhBAKA,IAAMA,EAAmB,SACvBC,EACAC,GAIA,IAFA,IAE8BC,EAFxBC,EAA2C,CAAA,EAEjDC,2qBAAAC,CAAoBL,KAAUE,EAAAE,KAAAE,MAAE,CAArB,IAAAC,EAAKL,EAAAM,MACCC,EAAkBF,EAAlBE,KAAMC,EAAYH,EAAZG,QACfC,EAD2BJ,EAAzBK,MAOR,GAJMD,KAAQR,IACZA,EAAaQ,GAAQ,CAAED,QAAAA,EAASG,KAAMJ,IAGpCR,EAA0B,CAC5B,IAAQa,EAAUX,EAAaQ,GAAvBG,MACFC,EAAWD,GAASA,EAAML,GAEhCN,EAAaQ,GAAQK,EAAYA,aAC/BL,EACAV,EACAE,EACAM,EACAM,EAAQE,GAAAA,OAAQF,EAAqB,CAAEL,IAAWA,EAErD,CACF,CAED,OAAOP,CACT,iBAGE,SAACe,EAAQC,EAAeC,eAAAA,IAAAA,IAAAA,EAAkB,aACnCC,EAAQC,EAAGC,OAAWC,OAAAA,QAAAC,gCACvBD,QAAAC,QACiBP,EAAOQ,SAASL,EAAQF,IAAcQ,cAAnDC,GAIN,OAFAL,EAAQM,2BAA6BC,EAAAA,uBAAuB,CAAA,EAAIP,GAEzD,CACLQ,OAAQ,CAAA,EACRV,OAAQD,EAAgBY,IAAMX,EAASO,EACvC,4DATuBK,CAAA,WAUlB1B,GACP,GAAIA,aAAiBwB,SAAOG,mBAC1B,MAAO,CACLb,OAAQ,GACRU,OAAQI,EAAAA,aACNpC,EACEQ,EAAMQ,UACLQ,EAAQM,2BACkB,QAAzBN,EAAQa,cAEZb,IAKN,MAAMhB,CACP,GACH,CAAC,MAAA8B,GAAA,OAAAb,QAAAc,OAAAD,EAAA,CAAA,CAAA"}
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "@hookform/resolvers/vine",
3
+ "amdName": "hookformResolversVine",
4
+ "version": "1.0.0",
5
+ "private": true,
6
+ "description": "React Hook Form validation resolver: vine",
7
+ "main": "dist/vine.js",
8
+ "module": "dist/vine.module.js",
9
+ "umd:main": "dist/vine.umd.js",
10
+ "source": "src/index.ts",
11
+ "types": "dist/index.d.ts",
12
+ "license": "MIT",
13
+ "peerDependencies": {
14
+ "react-hook-form": "^7.0.0",
15
+ "@hookform/resolvers": "^2.0.0",
16
+ "@vinejs/vine": "^2.0.0"
17
+ }
18
+ }
@@ -0,0 +1,81 @@
1
+ import React from 'react';
2
+ import { useForm } from 'react-hook-form';
3
+ import { render, screen } from '@testing-library/react';
4
+ import user from '@testing-library/user-event';
5
+ import { vineResolver } from '..';
6
+ import vine from '@vinejs/vine';
7
+ import { Infer } from '@vinejs/vine/build/src/types';
8
+
9
+ const schema = vine.compile(
10
+ vine.object({
11
+ username: vine.string().minLength(1),
12
+ password: vine.string().minLength(1),
13
+ }),
14
+ );
15
+
16
+ type FormData = Infer<typeof schema> & { unusedProperty: string };
17
+
18
+ interface Props {
19
+ onSubmit: (data: FormData) => void;
20
+ }
21
+
22
+ function TestComponent({ onSubmit }: Props) {
23
+ const { register, handleSubmit } = useForm<FormData>({
24
+ resolver: vineResolver(schema),
25
+ shouldUseNativeValidation: true,
26
+ });
27
+
28
+ return (
29
+ <form onSubmit={handleSubmit(onSubmit)}>
30
+ <input {...register('username')} placeholder="username" />
31
+
32
+ <input {...register('password')} placeholder="password" />
33
+
34
+ <button type="submit">submit</button>
35
+ </form>
36
+ );
37
+ }
38
+
39
+ test("form's native validation with Zod", async () => {
40
+ const handleSubmit = vi.fn();
41
+ render(<TestComponent onSubmit={handleSubmit} />);
42
+
43
+ // username
44
+ let usernameField = screen.getByPlaceholderText(
45
+ /username/i,
46
+ ) as HTMLInputElement;
47
+ expect(usernameField.validity.valid).toBe(true);
48
+ expect(usernameField.validationMessage).toBe('');
49
+
50
+ // password
51
+ let passwordField = screen.getByPlaceholderText(
52
+ /password/i,
53
+ ) as HTMLInputElement;
54
+ expect(passwordField.validity.valid).toBe(true);
55
+ expect(passwordField.validationMessage).toBe('');
56
+
57
+ await user.click(screen.getByText(/submit/i));
58
+
59
+ // username
60
+ usernameField = screen.getByPlaceholderText(/username/i) as HTMLInputElement;
61
+ expect(usernameField.validity.valid).toBe(false);
62
+ expect(usernameField.validationMessage).toBe('The username field must have at least 1 characters');
63
+
64
+ // password
65
+ passwordField = screen.getByPlaceholderText(/password/i) as HTMLInputElement;
66
+ expect(passwordField.validity.valid).toBe(false);
67
+ expect(passwordField.validationMessage).toBe('The password field must have at least 1 characters');
68
+
69
+ await user.type(screen.getByPlaceholderText(/username/i), 'joe');
70
+ await user.type(screen.getByPlaceholderText(/password/i), 'password');
71
+
72
+ // username
73
+ usernameField = screen.getByPlaceholderText(/username/i) as HTMLInputElement;
74
+ expect(usernameField.validity.valid).toBe(true);
75
+ expect(usernameField.validationMessage).toBe('');
76
+
77
+ // password
78
+ passwordField = screen.getByPlaceholderText(/password/i) as HTMLInputElement;
79
+ expect(passwordField.validity.valid).toBe(true);
80
+ expect(passwordField.validationMessage).toBe('');
81
+ });
@@ -0,0 +1,55 @@
1
+ import React from 'react';
2
+ import { render, screen } from '@testing-library/react';
3
+ import user from '@testing-library/user-event';
4
+ import { useForm } from 'react-hook-form';
5
+ import { vineResolver } from '..';
6
+ import vine from '@vinejs/vine';
7
+ import { Infer } from '@vinejs/vine/build/src/types';
8
+
9
+ const schema = vine.compile(
10
+ vine.object({
11
+ username: vine.string().minLength(1),
12
+ password: vine.string().minLength(1),
13
+ }),
14
+ );
15
+
16
+ type FormData = Infer<typeof schema> & { unusedProperty: string };
17
+
18
+ interface Props {
19
+ onSubmit: (data: FormData) => void;
20
+ }
21
+
22
+ function TestComponent({ onSubmit }: Props) {
23
+ const {
24
+ register,
25
+ handleSubmit,
26
+ formState: { errors },
27
+ } = useForm<FormData>({
28
+ resolver: vineResolver(schema), // Useful to check TypeScript regressions
29
+ });
30
+
31
+ return (
32
+ <form onSubmit={handleSubmit(onSubmit)}>
33
+ <input {...register('username')} />
34
+ {errors.username && <span role="alert">{errors.username.message}</span>}
35
+
36
+ <input {...register('password')} />
37
+ {errors.password && <span role="alert">{errors.password.message}</span>}
38
+
39
+ <button type="submit">submit</button>
40
+ </form>
41
+ );
42
+ }
43
+
44
+ test("form's validation with Vine and TypeScript's integration", async () => {
45
+ const handleSubmit = vi.fn();
46
+ render(<TestComponent onSubmit={handleSubmit} />);
47
+
48
+ expect(screen.queryAllByRole('alert')).toHaveLength(0);
49
+
50
+ await user.click(screen.getByText(/submit/i));
51
+
52
+ expect(screen.getByText(/The username field must have at least 1 characters/i)).toBeInTheDocument();
53
+ expect(screen.getByText(/The password field must have at least 1 characters/i)).toBeInTheDocument();
54
+ expect(handleSubmit).not.toHaveBeenCalled();
55
+ });
@@ -0,0 +1,74 @@
1
+ import { Field, InternalFieldName } from 'react-hook-form';
2
+ import vine from '@vinejs/vine';
3
+ import { Infer } from '@vinejs/vine/build/src/types';
4
+
5
+ export const schema = vine.compile(
6
+ vine.object({
7
+ username: vine.string().regex(/^\w+$/).minLength(3).maxLength(30),
8
+ password: vine
9
+ .string()
10
+ .regex(new RegExp('.*[A-Z].*'))
11
+ .regex(new RegExp('.*[a-z].*'))
12
+ .regex(new RegExp('.*\\d.*'))
13
+ .regex(new RegExp('.*[`~<>?,./!@#$%^&*()\\-_+="\'|{}\\[\\];:\\\\].*'))
14
+ .minLength(8)
15
+ .confirmed({ confirmationField: 'repeatPassword' }),
16
+ repeatPassword: vine.string().sameAs('password'),
17
+ accessToken: vine.unionOfTypes([vine.string(), vine.number()]),
18
+ birthYear: vine.number().min(1900).max(2013),
19
+ email: vine.string().email().optional(),
20
+ tags: vine.array(vine.string()),
21
+ enabled: vine.boolean(),
22
+ like: vine.array(
23
+ vine.object({
24
+ id: vine.number(),
25
+ name: vine.string().fixedLength(4),
26
+ }),
27
+ ),
28
+ dateStr: vine.string().transform((value: string) => new Date(value).toISOString()),
29
+ }),
30
+ );
31
+
32
+ export const validData: Infer<typeof schema> = {
33
+ username: 'Doe',
34
+ password: 'Password123_',
35
+ repeatPassword: 'Password123_',
36
+ birthYear: 2000,
37
+ email: 'john@doe.com',
38
+ tags: ['tag1', 'tag2'],
39
+ enabled: true,
40
+ accessToken: 'accessToken',
41
+ like: [
42
+ {
43
+ id: 1,
44
+ name: 'name',
45
+ },
46
+ ],
47
+ dateStr: '2020-01-01T00:00:00.000Z',
48
+ };
49
+
50
+ export const invalidData = {
51
+ password: '___',
52
+ email: '',
53
+ birthYear: 'birthYear',
54
+ like: [{ id: 'z' }],
55
+ };
56
+
57
+ export const fields: Record<InternalFieldName, Field['_f']> = {
58
+ username: {
59
+ ref: { name: 'username' },
60
+ name: 'username',
61
+ },
62
+ password: {
63
+ ref: { name: 'password' },
64
+ name: 'password',
65
+ },
66
+ email: {
67
+ ref: { name: 'email' },
68
+ name: 'email',
69
+ },
70
+ birthday: {
71
+ ref: { name: 'birthday' },
72
+ name: 'birthday',
73
+ },
74
+ };
@@ -0,0 +1,180 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`vineResolver > should return a single error from vineResolver when validation fails 1`] = `
4
+ {
5
+ "errors": {
6
+ "accessToken": {
7
+ "message": "Invalid value provided for accessToken field",
8
+ "ref": undefined,
9
+ "type": "unionOfTypes",
10
+ },
11
+ "birthYear": {
12
+ "message": "The birthYear field must be a number",
13
+ "ref": undefined,
14
+ "type": "number",
15
+ },
16
+ "dateStr": {
17
+ "message": "The dateStr field must be defined",
18
+ "ref": undefined,
19
+ "type": "required",
20
+ },
21
+ "email": {
22
+ "message": "The email field must be a valid email address",
23
+ "ref": {
24
+ "name": "email",
25
+ },
26
+ "type": "email",
27
+ },
28
+ "enabled": {
29
+ "message": "The enabled field must be defined",
30
+ "ref": undefined,
31
+ "type": "required",
32
+ },
33
+ "like": [
34
+ {
35
+ "id": {
36
+ "message": "The id field must be a number",
37
+ "ref": undefined,
38
+ "type": "number",
39
+ },
40
+ "name": {
41
+ "message": "The name field must be defined",
42
+ "ref": undefined,
43
+ "type": "required",
44
+ },
45
+ },
46
+ ],
47
+ "password": {
48
+ "message": "The password field format is invalid",
49
+ "ref": {
50
+ "name": "password",
51
+ },
52
+ "type": "regex",
53
+ },
54
+ "repeatPassword": {
55
+ "message": "The repeatPassword field must be defined",
56
+ "ref": undefined,
57
+ "type": "required",
58
+ },
59
+ "tags": {
60
+ "message": "The tags field must be defined",
61
+ "ref": undefined,
62
+ "type": "required",
63
+ },
64
+ "username": {
65
+ "message": "The username field must be defined",
66
+ "ref": {
67
+ "name": "username",
68
+ },
69
+ "type": "required",
70
+ },
71
+ },
72
+ "values": {},
73
+ }
74
+ `;
75
+
76
+ exports[`vineResolver > should return all the errors from vineResolver when validation fails with \`validateAllFieldCriteria\` set to true 1`] = `
77
+ {
78
+ "errors": {
79
+ "accessToken": {
80
+ "message": "Invalid value provided for accessToken field",
81
+ "ref": undefined,
82
+ "type": "unionOfTypes",
83
+ "types": {
84
+ "unionOfTypes": "Invalid value provided for accessToken field",
85
+ },
86
+ },
87
+ "birthYear": {
88
+ "message": "The birthYear field must be a number",
89
+ "ref": undefined,
90
+ "type": "number",
91
+ "types": {
92
+ "number": "The birthYear field must be a number",
93
+ },
94
+ },
95
+ "dateStr": {
96
+ "message": "The dateStr field must be defined",
97
+ "ref": undefined,
98
+ "type": "required",
99
+ "types": {
100
+ "required": "The dateStr field must be defined",
101
+ },
102
+ },
103
+ "email": {
104
+ "message": "The email field must be a valid email address",
105
+ "ref": {
106
+ "name": "email",
107
+ },
108
+ "type": "email",
109
+ "types": {
110
+ "email": "The email field must be a valid email address",
111
+ },
112
+ },
113
+ "enabled": {
114
+ "message": "The enabled field must be defined",
115
+ "ref": undefined,
116
+ "type": "required",
117
+ "types": {
118
+ "required": "The enabled field must be defined",
119
+ },
120
+ },
121
+ "like": [
122
+ {
123
+ "id": {
124
+ "message": "The id field must be a number",
125
+ "ref": undefined,
126
+ "type": "number",
127
+ "types": {
128
+ "number": "The id field must be a number",
129
+ },
130
+ },
131
+ "name": {
132
+ "message": "The name field must be defined",
133
+ "ref": undefined,
134
+ "type": "required",
135
+ "types": {
136
+ "required": "The name field must be defined",
137
+ },
138
+ },
139
+ },
140
+ ],
141
+ "password": {
142
+ "message": "The password field format is invalid",
143
+ "ref": {
144
+ "name": "password",
145
+ },
146
+ "type": "regex",
147
+ "types": {
148
+ "regex": "The password field format is invalid",
149
+ },
150
+ },
151
+ "repeatPassword": {
152
+ "message": "The repeatPassword field must be defined",
153
+ "ref": undefined,
154
+ "type": "required",
155
+ "types": {
156
+ "required": "The repeatPassword field must be defined",
157
+ },
158
+ },
159
+ "tags": {
160
+ "message": "The tags field must be defined",
161
+ "ref": undefined,
162
+ "type": "required",
163
+ "types": {
164
+ "required": "The tags field must be defined",
165
+ },
166
+ },
167
+ "username": {
168
+ "message": "The username field must be defined",
169
+ "ref": {
170
+ "name": "username",
171
+ },
172
+ "type": "required",
173
+ "types": {
174
+ "required": "The username field must be defined",
175
+ },
176
+ },
177
+ },
178
+ "values": {},
179
+ }
180
+ `;
@@ -0,0 +1,53 @@
1
+ import { vineResolver } from '..';
2
+ import { schema, validData, fields, invalidData } from './__fixtures__/data';
3
+
4
+ const shouldUseNativeValidation = false;
5
+
6
+ describe('vineResolver', () => {
7
+ it('should return values from vineResolver when validation pass', async () => {
8
+ const schemaSpy = vi.spyOn(schema, 'validate');
9
+
10
+ const result = await vineResolver(schema)(validData, undefined, {
11
+ fields,
12
+ shouldUseNativeValidation,
13
+ });
14
+
15
+ expect(schemaSpy).toHaveBeenCalledTimes(1);
16
+ expect(result).toEqual({ errors: {}, values: validData });
17
+ });
18
+
19
+ it('should return a single error from vineResolver when validation fails', async () => {
20
+ const result = await vineResolver(schema)(invalidData, undefined, {
21
+ fields,
22
+ shouldUseNativeValidation,
23
+ });
24
+
25
+ expect(result).toMatchSnapshot();
26
+ });
27
+
28
+ it('should return all the errors from vineResolver when validation fails with `validateAllFieldCriteria` set to true', async () => {
29
+ const result = await vineResolver(schema)(invalidData, undefined, {
30
+ fields,
31
+ criteriaMode: 'all',
32
+ shouldUseNativeValidation,
33
+ });
34
+
35
+ expect(result).toMatchSnapshot();
36
+ });
37
+
38
+ it('should return values from vineResolver when validation pass & raw=true', async () => {
39
+ const schemaSpy = vi.spyOn(schema, 'validate');
40
+
41
+ const result = await vineResolver(schema, undefined, { raw: true })(
42
+ validData,
43
+ undefined,
44
+ {
45
+ fields,
46
+ shouldUseNativeValidation,
47
+ },
48
+ );
49
+
50
+ expect(schemaSpy).toHaveBeenCalledTimes(1);
51
+ expect(result).toEqual({ errors: {}, values: validData });
52
+ });
53
+ });
@@ -0,0 +1,2 @@
1
+ export * from './vine';
2
+ export * from './types';
@@ -0,0 +1,13 @@
1
+ import { FieldValues, ResolverResult, ResolverOptions } from 'react-hook-form';
2
+ import { VineValidator } from '@vinejs/vine';
3
+ import { ValidationOptions } from '@vinejs/vine/build/src/types';
4
+
5
+ export type Resolver = <T extends VineValidator<any, any>>(
6
+ schema: T,
7
+ schemaOptions?: ValidationOptions<any>,
8
+ resolverOptions?: { raw?: boolean },
9
+ ) => <TFieldValues extends FieldValues, TContext>(
10
+ values: TFieldValues,
11
+ context: TContext | undefined,
12
+ options: ResolverOptions<TFieldValues>,
13
+ ) => Promise<ResolverResult<TFieldValues>>;
@@ -0,0 +1,66 @@
1
+ import { appendErrors, FieldError, FieldErrors } from 'react-hook-form';
2
+ import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';
3
+ import { SimpleErrorReporter, errors } from '@vinejs/vine';
4
+ import type { Resolver } from './types';
5
+
6
+ const parseErrorSchema = (
7
+ vineErrors: SimpleErrorReporter['errors'],
8
+ validateAllFieldCriteria: boolean,
9
+ ) => {
10
+ const schemaErrors: Record<string, FieldError> = {};
11
+
12
+ for (const error of vineErrors) {
13
+ const { field, rule, message } = error;
14
+ const path = field;
15
+
16
+ if (!(path in schemaErrors)) {
17
+ schemaErrors[path] = { message, type: rule };
18
+ }
19
+
20
+ if (validateAllFieldCriteria) {
21
+ const { types } = schemaErrors[path];
22
+ const messages = types && types[rule];
23
+
24
+ schemaErrors[path] = appendErrors(
25
+ path,
26
+ validateAllFieldCriteria,
27
+ schemaErrors,
28
+ rule,
29
+ messages ? [...(messages as string[]), message] : message,
30
+ ) as FieldError;
31
+ }
32
+ }
33
+
34
+ return schemaErrors;
35
+ };
36
+
37
+ export const vineResolver: Resolver =
38
+ (schema, schemaOptions, resolverOptions = {}) =>
39
+ async (values, _, options) => {
40
+ try {
41
+ const data = await schema.validate(values, schemaOptions);
42
+
43
+ options.shouldUseNativeValidation && validateFieldsNatively({}, options);
44
+
45
+ return {
46
+ errors: {} as FieldErrors,
47
+ values: resolverOptions.raw ? values : data,
48
+ };
49
+ } catch (error: any) {
50
+ if (error instanceof errors.E_VALIDATION_ERROR) {
51
+ return {
52
+ values: {},
53
+ errors: toNestErrors(
54
+ parseErrorSchema(
55
+ error.messages,
56
+ !options.shouldUseNativeValidation &&
57
+ options.criteriaMode === 'all',
58
+ ),
59
+ options,
60
+ ),
61
+ };
62
+ }
63
+
64
+ throw error;
65
+ }
66
+ };
package/zod/dist/zod.js CHANGED
@@ -1,2 +1,2 @@
1
- var r=require("react-hook-form"),e=require("@hookform/resolvers"),o=function(e,o){for(var n={};e.length;){var s=e[0],t=s.code,i=s.message,a=s.path.join(".");if(!n[a])if("unionErrors"in s){var u=s.unionErrors[0].errors[0];n[a]={message:u.message,type:u.code}}else n[a]={message:i,type:t};if("unionErrors"in s&&s.unionErrors.forEach(function(r){return r.errors.forEach(function(r){return e.push(r)})}),o){var c=n[a].types,f=c&&c[s.code];n[a]=r.appendErrors(a,o,n,t,f?[].concat(f,s.message):s.message)}e.shift()}return n};exports.zodResolver=function(r,n,s){return void 0===s&&(s={}),function(t,i,a){try{return Promise.resolve(function(o,i){try{var u=Promise.resolve(r["sync"===s.mode?"parse":"parseAsync"](t,n)).then(function(r){return a.shouldUseNativeValidation&&e.validateFieldsNatively({},a),{errors:{},values:s.raw?t:r}})}catch(r){return i(r)}return u&&u.then?u.then(void 0,i):u}(0,function(r){if(function(r){return null!=r.errors}(r))return{values:{},errors:e.toNestErrors(o(r.errors,!a.shouldUseNativeValidation&&"all"===a.criteriaMode),a)};throw r}))}catch(r){return Promise.reject(r)}}};
1
+ var r=require("react-hook-form"),e=require("@hookform/resolvers"),o=function(e,o){for(var n={};e.length;){var s=e[0],t=s.code,i=s.message,a=s.path.join(".");if(!n[a])if("unionErrors"in s){var u=s.unionErrors[0].errors[0];n[a]={message:u.message,type:u.code}}else n[a]={message:i,type:t};if("unionErrors"in s&&s.unionErrors.forEach(function(r){return r.errors.forEach(function(r){return e.push(r)})}),o){var c=n[a].types,f=c&&c[s.code];n[a]=r.appendErrors(a,o,n,t,f?[].concat(f,s.message):s.message)}e.shift()}return n};exports.zodResolver=function(r,n,s){return void 0===s&&(s={}),function(t,i,a){try{return Promise.resolve(function(o,i){try{var u=Promise.resolve(r["sync"===s.mode?"parse":"parseAsync"](t,n)).then(function(r){return a.shouldUseNativeValidation&&e.validateFieldsNatively({},a),{errors:{},values:s.raw?t:r}})}catch(r){return i(r)}return u&&u.then?u.then(void 0,i):u}(0,function(r){if(function(r){return Array.isArray(null==r?void 0:r.errors)}(r))return{values:{},errors:e.toNestErrors(o(r.errors,!a.shouldUseNativeValidation&&"all"===a.criteriaMode),a)};throw r}))}catch(r){return Promise.reject(r)}}};
2
2
  //# sourceMappingURL=zod.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zod.js","sources":["../src/zod.ts"],"sourcesContent":["import { appendErrors, FieldError, FieldErrors } from 'react-hook-form';\nimport { z, ZodError } from 'zod';\nimport { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type { Resolver } from './types';\n\nconst isZodError = (error: any): error is ZodError => error.errors != null;\n\nconst parseErrorSchema = (\n zodErrors: z.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 const unionError = error.unionErrors[0].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\nexport const zodResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n try {\n const data = await schema[\n resolverOptions.mode === 'sync' ? 'parse' : 'parseAsync'\n ](values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? values : data,\n };\n } catch (error: any) {\n if (isZodError(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.errors,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n"],"names":["parseErrorSchema","zodErrors","validateAllFieldCriteria","errors","length","error","code","message","_path","path","join","unionError","unionErrors","type","forEach","e","push","types","messages","appendErrors","concat","shift","schema","schemaOptions","resolverOptions","values","_","options","Promise","resolve","mode","then","data","shouldUseNativeValidation","validateFieldsNatively","raw","_catch","isZodError","toNestErrors","criteriaMode","reject"],"mappings":"kEAOMA,EAAmB,SACvBC,EACAC,GAGA,IADA,IAAMC,EAAqC,CAAA,EACpCF,EAAUG,QAAU,CACzB,IAAMC,EAAQJ,EAAU,GAChBK,EAAwBD,EAAxBC,KAAMC,EAAkBF,EAAlBE,QACRC,EAD0BH,EAATI,KACJC,KAAK,KAExB,IAAKP,EAAOK,GACV,GAAI,gBAAiBH,EAAO,CAC1B,IAAMM,EAAaN,EAAMO,YAAY,GAAGT,OAAO,GAE/CA,EAAOK,GAAS,CACdD,QAASI,EAAWJ,QACpBM,KAAMF,EAAWL,KAEpB,MACCH,EAAOK,GAAS,CAAED,QAAAA,EAASM,KAAMP,GAUrC,GANI,gBAAiBD,GACnBA,EAAMO,YAAYE,QAAQ,SAACH,GACzB,OAAAA,EAAWR,OAAOW,QAAQ,SAACC,GAAC,OAAKd,EAAUe,KAAKD,EAAE,EAAC,GAInDb,EAA0B,CAC5B,IAAMe,EAAQd,EAAOK,GAAOS,MACtBC,EAAWD,GAASA,EAAMZ,EAAMC,MAEtCH,EAAOK,GAASW,EAAAA,aACdX,EACAN,EACAC,EACAG,EACAY,EACK,GAAgBE,OAAOF,EAAsBb,EAAME,SACpDF,EAAME,QAEb,CAEDN,EAAUoB,OACX,CAED,OAAOlB,CACT,sBAGE,SAACmB,EAAQC,EAAeC,GAAoB,YAAL,IAAfA,IAAAA,EAAkB,IAAE,SACrCC,EAAQC,EAAGC,GAAO,IAAIC,OAAAA,QAAAC,gCACvBD,QAAAC,QACiBP,EACQ,SAAzBE,EAAgBM,KAAkB,QAAU,cAC5CL,EAAQF,IAAcQ,KAAA,SAFlBC,GAMN,OAFAL,EAAQM,2BAA6BC,EAAsBA,uBAAC,GAAIP,GAEzD,CACLxB,OAAQ,CAAA,EACRsB,OAAQD,EAAgBW,IAAMV,EAASO,EACvC,4DAXuBI,CAAA,EAYlB/B,SAAAA,GACP,GAnEa,SAACA,GAAU,OAAwC,MAAhBA,EAAMF,MAAc,CAmEhEkC,CAAWhC,GACb,MAAO,CACLoB,OAAQ,CAAA,EACRtB,OAAQmC,EAAYA,aAClBtC,EACEK,EAAMF,QACLwB,EAAQM,2BACkB,QAAzBN,EAAQY,cAEZZ,IAKN,MAAMtB,CACP,GACH,CAAC,MAAAU,GAAA,OAAAa,QAAAY,OAAAzB,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"zod.js","sources":["../src/zod.ts"],"sourcesContent":["import { appendErrors, FieldError, FieldErrors } from 'react-hook-form';\nimport { z, ZodError } from 'zod';\nimport { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type { Resolver } from './types';\n\nconst isZodError = (error: any): error is ZodError => Array.isArray(error?.errors);\n\nconst parseErrorSchema = (\n zodErrors: z.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 const unionError = error.unionErrors[0].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\nexport const zodResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n try {\n const data = await schema[\n resolverOptions.mode === 'sync' ? 'parse' : 'parseAsync'\n ](values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? values : data,\n };\n } catch (error: any) {\n if (isZodError(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.errors,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n"],"names":["parseErrorSchema","zodErrors","validateAllFieldCriteria","errors","length","error","code","message","_path","path","join","unionError","unionErrors","type","forEach","e","push","types","messages","appendErrors","concat","shift","schema","schemaOptions","resolverOptions","values","_","options","Promise","resolve","mode","then","data","shouldUseNativeValidation","validateFieldsNatively","raw","_catch","Array","isArray","isZodError","toNestErrors","criteriaMode","reject"],"mappings":"kEAOMA,EAAmB,SACvBC,EACAC,GAGA,IADA,IAAMC,EAAqC,CAAE,EACtCF,EAAUG,QAAU,CACzB,IAAMC,EAAQJ,EAAU,GAChBK,EAAwBD,EAAxBC,KAAMC,EAAkBF,EAAlBE,QACRC,EAD0BH,EAATI,KACJC,KAAK,KAExB,IAAKP,EAAOK,GACV,GAAI,gBAAiBH,EAAO,CAC1B,IAAMM,EAAaN,EAAMO,YAAY,GAAGT,OAAO,GAE/CA,EAAOK,GAAS,CACdD,QAASI,EAAWJ,QACpBM,KAAMF,EAAWL,KAEpB,MACCH,EAAOK,GAAS,CAAED,QAAAA,EAASM,KAAMP,GAUrC,GANI,gBAAiBD,GACnBA,EAAMO,YAAYE,QAAQ,SAACH,GAAU,OACnCA,EAAWR,OAAOW,QAAQ,SAACC,GAAM,OAAAd,EAAUe,KAAKD,EAAE,EAAC,GAInDb,EAA0B,CAC5B,IAAMe,EAAQd,EAAOK,GAAOS,MACtBC,EAAWD,GAASA,EAAMZ,EAAMC,MAEtCH,EAAOK,GAASW,EAAAA,aACdX,EACAN,EACAC,EACAG,EACAY,EACK,GAAgBE,OAAOF,EAAsBb,EAAME,SACpDF,EAAME,QAEb,CAEDN,EAAUoB,OACX,CAED,OAAOlB,CACT,sBAGE,SAACmB,EAAQC,EAAeC,GACjBC,YADgC,IAAfD,IAAAA,EAAkB,CAAE,GACrCC,SAAAA,EAAQC,EAAGC,GAAW,IAAA,OAAAC,QAAAC,gCACvBD,QAAAC,QACiBP,EACQ,SAAzBE,EAAgBM,KAAkB,QAAU,cAC5CL,EAAQF,IAAcQ,KAFlBC,SAAAA,GAMN,OAFAL,EAAQM,2BAA6BC,yBAAuB,CAAA,EAAIP,GAEzD,CACLxB,OAAQ,CAAiB,EACzBsB,OAAQD,EAAgBW,IAAMV,EAASO,EACvC,4DAXuBI,CACvB,EAWH,SAAQ/B,GACP,GAnEa,SAACA,GAAkC,OAAAgC,MAAMC,QAAa,MAALjC,OAAK,EAALA,EAAOF,OAAO,CAmExEoC,CAAWlC,GACb,MAAO,CACLoB,OAAQ,CAAA,EACRtB,OAAQqC,EAAYA,aAClBxC,EACEK,EAAMF,QACLwB,EAAQM,2BACkB,QAAzBN,EAAQc,cAEZd,IAKN,MAAMtB,CACP,GACH,CAAC,MAAAU,GAAA,OAAAa,QAAAc,OAAA3B,EAAA,CAAA,CAAA"}
package/zod/dist/zod.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{appendErrors as r}from"react-hook-form";import{validateFieldsNatively as e,toNestErrors as o}from"@hookform/resolvers";var n=function(e,o){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[0].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)})}),o){var c=n[a].types,f=c&&c[t.code];n[a]=r(a,o,n,s,f?[].concat(f,t.message):t.message)}e.shift()}return n},t=function(r,t,s){return void 0===s&&(s={}),function(i,a,u){try{return Promise.resolve(function(o,n){try{var a=Promise.resolve(r["sync"===s.mode?"parse":"parseAsync"](i,t)).then(function(r){return u.shouldUseNativeValidation&&e({},u),{errors:{},values:s.raw?i:r}})}catch(r){return n(r)}return a&&a.then?a.then(void 0,n):a}(0,function(r){if(function(r){return null!=r.errors}(r))return{values:{},errors:o(n(r.errors,!u.shouldUseNativeValidation&&"all"===u.criteriaMode),u)};throw r}))}catch(r){return Promise.reject(r)}}};export{t as zodResolver};
1
+ import{appendErrors as r}from"react-hook-form";import{validateFieldsNatively as e,toNestErrors as o}from"@hookform/resolvers";var n=function(e,o){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[0].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)})}),o){var c=n[a].types,f=c&&c[t.code];n[a]=r(a,o,n,s,f?[].concat(f,t.message):t.message)}e.shift()}return n},t=function(r,t,s){return void 0===s&&(s={}),function(i,a,u){try{return Promise.resolve(function(o,n){try{var a=Promise.resolve(r["sync"===s.mode?"parse":"parseAsync"](i,t)).then(function(r){return u.shouldUseNativeValidation&&e({},u),{errors:{},values:s.raw?i:r}})}catch(r){return n(r)}return a&&a.then?a.then(void 0,n):a}(0,function(r){if(function(r){return Array.isArray(null==r?void 0:r.errors)}(r))return{values:{},errors:o(n(r.errors,!u.shouldUseNativeValidation&&"all"===u.criteriaMode),u)};throw r}))}catch(r){return Promise.reject(r)}}};export{t as zodResolver};
2
2
  //# sourceMappingURL=zod.module.js.map
@@ -1,2 +1,2 @@
1
- import{appendErrors as r}from"react-hook-form";import{validateFieldsNatively as o,toNestErrors as e}from"@hookform/resolvers";const s=(o,e)=>{const s={};for(;o.length;){const t=o[0],{code:a,message:n,path:i}=t,c=i.join(".");if(!s[c])if("unionErrors"in t){const r=t.unionErrors[0].errors[0];s[c]={message:r.message,type:r.code}}else s[c]={message:n,type:a};if("unionErrors"in t&&t.unionErrors.forEach(r=>r.errors.forEach(r=>o.push(r))),e){const o=s[c].types,n=o&&o[t.code];s[c]=r(c,e,s,a,n?[].concat(n,t.message):t.message)}o.shift()}return s},t=(r,t,a={})=>async(n,i,c)=>{try{const e=await r["sync"===a.mode?"parse":"parseAsync"](n,t);return c.shouldUseNativeValidation&&o({},c),{errors:{},values:a.raw?n:e}}catch(r){if((r=>null!=r.errors)(r))return{values:{},errors:e(s(r.errors,!c.shouldUseNativeValidation&&"all"===c.criteriaMode),c)};throw r}};export{t as zodResolver};
1
+ import{appendErrors as r}from"react-hook-form";import{validateFieldsNatively as o,toNestErrors as s}from"@hookform/resolvers";const e=(o,s)=>{const e={};for(;o.length;){const a=o[0],{code:t,message:n,path:i}=a,c=i.join(".");if(!e[c])if("unionErrors"in a){const r=a.unionErrors[0].errors[0];e[c]={message:r.message,type:r.code}}else e[c]={message:n,type:t};if("unionErrors"in a&&a.unionErrors.forEach(r=>r.errors.forEach(r=>o.push(r))),s){const o=e[c].types,n=o&&o[a.code];e[c]=r(c,s,e,t,n?[].concat(n,a.message):a.message)}o.shift()}return e},a=(r,a,t={})=>async(n,i,c)=>{try{const s=await r["sync"===t.mode?"parse":"parseAsync"](n,a);return c.shouldUseNativeValidation&&o({},c),{errors:{},values:t.raw?n:s}}catch(r){if((r=>Array.isArray(null==r?void 0:r.errors))(r))return{values:{},errors:s(e(r.errors,!c.shouldUseNativeValidation&&"all"===c.criteriaMode),c)};throw r}};export{a as zodResolver};
2
2
  //# sourceMappingURL=zod.modern.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"zod.modern.mjs","sources":["../src/zod.ts"],"sourcesContent":["import { appendErrors, FieldError, FieldErrors } from 'react-hook-form';\nimport { z, ZodError } from 'zod';\nimport { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type { Resolver } from './types';\n\nconst isZodError = (error: any): error is ZodError => error.errors != null;\n\nconst parseErrorSchema = (\n zodErrors: z.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 const unionError = error.unionErrors[0].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\nexport const zodResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n try {\n const data = await schema[\n resolverOptions.mode === 'sync' ? 'parse' : 'parseAsync'\n ](values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? values : data,\n };\n } catch (error: any) {\n if (isZodError(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.errors,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n"],"names":["parseErrorSchema","zodErrors","validateAllFieldCriteria","errors","length","error","code","message","path","_path","join","unionError","unionErrors","type","forEach","e","push","types","messages","appendErrors","concat","shift","zodResolver","schema","schemaOptions","resolverOptions","async","values","_","options","data","mode","shouldUseNativeValidation","validateFieldsNatively","raw","isZodError","toNestErrors","criteriaMode"],"mappings":"8HAKA,MAEMA,EAAmBA,CACvBC,EACAC,KAEA,MAAMC,EAAqC,CAAE,EAC7C,KAAOF,EAAUG,QAAU,CACzB,MAAMC,EAAQJ,EAAU,IAClBK,KAAEA,EAAIC,QAAEA,EAAOC,KAAEA,GAASH,EAC1BI,EAAQD,EAAKE,KAAK,KAExB,IAAKP,EAAOM,GACV,GAAI,gBAAiBJ,EAAO,CAC1B,MAAMM,EAAaN,EAAMO,YAAY,GAAGT,OAAO,GAE/CA,EAAOM,GAAS,CACdF,QAASI,EAAWJ,QACpBM,KAAMF,EAAWL,KAEpB,MACCH,EAAOM,GAAS,CAAEF,UAASM,KAAMP,GAUrC,GANI,gBAAiBD,GACnBA,EAAMO,YAAYE,QAASH,GACzBA,EAAWR,OAAOW,QAASC,GAAMd,EAAUe,KAAKD,KAIhDb,EAA0B,CAC5B,MAAMe,EAAQd,EAAOM,GAAOQ,MACtBC,EAAWD,GAASA,EAAMZ,EAAMC,MAEtCH,EAAOM,GAASU,EACdV,EACAP,EACAC,EACAG,EACAY,EACK,GAAgBE,OAAOF,EAAsBb,EAAME,SACpDF,EAAME,QAEb,CAEDN,EAAUoB,OACX,CAED,OAAOlB,GAGImB,EACXA,CAACC,EAAQC,EAAeC,EAAkB,CAAA,IAC1CC,MAAOC,EAAQC,EAAGC,KAChB,IACE,MAAMC,QAAaP,EACQ,SAAzBE,EAAgBM,KAAkB,QAAU,cAC5CJ,EAAQH,GAIV,OAFAK,EAAQG,2BAA6BC,EAAuB,CAAA,EAAIJ,GAEzD,CACL1B,OAAQ,GACRwB,OAAQF,EAAgBS,IAAMP,EAASG,EAE1C,CAAC,MAAOzB,GACP,GAnEcA,IAAkD,MAAhBA,EAAMF,OAmElDgC,CAAW9B,GACb,MAAO,CACLsB,OAAQ,CAAA,EACRxB,OAAQiC,EACNpC,EACEK,EAAMF,QACL0B,EAAQG,2BACkB,QAAzBH,EAAQQ,cAEZR,IAKN,MAAMxB,CACP"}
1
+ {"version":3,"file":"zod.modern.mjs","sources":["../src/zod.ts"],"sourcesContent":["import { appendErrors, FieldError, FieldErrors } from 'react-hook-form';\nimport { z, ZodError } from 'zod';\nimport { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type { Resolver } from './types';\n\nconst isZodError = (error: any): error is ZodError => Array.isArray(error?.errors);\n\nconst parseErrorSchema = (\n zodErrors: z.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 const unionError = error.unionErrors[0].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\nexport const zodResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n try {\n const data = await schema[\n resolverOptions.mode === 'sync' ? 'parse' : 'parseAsync'\n ](values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? values : data,\n };\n } catch (error: any) {\n if (isZodError(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.errors,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n"],"names":["parseErrorSchema","zodErrors","validateAllFieldCriteria","errors","length","error","code","message","path","_path","join","unionError","unionErrors","type","forEach","e","push","types","messages","appendErrors","concat","shift","zodResolver","schema","schemaOptions","resolverOptions","async","values","_","options","data","mode","shouldUseNativeValidation","validateFieldsNatively","raw","Array","isArray","isZodError","toNestErrors","criteriaMode"],"mappings":"8HAKA,MAEMA,EAAmBA,CACvBC,EACAC,KAEA,MAAMC,EAAqC,CAAA,EAC3C,KAAOF,EAAUG,QAAU,CACzB,MAAMC,EAAQJ,EAAU,IAClBK,KAAEA,EAAIC,QAAEA,EAAOC,KAAEA,GAASH,EAC1BI,EAAQD,EAAKE,KAAK,KAExB,IAAKP,EAAOM,GACV,GAAI,gBAAiBJ,EAAO,CAC1B,MAAMM,EAAaN,EAAMO,YAAY,GAAGT,OAAO,GAE/CA,EAAOM,GAAS,CACdF,QAASI,EAAWJ,QACpBM,KAAMF,EAAWL,KAEpB,MACCH,EAAOM,GAAS,CAAEF,UAASM,KAAMP,GAUrC,GANI,gBAAiBD,GACnBA,EAAMO,YAAYE,QAASH,GACzBA,EAAWR,OAAOW,QAASC,GAAMd,EAAUe,KAAKD,KAIhDb,EAA0B,CAC5B,MAAMe,EAAQd,EAAOM,GAAOQ,MACtBC,EAAWD,GAASA,EAAMZ,EAAMC,MAEtCH,EAAOM,GAASU,EACdV,EACAP,EACAC,EACAG,EACAY,EACK,GAAgBE,OAAOF,EAAsBb,EAAME,SACpDF,EAAME,QAEb,CAEDN,EAAUoB,OACX,CAED,OAAOlB,GAGImB,EACXA,CAACC,EAAQC,EAAeC,EAAkB,KAC1CC,MAAOC,EAAQC,EAAGC,KAChB,IACE,MAAMC,QAAaP,EACQ,SAAzBE,EAAgBM,KAAkB,QAAU,cAC5CJ,EAAQH,GAIV,OAFAK,EAAQG,2BAA6BC,EAAuB,CAAE,EAAEJ,GAEzD,CACL1B,OAAQ,CAAA,EACRwB,OAAQF,EAAgBS,IAAMP,EAASG,EAE1C,CAAC,MAAOzB,GACP,GAnEcA,IAAkC8B,MAAMC,QAAQ/B,MAAAA,OAAAA,EAAAA,EAAOF,QAmEjEkC,CAAWhC,GACb,MAAO,CACLsB,OAAQ,GACRxB,OAAQmC,EACNtC,EACEK,EAAMF,QACL0B,EAAQG,2BACkB,QAAzBH,EAAQU,cAEZV,IAKN,MAAMxB,CACP"}
@@ -1,2 +1,2 @@
1
- import{appendErrors as r}from"react-hook-form";import{validateFieldsNatively as e,toNestErrors as o}from"@hookform/resolvers";var n=function(e,o){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[0].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)})}),o){var c=n[a].types,f=c&&c[t.code];n[a]=r(a,o,n,s,f?[].concat(f,t.message):t.message)}e.shift()}return n},t=function(r,t,s){return void 0===s&&(s={}),function(i,a,u){try{return Promise.resolve(function(o,n){try{var a=Promise.resolve(r["sync"===s.mode?"parse":"parseAsync"](i,t)).then(function(r){return u.shouldUseNativeValidation&&e({},u),{errors:{},values:s.raw?i:r}})}catch(r){return n(r)}return a&&a.then?a.then(void 0,n):a}(0,function(r){if(function(r){return null!=r.errors}(r))return{values:{},errors:o(n(r.errors,!u.shouldUseNativeValidation&&"all"===u.criteriaMode),u)};throw r}))}catch(r){return Promise.reject(r)}}};export{t as zodResolver};
1
+ import{appendErrors as r}from"react-hook-form";import{validateFieldsNatively as e,toNestErrors as o}from"@hookform/resolvers";var n=function(e,o){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[0].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)})}),o){var c=n[a].types,f=c&&c[t.code];n[a]=r(a,o,n,s,f?[].concat(f,t.message):t.message)}e.shift()}return n},t=function(r,t,s){return void 0===s&&(s={}),function(i,a,u){try{return Promise.resolve(function(o,n){try{var a=Promise.resolve(r["sync"===s.mode?"parse":"parseAsync"](i,t)).then(function(r){return u.shouldUseNativeValidation&&e({},u),{errors:{},values:s.raw?i:r}})}catch(r){return n(r)}return a&&a.then?a.then(void 0,n):a}(0,function(r){if(function(r){return Array.isArray(null==r?void 0:r.errors)}(r))return{values:{},errors:o(n(r.errors,!u.shouldUseNativeValidation&&"all"===u.criteriaMode),u)};throw r}))}catch(r){return Promise.reject(r)}}};export{t as zodResolver};
2
2
  //# sourceMappingURL=zod.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zod.module.js","sources":["../src/zod.ts"],"sourcesContent":["import { appendErrors, FieldError, FieldErrors } from 'react-hook-form';\nimport { z, ZodError } from 'zod';\nimport { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type { Resolver } from './types';\n\nconst isZodError = (error: any): error is ZodError => error.errors != null;\n\nconst parseErrorSchema = (\n zodErrors: z.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 const unionError = error.unionErrors[0].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\nexport const zodResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n try {\n const data = await schema[\n resolverOptions.mode === 'sync' ? 'parse' : 'parseAsync'\n ](values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? values : data,\n };\n } catch (error: any) {\n if (isZodError(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.errors,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n"],"names":["parseErrorSchema","zodErrors","validateAllFieldCriteria","errors","length","error","code","message","_path","path","join","unionError","unionErrors","type","forEach","e","push","types","messages","appendErrors","concat","shift","zodResolver","schema","schemaOptions","resolverOptions","values","_","options","Promise","resolve","mode","then","data","shouldUseNativeValidation","validateFieldsNatively","raw","_catch","isZodError","toNestErrors","criteriaMode","reject"],"mappings":"8HAKA,IAEMA,EAAmB,SACvBC,EACAC,GAGA,IADA,IAAMC,EAAqC,CAAA,EACpCF,EAAUG,QAAU,CACzB,IAAMC,EAAQJ,EAAU,GAChBK,EAAwBD,EAAxBC,KAAMC,EAAkBF,EAAlBE,QACRC,EAD0BH,EAATI,KACJC,KAAK,KAExB,IAAKP,EAAOK,GACV,GAAI,gBAAiBH,EAAO,CAC1B,IAAMM,EAAaN,EAAMO,YAAY,GAAGT,OAAO,GAE/CA,EAAOK,GAAS,CACdD,QAASI,EAAWJ,QACpBM,KAAMF,EAAWL,KAEpB,MACCH,EAAOK,GAAS,CAAED,QAAAA,EAASM,KAAMP,GAUrC,GANI,gBAAiBD,GACnBA,EAAMO,YAAYE,QAAQ,SAACH,GACzB,OAAAA,EAAWR,OAAOW,QAAQ,SAACC,GAAC,OAAKd,EAAUe,KAAKD,EAAE,EAAC,GAInDb,EAA0B,CAC5B,IAAMe,EAAQd,EAAOK,GAAOS,MACtBC,EAAWD,GAASA,EAAMZ,EAAMC,MAEtCH,EAAOK,GAASW,EACdX,EACAN,EACAC,EACAG,EACAY,EACK,GAAgBE,OAAOF,EAAsBb,EAAME,SACpDF,EAAME,QAEb,CAEDN,EAAUoB,OACX,CAED,OAAOlB,CACT,EAEamB,EACX,SAACC,EAAQC,EAAeC,GAAoB,YAAL,IAAfA,IAAAA,EAAkB,IAAE,SACrCC,EAAQC,EAAGC,GAAO,IAAIC,OAAAA,QAAAC,gCACvBD,QAAAC,QACiBP,EACQ,SAAzBE,EAAgBM,KAAkB,QAAU,cAC5CL,EAAQF,IAAcQ,KAAA,SAFlBC,GAMN,OAFAL,EAAQM,2BAA6BC,EAAuB,GAAIP,GAEzD,CACLzB,OAAQ,CAAA,EACRuB,OAAQD,EAAgBW,IAAMV,EAASO,EACvC,4DAXuBI,CAAA,EAYlBhC,SAAAA,GACP,GAnEa,SAACA,GAAU,OAAwC,MAAhBA,EAAMF,MAAc,CAmEhEmC,CAAWjC,GACb,MAAO,CACLqB,OAAQ,CAAA,EACRvB,OAAQoC,EACNvC,EACEK,EAAMF,QACLyB,EAAQM,2BACkB,QAAzBN,EAAQY,cAEZZ,IAKN,MAAMvB,CACP,GACH,CAAC,MAAAU,GAAA,OAAAc,QAAAY,OAAA1B,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"zod.module.js","sources":["../src/zod.ts"],"sourcesContent":["import { appendErrors, FieldError, FieldErrors } from 'react-hook-form';\nimport { z, ZodError } from 'zod';\nimport { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type { Resolver } from './types';\n\nconst isZodError = (error: any): error is ZodError => Array.isArray(error?.errors);\n\nconst parseErrorSchema = (\n zodErrors: z.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 const unionError = error.unionErrors[0].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\nexport const zodResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n try {\n const data = await schema[\n resolverOptions.mode === 'sync' ? 'parse' : 'parseAsync'\n ](values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? values : data,\n };\n } catch (error: any) {\n if (isZodError(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.errors,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n"],"names":["parseErrorSchema","zodErrors","validateAllFieldCriteria","errors","length","error","code","message","_path","path","join","unionError","unionErrors","type","forEach","e","push","types","messages","appendErrors","concat","shift","zodResolver","schema","schemaOptions","resolverOptions","values","_","options","Promise","resolve","mode","then","data","shouldUseNativeValidation","validateFieldsNatively","raw","_catch","Array","isArray","isZodError","toNestErrors","criteriaMode","reject"],"mappings":"8HAKA,IAEMA,EAAmB,SACvBC,EACAC,GAGA,IADA,IAAMC,EAAqC,CAAE,EACtCF,EAAUG,QAAU,CACzB,IAAMC,EAAQJ,EAAU,GAChBK,EAAwBD,EAAxBC,KAAMC,EAAkBF,EAAlBE,QACRC,EAD0BH,EAATI,KACJC,KAAK,KAExB,IAAKP,EAAOK,GACV,GAAI,gBAAiBH,EAAO,CAC1B,IAAMM,EAAaN,EAAMO,YAAY,GAAGT,OAAO,GAE/CA,EAAOK,GAAS,CACdD,QAASI,EAAWJ,QACpBM,KAAMF,EAAWL,KAEpB,MACCH,EAAOK,GAAS,CAAED,QAAAA,EAASM,KAAMP,GAUrC,GANI,gBAAiBD,GACnBA,EAAMO,YAAYE,QAAQ,SAACH,GAAU,OACnCA,EAAWR,OAAOW,QAAQ,SAACC,GAAM,OAAAd,EAAUe,KAAKD,EAAE,EAAC,GAInDb,EAA0B,CAC5B,IAAMe,EAAQd,EAAOK,GAAOS,MACtBC,EAAWD,GAASA,EAAMZ,EAAMC,MAEtCH,EAAOK,GAASW,EACdX,EACAN,EACAC,EACAG,EACAY,EACK,GAAgBE,OAAOF,EAAsBb,EAAME,SACpDF,EAAME,QAEb,CAEDN,EAAUoB,OACX,CAED,OAAOlB,CACT,EAEamB,EACX,SAACC,EAAQC,EAAeC,GACjBC,YADgC,IAAfD,IAAAA,EAAkB,CAAE,GACrCC,SAAAA,EAAQC,EAAGC,GAAW,IAAA,OAAAC,QAAAC,gCACvBD,QAAAC,QACiBP,EACQ,SAAzBE,EAAgBM,KAAkB,QAAU,cAC5CL,EAAQF,IAAcQ,KAFlBC,SAAAA,GAMN,OAFAL,EAAQM,2BAA6BC,EAAuB,CAAA,EAAIP,GAEzD,CACLzB,OAAQ,CAAiB,EACzBuB,OAAQD,EAAgBW,IAAMV,EAASO,EACvC,4DAXuBI,CACvB,EAWH,SAAQhC,GACP,GAnEa,SAACA,GAAkC,OAAAiC,MAAMC,QAAa,MAALlC,OAAK,EAALA,EAAOF,OAAO,CAmExEqC,CAAWnC,GACb,MAAO,CACLqB,OAAQ,CAAA,EACRvB,OAAQsC,EACNzC,EACEK,EAAMF,QACLyB,EAAQM,2BACkB,QAAzBN,EAAQc,cAEZd,IAKN,MAAMvB,CACP,GACH,CAAC,MAAAU,GAAA,OAAAc,QAAAc,OAAA5B,EAAA,CAAA,CAAA"}
@@ -1,2 +1,2 @@
1
- !function(r,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("react-hook-form"),require("@hookform/resolvers")):"function"==typeof define&&define.amd?define(["exports","react-hook-form","@hookform/resolvers"],e):e((r||self).hookformResolversZod={},r.ReactHookForm,r.hookformResolvers)}(this,function(r,e,o){var n=function(r,o){for(var n={};r.length;){var s=r[0],t=s.code,i=s.message,a=s.path.join(".");if(!n[a])if("unionErrors"in s){var u=s.unionErrors[0].errors[0];n[a]={message:u.message,type:u.code}}else n[a]={message:i,type:t};if("unionErrors"in s&&s.unionErrors.forEach(function(e){return e.errors.forEach(function(e){return r.push(e)})}),o){var f=n[a].types,c=f&&f[s.code];n[a]=e.appendErrors(a,o,n,t,c?[].concat(c,s.message):s.message)}r.shift()}return n};r.zodResolver=function(r,e,s){return void 0===s&&(s={}),function(t,i,a){try{return Promise.resolve(function(n,i){try{var u=Promise.resolve(r["sync"===s.mode?"parse":"parseAsync"](t,e)).then(function(r){return a.shouldUseNativeValidation&&o.validateFieldsNatively({},a),{errors:{},values:s.raw?t:r}})}catch(r){return i(r)}return u&&u.then?u.then(void 0,i):u}(0,function(r){if(function(r){return null!=r.errors}(r))return{values:{},errors:o.toNestErrors(n(r.errors,!a.shouldUseNativeValidation&&"all"===a.criteriaMode),a)};throw r}))}catch(r){return Promise.reject(r)}}}});
1
+ !function(r,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("react-hook-form"),require("@hookform/resolvers")):"function"==typeof define&&define.amd?define(["exports","react-hook-form","@hookform/resolvers"],e):e((r||self).hookformResolversZod={},r.ReactHookForm,r.hookformResolvers)}(this,function(r,e,o){var n=function(r,o){for(var n={};r.length;){var s=r[0],t=s.code,i=s.message,a=s.path.join(".");if(!n[a])if("unionErrors"in s){var u=s.unionErrors[0].errors[0];n[a]={message:u.message,type:u.code}}else n[a]={message:i,type:t};if("unionErrors"in s&&s.unionErrors.forEach(function(e){return e.errors.forEach(function(e){return r.push(e)})}),o){var f=n[a].types,c=f&&f[s.code];n[a]=e.appendErrors(a,o,n,t,c?[].concat(c,s.message):s.message)}r.shift()}return n};r.zodResolver=function(r,e,s){return void 0===s&&(s={}),function(t,i,a){try{return Promise.resolve(function(n,i){try{var u=Promise.resolve(r["sync"===s.mode?"parse":"parseAsync"](t,e)).then(function(r){return a.shouldUseNativeValidation&&o.validateFieldsNatively({},a),{errors:{},values:s.raw?t:r}})}catch(r){return i(r)}return u&&u.then?u.then(void 0,i):u}(0,function(r){if(function(r){return Array.isArray(null==r?void 0:r.errors)}(r))return{values:{},errors:o.toNestErrors(n(r.errors,!a.shouldUseNativeValidation&&"all"===a.criteriaMode),a)};throw r}))}catch(r){return Promise.reject(r)}}}});
2
2
  //# sourceMappingURL=zod.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zod.umd.js","sources":["../src/zod.ts"],"sourcesContent":["import { appendErrors, FieldError, FieldErrors } from 'react-hook-form';\nimport { z, ZodError } from 'zod';\nimport { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type { Resolver } from './types';\n\nconst isZodError = (error: any): error is ZodError => error.errors != null;\n\nconst parseErrorSchema = (\n zodErrors: z.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 const unionError = error.unionErrors[0].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\nexport const zodResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n try {\n const data = await schema[\n resolverOptions.mode === 'sync' ? 'parse' : 'parseAsync'\n ](values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? values : data,\n };\n } catch (error: any) {\n if (isZodError(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.errors,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n"],"names":["parseErrorSchema","zodErrors","validateAllFieldCriteria","errors","length","error","code","message","_path","path","join","unionError","unionErrors","type","forEach","e","push","types","messages","appendErrors","concat","shift","schema","schemaOptions","resolverOptions","values","_","options","Promise","resolve","mode","then","data","shouldUseNativeValidation","validateFieldsNatively","raw","_catch","isZodError","toNestErrors","criteriaMode","reject"],"mappings":"wXAKA,IAEMA,EAAmB,SACvBC,EACAC,GAGA,IADA,IAAMC,EAAqC,CAAA,EACpCF,EAAUG,QAAU,CACzB,IAAMC,EAAQJ,EAAU,GAChBK,EAAwBD,EAAxBC,KAAMC,EAAkBF,EAAlBE,QACRC,EAD0BH,EAATI,KACJC,KAAK,KAExB,IAAKP,EAAOK,GACV,GAAI,gBAAiBH,EAAO,CAC1B,IAAMM,EAAaN,EAAMO,YAAY,GAAGT,OAAO,GAE/CA,EAAOK,GAAS,CACdD,QAASI,EAAWJ,QACpBM,KAAMF,EAAWL,KAEpB,MACCH,EAAOK,GAAS,CAAED,QAAAA,EAASM,KAAMP,GAUrC,GANI,gBAAiBD,GACnBA,EAAMO,YAAYE,QAAQ,SAACH,GACzB,OAAAA,EAAWR,OAAOW,QAAQ,SAACC,GAAC,OAAKd,EAAUe,KAAKD,EAAE,EAAC,GAInDb,EAA0B,CAC5B,IAAMe,EAAQd,EAAOK,GAAOS,MACtBC,EAAWD,GAASA,EAAMZ,EAAMC,MAEtCH,EAAOK,GAASW,EAAAA,aACdX,EACAN,EACAC,EACAG,EACAY,EACK,GAAgBE,OAAOF,EAAsBb,EAAME,SACpDF,EAAME,QAEb,CAEDN,EAAUoB,OACX,CAED,OAAOlB,CACT,gBAGE,SAACmB,EAAQC,EAAeC,GAAoB,YAAL,IAAfA,IAAAA,EAAkB,IAAE,SACrCC,EAAQC,EAAGC,GAAO,IAAIC,OAAAA,QAAAC,gCACvBD,QAAAC,QACiBP,EACQ,SAAzBE,EAAgBM,KAAkB,QAAU,cAC5CL,EAAQF,IAAcQ,KAAA,SAFlBC,GAMN,OAFAL,EAAQM,2BAA6BC,EAAsBA,uBAAC,GAAIP,GAEzD,CACLxB,OAAQ,CAAA,EACRsB,OAAQD,EAAgBW,IAAMV,EAASO,EACvC,4DAXuBI,CAAA,EAYlB/B,SAAAA,GACP,GAnEa,SAACA,GAAU,OAAwC,MAAhBA,EAAMF,MAAc,CAmEhEkC,CAAWhC,GACb,MAAO,CACLoB,OAAQ,CAAA,EACRtB,OAAQmC,EAAYA,aAClBtC,EACEK,EAAMF,QACLwB,EAAQM,2BACkB,QAAzBN,EAAQY,cAEZZ,IAKN,MAAMtB,CACP,GACH,CAAC,MAAAU,GAAA,OAAAa,QAAAY,OAAAzB,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"zod.umd.js","sources":["../src/zod.ts"],"sourcesContent":["import { appendErrors, FieldError, FieldErrors } from 'react-hook-form';\nimport { z, ZodError } from 'zod';\nimport { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type { Resolver } from './types';\n\nconst isZodError = (error: any): error is ZodError => Array.isArray(error?.errors);\n\nconst parseErrorSchema = (\n zodErrors: z.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 const unionError = error.unionErrors[0].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\nexport const zodResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n try {\n const data = await schema[\n resolverOptions.mode === 'sync' ? 'parse' : 'parseAsync'\n ](values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? values : data,\n };\n } catch (error: any) {\n if (isZodError(error)) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.errors,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n"],"names":["parseErrorSchema","zodErrors","validateAllFieldCriteria","errors","length","error","code","message","_path","path","join","unionError","unionErrors","type","forEach","e","push","types","messages","appendErrors","concat","shift","schema","schemaOptions","resolverOptions","values","_","options","Promise","resolve","mode","then","data","shouldUseNativeValidation","validateFieldsNatively","raw","_catch","Array","isArray","isZodError","toNestErrors","criteriaMode","reject"],"mappings":"wXAKA,IAEMA,EAAmB,SACvBC,EACAC,GAGA,IADA,IAAMC,EAAqC,CAAE,EACtCF,EAAUG,QAAU,CACzB,IAAMC,EAAQJ,EAAU,GAChBK,EAAwBD,EAAxBC,KAAMC,EAAkBF,EAAlBE,QACRC,EAD0BH,EAATI,KACJC,KAAK,KAExB,IAAKP,EAAOK,GACV,GAAI,gBAAiBH,EAAO,CAC1B,IAAMM,EAAaN,EAAMO,YAAY,GAAGT,OAAO,GAE/CA,EAAOK,GAAS,CACdD,QAASI,EAAWJ,QACpBM,KAAMF,EAAWL,KAEpB,MACCH,EAAOK,GAAS,CAAED,QAAAA,EAASM,KAAMP,GAUrC,GANI,gBAAiBD,GACnBA,EAAMO,YAAYE,QAAQ,SAACH,GAAU,OACnCA,EAAWR,OAAOW,QAAQ,SAACC,GAAM,OAAAd,EAAUe,KAAKD,EAAE,EAAC,GAInDb,EAA0B,CAC5B,IAAMe,EAAQd,EAAOK,GAAOS,MACtBC,EAAWD,GAASA,EAAMZ,EAAMC,MAEtCH,EAAOK,GAASW,EAAAA,aACdX,EACAN,EACAC,EACAG,EACAY,EACK,GAAgBE,OAAOF,EAAsBb,EAAME,SACpDF,EAAME,QAEb,CAEDN,EAAUoB,OACX,CAED,OAAOlB,CACT,gBAGE,SAACmB,EAAQC,EAAeC,GACjBC,YADgC,IAAfD,IAAAA,EAAkB,CAAE,GACrCC,SAAAA,EAAQC,EAAGC,GAAW,IAAA,OAAAC,QAAAC,gCACvBD,QAAAC,QACiBP,EACQ,SAAzBE,EAAgBM,KAAkB,QAAU,cAC5CL,EAAQF,IAAcQ,KAFlBC,SAAAA,GAMN,OAFAL,EAAQM,2BAA6BC,yBAAuB,CAAA,EAAIP,GAEzD,CACLxB,OAAQ,CAAiB,EACzBsB,OAAQD,EAAgBW,IAAMV,EAASO,EACvC,4DAXuBI,CACvB,EAWH,SAAQ/B,GACP,GAnEa,SAACA,GAAkC,OAAAgC,MAAMC,QAAa,MAALjC,OAAK,EAALA,EAAOF,OAAO,CAmExEoC,CAAWlC,GACb,MAAO,CACLoB,OAAQ,CAAA,EACRtB,OAAQqC,EAAYA,aAClBxC,EACEK,EAAMF,QACLwB,EAAQM,2BACkB,QAAzBN,EAAQc,cAEZd,IAKN,MAAMtB,CACP,GACH,CAAC,MAAAU,GAAA,OAAAa,QAAAc,OAAA3B,EAAA,CAAA,CAAA"}
package/zod/src/zod.ts CHANGED
@@ -3,7 +3,7 @@ import { z, ZodError } from 'zod';
3
3
  import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';
4
4
  import type { Resolver } from './types';
5
5
 
6
- const isZodError = (error: any): error is ZodError => error.errors != null;
6
+ const isZodError = (error: any): error is ZodError => Array.isArray(error?.errors);
7
7
 
8
8
  const parseErrorSchema = (
9
9
  zodErrors: z.ZodIssue[],