@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 +38 -25
- package/package.json +17 -5
- package/valibot/package.json +1 -1
- package/vine/dist/index.d.ts +2 -0
- package/vine/dist/types.d.ts +6 -0
- package/vine/dist/vine.d.ts +2 -0
- package/vine/dist/vine.js +2 -0
- package/vine/dist/vine.js.map +1 -0
- package/vine/dist/vine.mjs +2 -0
- package/vine/dist/vine.modern.mjs +2 -0
- package/vine/dist/vine.modern.mjs.map +1 -0
- package/vine/dist/vine.module.js +2 -0
- package/vine/dist/vine.module.js.map +1 -0
- package/vine/dist/vine.umd.js +2 -0
- package/vine/dist/vine.umd.js.map +1 -0
- package/vine/package.json +18 -0
- package/vine/src/__tests__/Form-native-validation.tsx +81 -0
- package/vine/src/__tests__/Form.tsx +55 -0
- package/vine/src/__tests__/__fixtures__/data.ts +74 -0
- package/vine/src/__tests__/__snapshots__/vine.ts.snap +180 -0
- package/vine/src/__tests__/vine.ts +53 -0
- package/vine/src/index.ts +2 -0
- package/vine/src/types.ts +13 -0
- package/vine/src/vine.ts +66 -0
- package/zod/dist/zod.js +1 -1
- package/zod/dist/zod.js.map +1 -1
- package/zod/dist/zod.mjs +1 -1
- package/zod/dist/zod.modern.mjs +1 -1
- package/zod/dist/zod.modern.mjs.map +1 -1
- package/zod/dist/zod.module.js +1 -1
- package/zod/dist/zod.module.js.map +1 -1
- package/zod/dist/zod.umd.js +1 -1
- package/zod/dist/zod.umd.js.map +1 -1
- package/zod/src/zod.ts +1 -1
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
|
-
|
|
633
|
+
### [VineJS](https://github.com/vinejs/vine)
|
|
633
634
|
|
|
634
|
-
|
|
635
|
+
VineJS is a form data validation library for Node.js
|
|
635
636
|
|
|
636
|
-
|
|
637
|
-
<img src="https://opencollective.com/react-hook-form/backers.svg?width=950" />
|
|
638
|
-
</a>
|
|
637
|
+
[](https://bundlephobia.com/result?p=@vinejs/vine)
|
|
639
638
|
|
|
640
|
-
|
|
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
|
-
|
|
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
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
<
|
|
651
|
-
|
|
652
|
-
</
|
|
653
|
-
<
|
|
654
|
-
|
|
655
|
-
</
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
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
|
|
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.
|
|
5
|
-
"description": "React Hook Form validation resolvers: Yup, Joi, Superstruct, Zod, Vest, Class Validator, io-ts, Nope, computed-types, TypeBox, arktype, Typanion
|
|
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.
|
|
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",
|
package/valibot/package.json
CHANGED
|
@@ -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
|
+
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,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>>;
|
package/vine/src/vine.ts
ADDED
|
@@ -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
|
|
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
|
package/zod/dist/zod.js.map
CHANGED
|
@@ -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
|
|
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
|
|
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
|
package/zod/dist/zod.modern.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{appendErrors as r}from"react-hook-form";import{validateFieldsNatively as o,toNestErrors as
|
|
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
|
|
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"}
|
package/zod/dist/zod.module.js
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
|
|
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
|
|
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"}
|
package/zod/dist/zod.umd.js
CHANGED
|
@@ -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
|
|
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
|
package/zod/dist/zod.umd.js.map
CHANGED
|
@@ -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
|
|
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
|
|
6
|
+
const isZodError = (error: any): error is ZodError => Array.isArray(error?.errors);
|
|
7
7
|
|
|
8
8
|
const parseErrorSchema = (
|
|
9
9
|
zodErrors: z.ZodIssue[],
|