@hookform/resolvers 3.10.0 → 4.1.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 +108 -6
- package/ajv/dist/ajv.d.ts +20 -0
- package/ajv/dist/ajv.js +1 -1
- package/ajv/dist/ajv.js.map +1 -1
- package/ajv/dist/ajv.mjs +1 -1
- package/ajv/dist/ajv.modern.mjs +1 -1
- package/ajv/dist/ajv.modern.mjs.map +1 -1
- package/ajv/dist/ajv.module.js +1 -1
- package/ajv/dist/ajv.module.js.map +1 -1
- package/ajv/dist/ajv.umd.js +1 -1
- package/ajv/dist/ajv.umd.js.map +1 -1
- package/ajv/dist/types.d.ts +8 -0
- package/ajv/src/__tests__/__fixtures__/data-errors.ts +216 -0
- package/ajv/src/__tests__/__snapshots__/ajv-errors.ts.snap +462 -0
- package/ajv/src/__tests__/__snapshots__/ajv.ts.snap +6 -6
- package/ajv/src/__tests__/ajv-errors.ts +227 -0
- package/ajv/src/ajv.ts +47 -14
- package/ajv/src/types.ts +8 -0
- package/arktype/dist/arktype.d.ts +20 -2
- package/arktype/dist/arktype.js +1 -1
- package/arktype/dist/arktype.js.map +1 -1
- package/arktype/dist/arktype.mjs +1 -1
- package/arktype/dist/arktype.modern.mjs +1 -1
- package/arktype/dist/arktype.modern.mjs.map +1 -1
- package/arktype/dist/arktype.module.js +1 -1
- package/arktype/dist/arktype.module.js.map +1 -1
- package/arktype/dist/arktype.umd.js +1 -1
- package/arktype/dist/arktype.umd.js.map +1 -1
- package/arktype/dist/index.d.ts +0 -1
- package/arktype/package.json +1 -1
- package/arktype/src/__tests__/Form-native-validation.tsx +3 -3
- package/arktype/src/__tests__/Form.tsx +34 -8
- package/arktype/src/__tests__/__fixtures__/data.ts +2 -2
- package/arktype/src/__tests__/__snapshots__/arktype.ts.snap +22 -415
- package/arktype/src/arktype.ts +46 -15
- package/arktype/src/index.ts +0 -1
- package/class-validator/dist/class-validator.d.ts +29 -2
- package/class-validator/dist/class-validator.js +1 -1
- package/class-validator/dist/class-validator.js.map +1 -1
- package/class-validator/dist/class-validator.mjs +1 -1
- package/class-validator/dist/class-validator.modern.mjs +1 -1
- package/class-validator/dist/class-validator.modern.mjs.map +1 -1
- package/class-validator/dist/class-validator.module.js +1 -1
- package/class-validator/dist/class-validator.module.js.map +1 -1
- package/class-validator/dist/class-validator.umd.js +1 -1
- package/class-validator/dist/class-validator.umd.js.map +1 -1
- package/class-validator/dist/index.d.ts +0 -1
- package/class-validator/src/__tests__/Form.tsx +26 -0
- package/class-validator/src/__tests__/__fixtures__/data.ts +1 -1
- package/class-validator/src/__tests__/class-validator.ts +22 -11
- package/class-validator/src/class-validator.ts +47 -13
- package/class-validator/src/index.ts +0 -1
- package/computed-types/dist/computed-types.d.ts +18 -2
- package/computed-types/dist/computed-types.js.map +1 -1
- package/computed-types/dist/computed-types.mjs +1 -1
- package/computed-types/dist/computed-types.modern.mjs +1 -1
- package/computed-types/dist/computed-types.modern.mjs.map +1 -1
- package/computed-types/dist/computed-types.module.js +1 -1
- package/computed-types/dist/computed-types.module.js.map +1 -1
- package/computed-types/dist/computed-types.umd.js.map +1 -1
- package/computed-types/dist/index.d.ts +0 -1
- package/computed-types/src/__tests__/Form-native-validation.tsx +2 -4
- package/computed-types/src/__tests__/Form.tsx +30 -6
- package/computed-types/src/__tests__/__fixtures__/data.ts +1 -1
- package/computed-types/src/__tests__/computed-types.ts +2 -0
- package/computed-types/src/computed-types.ts +24 -7
- package/computed-types/src/index.ts +0 -1
- package/dist/resolvers.js +1 -1
- package/dist/resolvers.js.map +1 -1
- package/dist/resolvers.mjs +1 -1
- package/dist/resolvers.mjs.map +1 -1
- package/dist/resolvers.module.js +1 -1
- package/dist/resolvers.module.js.map +1 -1
- package/dist/resolvers.umd.js +1 -1
- package/dist/resolvers.umd.js.map +1 -1
- package/effect-ts/dist/effect-ts.d.ts +19 -2
- package/effect-ts/dist/effect-ts.js +1 -1
- package/effect-ts/dist/effect-ts.js.map +1 -1
- package/effect-ts/dist/effect-ts.mjs +1 -1
- package/effect-ts/dist/effect-ts.modern.mjs +1 -1
- package/effect-ts/dist/effect-ts.modern.mjs.map +1 -1
- package/effect-ts/dist/effect-ts.module.js +1 -1
- package/effect-ts/dist/effect-ts.module.js.map +1 -1
- package/effect-ts/dist/effect-ts.umd.js +1 -1
- package/effect-ts/dist/effect-ts.umd.js.map +1 -1
- package/effect-ts/dist/index.d.ts +0 -1
- package/effect-ts/src/__tests__/Form.tsx +30 -4
- package/effect-ts/src/__tests__/__fixtures__/data.ts +1 -1
- package/effect-ts/src/__tests__/__snapshots__/effect-ts.ts.snap +35 -1
- package/effect-ts/src/__tests__/effect-ts.ts +61 -0
- package/effect-ts/src/effect-ts.ts +60 -13
- package/effect-ts/src/index.ts +0 -1
- package/fluentvalidation-ts/dist/fluentvalidation-ts.d.ts +21 -0
- package/fluentvalidation-ts/dist/fluentvalidation-ts.js +1 -1
- package/fluentvalidation-ts/dist/fluentvalidation-ts.js.map +1 -1
- package/fluentvalidation-ts/dist/fluentvalidation-ts.mjs +1 -1
- package/fluentvalidation-ts/dist/fluentvalidation-ts.modern.mjs +1 -1
- package/fluentvalidation-ts/dist/fluentvalidation-ts.modern.mjs.map +1 -1
- package/fluentvalidation-ts/dist/fluentvalidation-ts.module.js +1 -1
- package/fluentvalidation-ts/dist/fluentvalidation-ts.module.js.map +1 -1
- package/fluentvalidation-ts/dist/fluentvalidation-ts.umd.js +1 -1
- package/fluentvalidation-ts/dist/fluentvalidation-ts.umd.js.map +1 -1
- package/fluentvalidation-ts/src/fluentvalidation-ts.ts +24 -3
- package/io-ts/dist/errorsToRecord.d.ts +5 -1
- package/io-ts/dist/index.d.ts +0 -1
- package/io-ts/dist/io-ts.d.ts +19 -2
- package/io-ts/dist/io-ts.js +1 -1
- package/io-ts/dist/io-ts.js.map +1 -1
- package/io-ts/dist/io-ts.mjs +1 -1
- package/io-ts/dist/io-ts.modern.mjs +1 -1
- package/io-ts/dist/io-ts.modern.mjs.map +1 -1
- package/io-ts/dist/io-ts.module.js +1 -1
- package/io-ts/dist/io-ts.module.js.map +1 -1
- package/io-ts/dist/io-ts.umd.js +1 -1
- package/io-ts/dist/io-ts.umd.js.map +1 -1
- package/io-ts/src/__tests__/Form-native-validation.tsx +4 -11
- package/io-ts/src/__tests__/Form.tsx +30 -6
- package/io-ts/src/__tests__/__fixtures__/data.ts +2 -19
- package/io-ts/src/errorsToRecord.ts +4 -1
- package/io-ts/src/index.ts +0 -1
- package/io-ts/src/io-ts.ts +47 -25
- package/joi/dist/joi.d.ts +17 -0
- package/joi/dist/joi.js.map +1 -1
- package/joi/dist/joi.modern.mjs.map +1 -1
- package/joi/dist/joi.module.js.map +1 -1
- package/joi/dist/joi.umd.js.map +1 -1
- package/joi/src/joi.ts +17 -0
- package/nope/dist/nope.d.ts +17 -0
- package/nope/dist/nope.js +1 -1
- package/nope/dist/nope.js.map +1 -1
- package/nope/dist/nope.mjs +1 -1
- package/nope/dist/nope.modern.mjs.map +1 -1
- package/nope/dist/nope.module.js +1 -1
- package/nope/dist/nope.module.js.map +1 -1
- package/nope/dist/nope.umd.js +1 -1
- package/nope/dist/nope.umd.js.map +1 -1
- package/nope/src/nope.ts +17 -0
- package/package.json +49 -34
- package/standard-schema/dist/index.d.ts +1 -0
- package/standard-schema/dist/standard-schema.d.ts +25 -0
- package/standard-schema/dist/standard-schema.js +2 -0
- package/standard-schema/dist/standard-schema.js.map +1 -0
- package/standard-schema/dist/standard-schema.mjs +2 -0
- package/standard-schema/dist/standard-schema.modern.mjs +2 -0
- package/standard-schema/dist/standard-schema.modern.mjs.map +1 -0
- package/standard-schema/dist/standard-schema.module.js +2 -0
- package/standard-schema/dist/standard-schema.module.js.map +1 -0
- package/standard-schema/dist/standard-schema.umd.js +2 -0
- package/standard-schema/dist/standard-schema.umd.js.map +1 -0
- package/standard-schema/package.json +18 -0
- package/standard-schema/src/__tests__/Form-native-validation.tsx +82 -0
- package/standard-schema/src/__tests__/Form.tsx +82 -0
- package/standard-schema/src/__tests__/__fixtures__/data.ts +88 -0
- package/standard-schema/src/__tests__/__snapshots__/standard-schema.ts.snap +250 -0
- package/standard-schema/src/__tests__/standard-schema.ts +56 -0
- package/standard-schema/src/index.ts +1 -0
- package/standard-schema/src/standard-schema.ts +88 -0
- package/superstruct/dist/index.d.ts +0 -1
- package/superstruct/dist/superstruct.d.ts +22 -2
- package/superstruct/dist/superstruct.js +1 -1
- package/superstruct/dist/superstruct.js.map +1 -1
- package/superstruct/dist/superstruct.mjs +1 -1
- package/superstruct/dist/superstruct.modern.mjs +1 -1
- package/superstruct/dist/superstruct.modern.mjs.map +1 -1
- package/superstruct/dist/superstruct.module.js +1 -1
- package/superstruct/dist/superstruct.module.js.map +1 -1
- package/superstruct/dist/superstruct.umd.js +1 -1
- package/superstruct/dist/superstruct.umd.js.map +1 -1
- package/superstruct/src/__tests__/Form.tsx +26 -0
- package/superstruct/src/__tests__/__fixtures__/data.ts +1 -1
- package/superstruct/src/index.ts +0 -1
- package/superstruct/src/superstruct.ts +32 -10
- package/typanion/dist/index.d.ts +0 -1
- package/typanion/dist/typanion.d.ts +18 -2
- package/typanion/dist/typanion.js.map +1 -1
- package/typanion/dist/typanion.mjs +1 -1
- package/typanion/dist/typanion.modern.mjs +1 -1
- package/typanion/dist/typanion.modern.mjs.map +1 -1
- package/typanion/dist/typanion.module.js +1 -1
- package/typanion/dist/typanion.module.js.map +1 -1
- package/typanion/dist/typanion.umd.js.map +1 -1
- package/typanion/src/__tests__/Form-native-validation.tsx +6 -14
- package/typanion/src/__tests__/Form.tsx +32 -8
- package/typanion/src/__tests__/__fixtures__/data.ts +9 -9
- package/typanion/src/__tests__/typanion.ts +3 -3
- package/typanion/src/index.ts +0 -1
- package/typanion/src/typanion.ts +32 -9
- package/typebox/dist/index.d.ts +0 -1
- package/typebox/dist/typebox.d.ts +20 -2
- package/typebox/dist/typebox.js +1 -1
- package/typebox/dist/typebox.js.map +1 -1
- package/typebox/dist/typebox.mjs +1 -1
- package/typebox/dist/typebox.modern.mjs +1 -1
- package/typebox/dist/typebox.modern.mjs.map +1 -1
- package/typebox/dist/typebox.module.js +1 -1
- package/typebox/dist/typebox.module.js.map +1 -1
- package/typebox/dist/typebox.umd.js +1 -1
- package/typebox/dist/typebox.umd.js.map +1 -1
- package/typebox/src/__tests__/Form-compiler.tsx +4 -8
- package/typebox/src/__tests__/Form.tsx +32 -6
- package/typebox/src/__tests__/__fixtures__/data.ts +1 -1
- package/typebox/src/__tests__/__snapshots__/typebox-compiler.ts.snap +21 -21
- package/typebox/src/__tests__/__snapshots__/typebox.ts.snap +21 -21
- package/typebox/src/index.ts +0 -1
- package/typebox/src/typebox.ts +33 -7
- package/typeschema/dist/typeschema.d.ts +17 -0
- package/typeschema/dist/typeschema.js +1 -1
- package/typeschema/dist/typeschema.js.map +1 -1
- package/typeschema/dist/typeschema.mjs +1 -1
- package/typeschema/dist/typeschema.modern.mjs +1 -1
- package/typeschema/dist/typeschema.modern.mjs.map +1 -1
- package/typeschema/dist/typeschema.module.js +1 -1
- package/typeschema/dist/typeschema.module.js.map +1 -1
- package/typeschema/dist/typeschema.umd.js +1 -1
- package/typeschema/dist/typeschema.umd.js.map +1 -1
- package/typeschema/src/typeschema.ts +20 -1
- package/valibot/dist/index.d.ts +0 -1
- package/valibot/dist/valibot.d.ts +31 -2
- package/valibot/dist/valibot.js +1 -1
- package/valibot/dist/valibot.js.map +1 -1
- package/valibot/dist/valibot.mjs +1 -1
- package/valibot/dist/valibot.modern.mjs +1 -1
- package/valibot/dist/valibot.modern.mjs.map +1 -1
- package/valibot/dist/valibot.module.js +1 -1
- package/valibot/dist/valibot.module.js.map +1 -1
- package/valibot/dist/valibot.umd.js +1 -1
- package/valibot/dist/valibot.umd.js.map +1 -1
- package/valibot/package.json +1 -1
- package/valibot/src/__tests__/Form.tsx +26 -0
- package/valibot/src/__tests__/__fixtures__/data.ts +7 -3
- package/valibot/src/__tests__/valibot.ts +1 -1
- package/valibot/src/index.ts +0 -1
- package/valibot/src/valibot.ts +55 -6
- package/vest/dist/vest.d.ts +18 -0
- package/vest/dist/vest.js.map +1 -1
- package/vest/dist/vest.modern.mjs.map +1 -1
- package/vest/dist/vest.module.js.map +1 -1
- package/vest/dist/vest.umd.js.map +1 -1
- package/vest/src/vest.ts +18 -0
- package/vine/dist/index.d.ts +0 -1
- package/vine/dist/vine.d.ts +25 -2
- package/vine/dist/vine.js +1 -1
- package/vine/dist/vine.js.map +1 -1
- package/vine/dist/vine.mjs +1 -1
- package/vine/dist/vine.modern.mjs +1 -1
- package/vine/dist/vine.modern.mjs.map +1 -1
- package/vine/dist/vine.module.js +1 -1
- package/vine/dist/vine.module.js.map +1 -1
- package/vine/dist/vine.umd.js +1 -1
- package/vine/dist/vine.umd.js.map +1 -1
- package/vine/src/__tests__/Form-native-validation.tsx +2 -4
- package/vine/src/__tests__/Form.tsx +30 -6
- package/vine/src/__tests__/__fixtures__/data.ts +1 -1
- package/vine/src/index.ts +0 -1
- package/vine/src/vine.ts +38 -10
- package/yup/dist/yup.d.ts +18 -7
- package/yup/dist/yup.js +1 -1
- package/yup/dist/yup.js.map +1 -1
- package/yup/dist/yup.mjs +1 -1
- package/yup/dist/yup.modern.mjs +1 -1
- package/yup/dist/yup.modern.mjs.map +1 -1
- package/yup/dist/yup.module.js +1 -1
- package/yup/dist/yup.module.js.map +1 -1
- package/yup/dist/yup.umd.js +1 -1
- package/yup/dist/yup.umd.js.map +1 -1
- package/yup/src/yup.ts +22 -11
- package/zod/dist/index.d.ts +0 -1
- package/zod/dist/zod.d.ts +25 -2
- 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/__tests__/Form.tsx +30 -6
- package/zod/src/__tests__/__fixtures__/data.ts +3 -3
- package/zod/src/index.ts +0 -1
- package/zod/src/zod.ts +40 -9
- package/arktype/dist/types.d.ts +0 -9
- package/arktype/src/types.ts +0 -18
- package/class-validator/dist/types.d.ts +0 -12
- package/class-validator/src/types.ts +0 -16
- package/computed-types/dist/types.d.ts +0 -2
- package/computed-types/src/types.ts +0 -13
- package/effect-ts/dist/types.d.ts +0 -4
- package/effect-ts/src/types.ts +0 -12
- package/io-ts/dist/types.d.ts +0 -7
- package/io-ts/src/types.ts +0 -18
- package/superstruct/dist/types.d.ts +0 -11
- package/superstruct/src/types.ts +0 -20
- package/typanion/dist/types.d.ts +0 -9
- package/typanion/src/types.ts +0 -20
- package/typebox/dist/types.d.ts +0 -4
- package/typebox/src/types.ts +0 -11
- package/valibot/dist/types.d.ts +0 -13
- package/valibot/src/types.ts +0 -34
- package/vine/dist/types.d.ts +0 -6
- package/vine/src/types.ts +0 -13
- package/zod/dist/types.d.ts +0 -13
- package/zod/src/types.ts +0 -22
package/README.md
CHANGED
|
@@ -16,13 +16,48 @@
|
|
|
16
16
|
|
|
17
17
|
</div>
|
|
18
18
|
|
|
19
|
+
## React Hook Form Resolvers
|
|
20
|
+
|
|
21
|
+
This function allows you to use any external validation library such as Yup, Zod, Joi, Vest, Ajv and many others. The goal is to make sure you can seamlessly integrate whichever validation library you prefer. If you're not using a library, you can always write your own logic to validate your forms.
|
|
22
|
+
|
|
19
23
|
## Install
|
|
20
24
|
|
|
21
|
-
|
|
25
|
+
Install your preferred validation library alongside `@hookform/resolvers`.
|
|
26
|
+
|
|
27
|
+
npm install @hookform/resolvers # npm
|
|
28
|
+
yarn add @hookform/resolvers # yarn
|
|
29
|
+
pnpm install @hookform/resolvers # pnpm
|
|
30
|
+
bun install @hookform/resolvers # bun
|
|
31
|
+
|
|
32
|
+
<details>
|
|
33
|
+
<summary>Resolver Comparison</summary>
|
|
34
|
+
|
|
35
|
+
| resolver | Infer values <br /> from schema | [criteriaMode](https://react-hook-form.com/docs/useform#criteriaMode) |
|
|
36
|
+
|---|---|---|
|
|
37
|
+
| AJV | ❌ | `firstError | all` |
|
|
38
|
+
| Arktype | ✅ | `firstError` |
|
|
39
|
+
| class-validator | ✅ | `firstError | all` |
|
|
40
|
+
| computed-types | ✅ | `firstError` |
|
|
41
|
+
| Effect | ✅ | `firstError | all` |
|
|
42
|
+
| fluentvalidation-ts | ❌ | `firstError` |
|
|
43
|
+
| io-ts | ✅ | `firstError` |
|
|
44
|
+
| joi | ❌ | `firstError | all` |
|
|
45
|
+
| Nope | ❌ | `firstError` |
|
|
46
|
+
| Standard Schema | ✅ | `firstError | all` |
|
|
47
|
+
| Superstruct | ✅ | `firstError` |
|
|
48
|
+
| typanion | ✅ | `firstError` |
|
|
49
|
+
| typebox | ✅ | `firstError | all` |
|
|
50
|
+
| typeschema | ❌ | `firstError | all` |
|
|
51
|
+
| valibot | ✅ | `firstError | all` |
|
|
52
|
+
| vest | ❌ | `firstError | all` |
|
|
53
|
+
| vine | ✅ | `firstError | all` |
|
|
54
|
+
| yup | ✅ | `firstError | all` |
|
|
55
|
+
| zod | ✅ | `firstError | all` |
|
|
56
|
+
</details>
|
|
22
57
|
|
|
23
58
|
## Links
|
|
24
59
|
|
|
25
|
-
- [React-hook-form validation resolver documentation ](https://react-hook-form.com/
|
|
60
|
+
- [React-hook-form validation resolver documentation ](https://react-hook-form.com/docs/useform#resolver)
|
|
26
61
|
|
|
27
62
|
### Supported resolvers
|
|
28
63
|
|
|
@@ -51,6 +86,7 @@
|
|
|
51
86
|
- [effect-ts](#effect-ts)
|
|
52
87
|
- [VineJS](#vinejs)
|
|
53
88
|
- [fluentvalidation-ts](#fluentvalidation-ts)
|
|
89
|
+
- [standard-schema](#standard-schema)
|
|
54
90
|
- [Backers](#backers)
|
|
55
91
|
- [Sponsors](#sponsors)
|
|
56
92
|
- [Contributors](#contributors)
|
|
@@ -119,7 +155,7 @@ TypeScript-first schema validation with static type inference
|
|
|
119
155
|
```tsx
|
|
120
156
|
import { useForm } from 'react-hook-form';
|
|
121
157
|
import { zodResolver } from '@hookform/resolvers/zod';
|
|
122
|
-
import
|
|
158
|
+
import { z } from 'zod';
|
|
123
159
|
|
|
124
160
|
const schema = z.object({
|
|
125
161
|
name: z.string().min(1, { message: 'Required' }),
|
|
@@ -626,7 +662,7 @@ Universal adapter for schema validation, compatible with [any validation library
|
|
|
626
662
|
```typescript jsx
|
|
627
663
|
import { useForm } from 'react-hook-form';
|
|
628
664
|
import { typeschemaResolver } from '@hookform/resolvers/typeschema';
|
|
629
|
-
import
|
|
665
|
+
import { z } from 'zod';
|
|
630
666
|
|
|
631
667
|
// Use your favorite validation library
|
|
632
668
|
const schema = z.object({
|
|
@@ -663,10 +699,10 @@ import { Schema } from 'effect';
|
|
|
663
699
|
|
|
664
700
|
const schema = Schema.Struct({
|
|
665
701
|
username: Schema.String.pipe(
|
|
666
|
-
Schema.
|
|
702
|
+
Schema.nonEmptyString({ message: () => 'username required' }),
|
|
667
703
|
),
|
|
668
704
|
password: Schema.String.pipe(
|
|
669
|
-
Schema.
|
|
705
|
+
Schema.nonEmptyString({ message: () => 'password required' }),
|
|
670
706
|
),
|
|
671
707
|
});
|
|
672
708
|
|
|
@@ -777,6 +813,72 @@ const App = () => {
|
|
|
777
813
|
};
|
|
778
814
|
```
|
|
779
815
|
|
|
816
|
+
### [standard-schema](https://github.com/standard-schema/standard-schema)
|
|
817
|
+
|
|
818
|
+
A standard interface for TypeScript schema validation libraries
|
|
819
|
+
|
|
820
|
+
[](https://bundlephobia.com/result?p=@standard-schema/spec)
|
|
821
|
+
|
|
822
|
+
Example zod
|
|
823
|
+
|
|
824
|
+
```typescript jsx
|
|
825
|
+
import { useForm } from 'react-hook-form';
|
|
826
|
+
import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';
|
|
827
|
+
import { z } from 'zod';
|
|
828
|
+
|
|
829
|
+
const schema = z.object({
|
|
830
|
+
name: z.string().min(1, { message: 'Required' }),
|
|
831
|
+
age: z.number().min(10),
|
|
832
|
+
});
|
|
833
|
+
|
|
834
|
+
const App = () => {
|
|
835
|
+
const {
|
|
836
|
+
register,
|
|
837
|
+
handleSubmit,
|
|
838
|
+
formState: { errors },
|
|
839
|
+
} = useForm({
|
|
840
|
+
resolver: standardSchemaResolver(schema),
|
|
841
|
+
});
|
|
842
|
+
|
|
843
|
+
return (
|
|
844
|
+
<form onSubmit={handleSubmit((d) => console.log(d))}>
|
|
845
|
+
<input {...register('name')} />
|
|
846
|
+
{errors.name?.message && <p>{errors.name?.message}</p>}
|
|
847
|
+
<input type="number" {...register('age', { valueAsNumber: true })} />
|
|
848
|
+
{errors.age?.message && <p>{errors.age?.message}</p>}
|
|
849
|
+
<input type="submit" />
|
|
850
|
+
</form>
|
|
851
|
+
);
|
|
852
|
+
};
|
|
853
|
+
```
|
|
854
|
+
|
|
855
|
+
Example arkType
|
|
856
|
+
|
|
857
|
+
```typescript jsx
|
|
858
|
+
import { useForm } from 'react-hook-form';
|
|
859
|
+
import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';
|
|
860
|
+
import { type } from 'arktype';
|
|
861
|
+
|
|
862
|
+
const schema = type({
|
|
863
|
+
username: 'string>1',
|
|
864
|
+
password: 'string>1',
|
|
865
|
+
});
|
|
866
|
+
|
|
867
|
+
const App = () => {
|
|
868
|
+
const { register, handleSubmit } = useForm({
|
|
869
|
+
resolver: standardSchemaResolver(schema),
|
|
870
|
+
});
|
|
871
|
+
|
|
872
|
+
return (
|
|
873
|
+
<form onSubmit={handleSubmit((d) => console.log(d))}>
|
|
874
|
+
<input {...register('username')} />
|
|
875
|
+
<input type="password" {...register('password')} />
|
|
876
|
+
<input type="submit" />
|
|
877
|
+
</form>
|
|
878
|
+
);
|
|
879
|
+
};
|
|
880
|
+
```
|
|
881
|
+
|
|
780
882
|
## Backers
|
|
781
883
|
|
|
782
884
|
Thanks go to all our backers! [[Become a backer](https://opencollective.com/react-hook-form#backer)].
|
package/ajv/dist/ajv.d.ts
CHANGED
|
@@ -1,2 +1,22 @@
|
|
|
1
1
|
import { Resolver } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a resolver for react-hook-form using Ajv schema validation
|
|
4
|
+
* @param {Schema} schema - The Ajv schema to validate against
|
|
5
|
+
* @param {Object} schemaOptions - Additional schema validation options
|
|
6
|
+
* @param {Object} resolverOptions - Additional resolver configuration
|
|
7
|
+
* @param {string} [resolverOptions.mode='async'] - Validation mode
|
|
8
|
+
* @returns {Resolver<Schema>} A resolver function compatible with react-hook-form
|
|
9
|
+
* @example
|
|
10
|
+
* const schema = ajv.compile({
|
|
11
|
+
* type: 'object',
|
|
12
|
+
* properties: {
|
|
13
|
+
* name: { type: 'string' },
|
|
14
|
+
* age: { type: 'number' }
|
|
15
|
+
* }
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* useForm({
|
|
19
|
+
* resolver: ajvResolver(schema)
|
|
20
|
+
* });
|
|
21
|
+
*/
|
|
2
22
|
export declare const ajvResolver: Resolver;
|
package/ajv/dist/ajv.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=require("@hookform/resolvers"),r=require("ajv"),a=require("ajv-errors"),s=require("react-hook-form");function
|
|
1
|
+
var e=require("@hookform/resolvers"),r=require("ajv"),a=require("ajv-errors"),s=require("react-hook-form");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=/*#__PURE__*/o(r),i=/*#__PURE__*/o(a),n=function(e,r){for(var a={},o=function(e){"required"===e.keyword&&(e.instancePath+="/"+e.params.missingProperty);var o=e.instancePath.substring(1).replace(/\//g,".");if(a[o]||(a[o]={message:e.message,type:e.keyword}),r){var t=a[o].types,i=t&&t[e.keyword];a[o]=s.appendErrors(o,r,a,e.keyword,i?[].concat(i,e.message||""):e.message)}},t=function(){var r=e[i];"errorMessage"===r.keyword?r.params.errors.forEach(function(e){e.message=r.message,o(e)}):o(r)},i=0;i<e.length;i+=1)t();return a};exports.ajvResolver=function(r,a,s){return void 0===s&&(s={}),function(o,u,c){try{var l=new t.default(Object.assign({},{allErrors:!0,validateSchema:!0},a));i.default(l);var v=l.compile(Object.assign({$async:s&&"async"===s.mode},r)),d=v(o);return c.shouldUseNativeValidation&&e.validateFieldsNatively({},c),Promise.resolve(d?{values:o,errors:{}}:{values:{},errors:e.toNestErrors(n(v.errors,!c.shouldUseNativeValidation&&"all"===c.criteriaMode),c)})}catch(e){return Promise.reject(e)}}};
|
|
2
2
|
//# sourceMappingURL=ajv.js.map
|
package/ajv/dist/ajv.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ajv.js","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors:
|
|
1
|
+
{"version":3,"file":"ajv.js","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n const parsedErrors: Record<string, FieldError> = {};\n\n const reduceError = (error: AjvError) => {\n // Ajv will return empty instancePath when require error\n if (error.keyword === 'required') {\n error.instancePath += `/${error.params.missingProperty}`;\n }\n\n // `/deepObject/data` -> `deepObject.data`\n const path = error.instancePath.substring(1).replace(/\\//g, '.');\n\n if (!parsedErrors[path]) {\n parsedErrors[path] = {\n message: error.message,\n type: error.keyword,\n };\n }\n\n if (validateAllFieldCriteria) {\n const types = parsedErrors[path].types;\n const messages = types && types[error.keyword];\n\n parsedErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n parsedErrors,\n error.keyword,\n messages\n ? ([] as string[]).concat(messages as string[], error.message || '')\n : error.message,\n ) as FieldError;\n }\n };\n\n for (let index = 0; index < ajvErrors.length; index += 1) {\n const error = ajvErrors[index];\n\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((originalError) => {\n originalError.message = error.message;\n reduceError(originalError);\n });\n } else {\n reduceError(error);\n }\n }\n\n return parsedErrors;\n};\n\n/**\n * Creates a resolver for react-hook-form using Ajv schema validation\n * @param {Schema} schema - The Ajv schema to validate against\n * @param {Object} schemaOptions - Additional schema validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {string} [resolverOptions.mode='async'] - Validation mode\n * @returns {Resolver<Schema>} A resolver function compatible with react-hook-form\n * @example\n * const schema = ajv.compile({\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * age: { type: 'number' }\n * }\n * });\n *\n * useForm({\n * resolver: ajvResolver(schema)\n * });\n */\nexport const ajvResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n const ajv = new Ajv(\n Object.assign(\n {},\n {\n allErrors: true,\n validateSchema: true,\n },\n schemaOptions,\n ),\n );\n\n ajvErrors(ajv);\n\n const validate = ajv.compile(\n Object.assign(\n { $async: resolverOptions && resolverOptions.mode === 'async' },\n schema,\n ),\n );\n\n const valid = validate(values);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return valid\n ? { values, errors: {} }\n : {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n validate.errors as DefinedError[],\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n };\n"],"names":["parseErrorSchema","ajvErrors","validateAllFieldCriteria","parsedErrors","reduceError","error","keyword","instancePath","params","missingProperty","path","substring","replace","message","type","types","messages","appendErrors","concat","_loop","index","errors","forEach","originalError","length","schema","schemaOptions","resolverOptions","values","_","options","ajv","Ajv","Object","assign","allErrors","validateSchema","validate","compile","$async","mode","valid","shouldUseNativeValidation","validateFieldsNatively","Promise","resolve","toNestErrors","criteriaMode","e","reject"],"mappings":"+NAMMA,EAAmB,SACvBC,EACAC,GAoCA,IAlCA,IAAMC,EAA2C,GAE3CC,EAAc,SAACC,GAEG,aAAlBA,EAAMC,UACRD,EAAME,cAAY,IAAQF,EAAMG,OAAOC,iBAIzC,IAAMC,EAAOL,EAAME,aAAaI,UAAU,GAAGC,QAAQ,MAAO,KAS5D,GAPKT,EAAaO,KAChBP,EAAaO,GAAQ,CACnBG,QAASR,EAAMQ,QACfC,KAAMT,EAAMC,UAIZJ,EAA0B,CAC5B,IAAMa,EAAQZ,EAAaO,GAAMK,MAC3BC,EAAWD,GAASA,EAAMV,EAAMC,SAEtCH,EAAaO,GAAQO,EAAYA,aAC/BP,EACAR,EACAC,EACAE,EAAMC,QACNU,EACK,GAAgBE,OAAOF,EAAsBX,EAAMQ,SAAW,IAC/DR,EAAMQ,QAEd,CACF,EAAEM,EAAA,WAGA,IAAMd,EAAQJ,EAAUmB,GAEF,iBAAlBf,EAAMC,QACRD,EAAMG,OAAOa,OAAOC,QAAQ,SAACC,GAC3BA,EAAcV,QAAUR,EAAMQ,QAC9BT,EAAYmB,EACd,GAEAnB,EAAYC,EAEhB,EAXSe,EAAQ,EAAGA,EAAQnB,EAAUuB,OAAQJ,GAAS,EAACD,IAaxD,OAAOhB,CACT,sBAuBE,SAACsB,EAAQC,EAAeC,GAAoB,YAAL,IAAfA,IAAAA,EAAkB,IAAE,SACrCC,EAAQC,EAAGC,GAAW,IAC3B,IAAMC,EAAM,IAAIC,EAAG,QACjBC,OAAOC,OACL,GACA,CACEC,WAAW,EACXC,gBAAgB,GAElBV,IAIJzB,UAAU8B,GAEV,IAAMM,EAAWN,EAAIO,QACnBL,OAAOC,OACL,CAAEK,OAAQZ,GAA4C,UAAzBA,EAAgBa,MAC7Cf,IAIEgB,EAAQJ,EAAST,GAIvB,OAFAE,EAAQY,2BAA6BC,EAAAA,uBAAuB,CAAA,EAAIb,GAEhEc,QAAAC,QAAOJ,EACH,CAAEb,OAAAA,EAAQP,OAAQ,IAClB,CACEO,OAAQ,CAAE,EACVP,OAAQyB,eACN9C,EACEqC,EAAShB,QACRS,EAAQY,2BACkB,QAAzBZ,EAAQiB,cAEZjB,IAGV,CAAC,MAAAkB,UAAAJ,QAAAK,OAAAD,EAAA,CAAA,CAAA"}
|
package/ajv/dist/ajv.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import o from"ajv";import a from"ajv-errors";import{appendErrors as s}from"react-hook-form";var t=function(r,e){
|
|
1
|
+
import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import o from"ajv";import a from"ajv-errors";import{appendErrors as s}from"react-hook-form";var t=function(r,e){for(var o={},a=function(r){"required"===r.keyword&&(r.instancePath+="/"+r.params.missingProperty);var a=r.instancePath.substring(1).replace(/\//g,".");if(o[a]||(o[a]={message:r.message,type:r.keyword}),e){var t=o[a].types,i=t&&t[r.keyword];o[a]=s(a,e,o,r.keyword,i?[].concat(i,r.message||""):r.message)}},t=function(){var e=r[i];"errorMessage"===e.keyword?e.params.errors.forEach(function(r){r.message=e.message,a(r)}):a(e)},i=0;i<r.length;i+=1)t();return o},i=function(s,i,n){return void 0===n&&(n={}),function(m,c,v){try{var l=new o(Object.assign({},{allErrors:!0,validateSchema:!0},i));a(l);var u=l.compile(Object.assign({$async:n&&"async"===n.mode},s)),f=u(m);return v.shouldUseNativeValidation&&r({},v),Promise.resolve(f?{values:m,errors:{}}:{values:{},errors:e(t(u.errors,!v.shouldUseNativeValidation&&"all"===v.criteriaMode),v)})}catch(r){return Promise.reject(r)}}};export{i as ajvResolver};
|
|
2
2
|
//# sourceMappingURL=ajv.module.js.map
|
package/ajv/dist/ajv.modern.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{validateFieldsNatively as e,toNestErrors as r}from"@hookform/resolvers";import s from"ajv";import o from"ajv-errors";import{appendErrors as a}from"react-hook-form";const t=(e,r)=>
|
|
1
|
+
import{validateFieldsNatively as e,toNestErrors as r}from"@hookform/resolvers";import s from"ajv";import o from"ajv-errors";import{appendErrors as a}from"react-hook-form";const t=(e,r)=>{const s={},o=e=>{"required"===e.keyword&&(e.instancePath+=`/${e.params.missingProperty}`);const o=e.instancePath.substring(1).replace(/\//g,".");if(s[o]||(s[o]={message:e.message,type:e.keyword}),r){const t=s[o].types,n=t&&t[e.keyword];s[o]=a(o,r,s,e.keyword,n?[].concat(n,e.message||""):e.message)}};for(let r=0;r<e.length;r+=1){const s=e[r];"errorMessage"===s.keyword?s.params.errors.forEach(e=>{e.message=s.message,o(e)}):o(s)}return s},n=(a,n,i={})=>async(c,m,l)=>{const d=new s(Object.assign({},{allErrors:!0,validateSchema:!0},n));o(d);const g=d.compile(Object.assign({$async:i&&"async"===i.mode},a)),p=g(c);return l.shouldUseNativeValidation&&e({},l),p?{values:c,errors:{}}:{values:{},errors:r(t(g.errors,!l.shouldUseNativeValidation&&"all"===l.criteriaMode),l)}};export{n as ajvResolver};
|
|
2
2
|
//# sourceMappingURL=ajv.modern.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ajv.modern.mjs","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors:
|
|
1
|
+
{"version":3,"file":"ajv.modern.mjs","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n const parsedErrors: Record<string, FieldError> = {};\n\n const reduceError = (error: AjvError) => {\n // Ajv will return empty instancePath when require error\n if (error.keyword === 'required') {\n error.instancePath += `/${error.params.missingProperty}`;\n }\n\n // `/deepObject/data` -> `deepObject.data`\n const path = error.instancePath.substring(1).replace(/\\//g, '.');\n\n if (!parsedErrors[path]) {\n parsedErrors[path] = {\n message: error.message,\n type: error.keyword,\n };\n }\n\n if (validateAllFieldCriteria) {\n const types = parsedErrors[path].types;\n const messages = types && types[error.keyword];\n\n parsedErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n parsedErrors,\n error.keyword,\n messages\n ? ([] as string[]).concat(messages as string[], error.message || '')\n : error.message,\n ) as FieldError;\n }\n };\n\n for (let index = 0; index < ajvErrors.length; index += 1) {\n const error = ajvErrors[index];\n\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((originalError) => {\n originalError.message = error.message;\n reduceError(originalError);\n });\n } else {\n reduceError(error);\n }\n }\n\n return parsedErrors;\n};\n\n/**\n * Creates a resolver for react-hook-form using Ajv schema validation\n * @param {Schema} schema - The Ajv schema to validate against\n * @param {Object} schemaOptions - Additional schema validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {string} [resolverOptions.mode='async'] - Validation mode\n * @returns {Resolver<Schema>} A resolver function compatible with react-hook-form\n * @example\n * const schema = ajv.compile({\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * age: { type: 'number' }\n * }\n * });\n *\n * useForm({\n * resolver: ajvResolver(schema)\n * });\n */\nexport const ajvResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n const ajv = new Ajv(\n Object.assign(\n {},\n {\n allErrors: true,\n validateSchema: true,\n },\n schemaOptions,\n ),\n );\n\n ajvErrors(ajv);\n\n const validate = ajv.compile(\n Object.assign(\n { $async: resolverOptions && resolverOptions.mode === 'async' },\n schema,\n ),\n );\n\n const valid = validate(values);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return valid\n ? { values, errors: {} }\n : {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n validate.errors as DefinedError[],\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n };\n"],"names":["parseErrorSchema","ajvErrors","validateAllFieldCriteria","parsedErrors","reduceError","error","keyword","instancePath","params","missingProperty","path","substring","replace","message","type","types","messages","appendErrors","concat","index","length","errors","forEach","originalError","ajvResolver","schema","schemaOptions","resolverOptions","async","values","_","options","ajv","Ajv","Object","assign","allErrors","validateSchema","validate","compile","$async","mode","valid","shouldUseNativeValidation","validateFieldsNatively","toNestErrors","criteriaMode"],"mappings":"2KAMA,MAAMA,EAAmBA,CACvBC,EACAC,KAEA,MAAMC,EAA2C,GAE3CC,EAAeC,IAEG,aAAlBA,EAAMC,UACRD,EAAME,cAAgB,IAAIF,EAAMG,OAAOC,mBAIzC,MAAMC,EAAOL,EAAME,aAAaI,UAAU,GAAGC,QAAQ,MAAO,KAS5D,GAPKT,EAAaO,KAChBP,EAAaO,GAAQ,CACnBG,QAASR,EAAMQ,QACfC,KAAMT,EAAMC,UAIZJ,EAA0B,CAC5B,MAAMa,EAAQZ,EAAaO,GAAMK,MAC3BC,EAAWD,GAASA,EAAMV,EAAMC,SAEtCH,EAAaO,GAAQO,EACnBP,EACAR,EACAC,EACAE,EAAMC,QACNU,EACK,GAAgBE,OAAOF,EAAsBX,EAAMQ,SAAW,IAC/DR,EAAMQ,QAEd,GAGF,IAAK,IAAIM,EAAQ,EAAGA,EAAQlB,EAAUmB,OAAQD,GAAS,EAAG,CACxD,MAAMd,EAAQJ,EAAUkB,GAEF,iBAAlBd,EAAMC,QACRD,EAAMG,OAAOa,OAAOC,QAASC,IAC3BA,EAAcV,QAAUR,EAAMQ,QAC9BT,EAAYmB,EACd,GAEAnB,EAAYC,EAEhB,CAEA,OAAOF,GAuBIqB,EACXA,CAACC,EAAQC,EAAeC,EAAkB,CAAE,IAC5CC,MAAOC,EAAQC,EAAGC,KAChB,MAAMC,EAAM,IAAIC,EACdC,OAAOC,OACL,CAAE,EACF,CACEC,WAAW,EACXC,gBAAgB,GAElBX,IAIJzB,EAAU+B,GAEV,MAAMM,EAAWN,EAAIO,QACnBL,OAAOC,OACL,CAAEK,OAAQb,GAA4C,UAAzBA,EAAgBc,MAC7ChB,IAIEiB,EAAQJ,EAAST,GAIvB,OAFAE,EAAQY,2BAA6BC,EAAuB,CAAA,EAAIb,GAEzDW,EACH,CAAEb,SAAQR,OAAQ,CAAI,GACtB,CACEQ,OAAQ,CAAE,EACVR,OAAQwB,EACN7C,EACEsC,EAASjB,QACRU,EAAQY,2BACkB,QAAzBZ,EAAQe,cAEZf"}
|
package/ajv/dist/ajv.module.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import o from"ajv";import a from"ajv-errors";import{appendErrors as s}from"react-hook-form";var t=function(r,e){
|
|
1
|
+
import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import o from"ajv";import a from"ajv-errors";import{appendErrors as s}from"react-hook-form";var t=function(r,e){for(var o={},a=function(r){"required"===r.keyword&&(r.instancePath+="/"+r.params.missingProperty);var a=r.instancePath.substring(1).replace(/\//g,".");if(o[a]||(o[a]={message:r.message,type:r.keyword}),e){var t=o[a].types,i=t&&t[r.keyword];o[a]=s(a,e,o,r.keyword,i?[].concat(i,r.message||""):r.message)}},t=function(){var e=r[i];"errorMessage"===e.keyword?e.params.errors.forEach(function(r){r.message=e.message,a(r)}):a(e)},i=0;i<r.length;i+=1)t();return o},i=function(s,i,n){return void 0===n&&(n={}),function(m,c,v){try{var l=new o(Object.assign({},{allErrors:!0,validateSchema:!0},i));a(l);var u=l.compile(Object.assign({$async:n&&"async"===n.mode},s)),f=u(m);return v.shouldUseNativeValidation&&r({},v),Promise.resolve(f?{values:m,errors:{}}:{values:{},errors:e(t(u.errors,!v.shouldUseNativeValidation&&"all"===v.criteriaMode),v)})}catch(r){return Promise.reject(r)}}};export{i as ajvResolver};
|
|
2
2
|
//# sourceMappingURL=ajv.module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ajv.module.js","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors:
|
|
1
|
+
{"version":3,"file":"ajv.module.js","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n const parsedErrors: Record<string, FieldError> = {};\n\n const reduceError = (error: AjvError) => {\n // Ajv will return empty instancePath when require error\n if (error.keyword === 'required') {\n error.instancePath += `/${error.params.missingProperty}`;\n }\n\n // `/deepObject/data` -> `deepObject.data`\n const path = error.instancePath.substring(1).replace(/\\//g, '.');\n\n if (!parsedErrors[path]) {\n parsedErrors[path] = {\n message: error.message,\n type: error.keyword,\n };\n }\n\n if (validateAllFieldCriteria) {\n const types = parsedErrors[path].types;\n const messages = types && types[error.keyword];\n\n parsedErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n parsedErrors,\n error.keyword,\n messages\n ? ([] as string[]).concat(messages as string[], error.message || '')\n : error.message,\n ) as FieldError;\n }\n };\n\n for (let index = 0; index < ajvErrors.length; index += 1) {\n const error = ajvErrors[index];\n\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((originalError) => {\n originalError.message = error.message;\n reduceError(originalError);\n });\n } else {\n reduceError(error);\n }\n }\n\n return parsedErrors;\n};\n\n/**\n * Creates a resolver for react-hook-form using Ajv schema validation\n * @param {Schema} schema - The Ajv schema to validate against\n * @param {Object} schemaOptions - Additional schema validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {string} [resolverOptions.mode='async'] - Validation mode\n * @returns {Resolver<Schema>} A resolver function compatible with react-hook-form\n * @example\n * const schema = ajv.compile({\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * age: { type: 'number' }\n * }\n * });\n *\n * useForm({\n * resolver: ajvResolver(schema)\n * });\n */\nexport const ajvResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n const ajv = new Ajv(\n Object.assign(\n {},\n {\n allErrors: true,\n validateSchema: true,\n },\n schemaOptions,\n ),\n );\n\n ajvErrors(ajv);\n\n const validate = ajv.compile(\n Object.assign(\n { $async: resolverOptions && resolverOptions.mode === 'async' },\n schema,\n ),\n );\n\n const valid = validate(values);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return valid\n ? { values, errors: {} }\n : {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n validate.errors as DefinedError[],\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n };\n"],"names":["parseErrorSchema","ajvErrors","validateAllFieldCriteria","parsedErrors","reduceError","error","keyword","instancePath","params","missingProperty","path","substring","replace","message","type","types","messages","appendErrors","concat","_loop","index","errors","forEach","originalError","length","ajvResolver","schema","schemaOptions","resolverOptions","values","_","options","ajv","Ajv","Object","assign","allErrors","validateSchema","validate","compile","$async","mode","valid","shouldUseNativeValidation","validateFieldsNatively","Promise","resolve","toNestErrors","criteriaMode","e","reject"],"mappings":"2KAMA,IAAMA,EAAmB,SACvBC,EACAC,GAoCA,IAlCA,IAAMC,EAA2C,GAE3CC,EAAc,SAACC,GAEG,aAAlBA,EAAMC,UACRD,EAAME,cAAY,IAAQF,EAAMG,OAAOC,iBAIzC,IAAMC,EAAOL,EAAME,aAAaI,UAAU,GAAGC,QAAQ,MAAO,KAS5D,GAPKT,EAAaO,KAChBP,EAAaO,GAAQ,CACnBG,QAASR,EAAMQ,QACfC,KAAMT,EAAMC,UAIZJ,EAA0B,CAC5B,IAAMa,EAAQZ,EAAaO,GAAMK,MAC3BC,EAAWD,GAASA,EAAMV,EAAMC,SAEtCH,EAAaO,GAAQO,EACnBP,EACAR,EACAC,EACAE,EAAMC,QACNU,EACK,GAAgBE,OAAOF,EAAsBX,EAAMQ,SAAW,IAC/DR,EAAMQ,QAEd,CACF,EAAEM,EAAA,WAGA,IAAMd,EAAQJ,EAAUmB,GAEF,iBAAlBf,EAAMC,QACRD,EAAMG,OAAOa,OAAOC,QAAQ,SAACC,GAC3BA,EAAcV,QAAUR,EAAMQ,QAC9BT,EAAYmB,EACd,GAEAnB,EAAYC,EAEhB,EAXSe,EAAQ,EAAGA,EAAQnB,EAAUuB,OAAQJ,GAAS,EAACD,IAaxD,OAAOhB,CACT,EAsBasB,EACX,SAACC,EAAQC,EAAeC,GAAoB,YAAL,IAAfA,IAAAA,EAAkB,IAAE,SACrCC,EAAQC,EAAGC,GAAW,IAC3B,IAAMC,EAAM,IAAIC,EACdC,OAAOC,OACL,GACA,CACEC,WAAW,EACXC,gBAAgB,GAElBV,IAIJ1B,EAAU+B,GAEV,IAAMM,EAAWN,EAAIO,QACnBL,OAAOC,OACL,CAAEK,OAAQZ,GAA4C,UAAzBA,EAAgBa,MAC7Cf,IAIEgB,EAAQJ,EAAST,GAIvB,OAFAE,EAAQY,2BAA6BC,EAAuB,CAAA,EAAIb,GAEhEc,QAAAC,QAAOJ,EACH,CAAEb,OAAAA,EAAQR,OAAQ,IAClB,CACEQ,OAAQ,CAAE,EACVR,OAAQ0B,EACN/C,EACEsC,EAASjB,QACRU,EAAQY,2BACkB,QAAzBZ,EAAQiB,cAEZjB,IAGV,CAAC,MAAAkB,UAAAJ,QAAAK,OAAAD,EAAA,CAAA,CAAA"}
|
package/ajv/dist/ajv.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@hookform/resolvers"),require("ajv"),require("ajv-errors"),require("react-hook-form")):"function"==typeof define&&define.amd?define(["exports","@hookform/resolvers","ajv","ajv-errors","react-hook-form"],r):r((e||self).hookformResolversAjv={},e.hookformResolvers,e.ajv,e.ajvErrors,e.ReactHookForm)}(this,function(e,r,o,a
|
|
1
|
+
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@hookform/resolvers"),require("ajv"),require("ajv-errors"),require("react-hook-form")):"function"==typeof define&&define.amd?define(["exports","@hookform/resolvers","ajv","ajv-errors","react-hook-form"],r):r((e||self).hookformResolversAjv={},e.hookformResolvers,e.ajv,e.ajvErrors,e.ReactHookForm)}(this,function(e,r,o,s,a){function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=/*#__PURE__*/t(o),i=/*#__PURE__*/t(s),f=function(e,r){for(var o={},s=function(e){"required"===e.keyword&&(e.instancePath+="/"+e.params.missingProperty);var s=e.instancePath.substring(1).replace(/\//g,".");if(o[s]||(o[s]={message:e.message,type:e.keyword}),r){var t=o[s].types,n=t&&t[e.keyword];o[s]=a.appendErrors(s,r,o,e.keyword,n?[].concat(n,e.message||""):e.message)}},t=function(){var r=e[n];"errorMessage"===r.keyword?r.params.errors.forEach(function(e){e.message=r.message,s(e)}):s(r)},n=0;n<e.length;n+=1)t();return o};e.ajvResolver=function(e,o,s){return void 0===s&&(s={}),function(a,t,l){try{var u=new n.default(Object.assign({},{allErrors:!0,validateSchema:!0},o));i.default(u);var c=u.compile(Object.assign({$async:s&&"async"===s.mode},e)),d=c(a);return l.shouldUseNativeValidation&&r.validateFieldsNatively({},l),Promise.resolve(d?{values:a,errors:{}}:{values:{},errors:r.toNestErrors(f(c.errors,!l.shouldUseNativeValidation&&"all"===l.criteriaMode),l)})}catch(e){return Promise.reject(e)}}}});
|
|
2
2
|
//# sourceMappingURL=ajv.umd.js.map
|
package/ajv/dist/ajv.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ajv.umd.js","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors:
|
|
1
|
+
{"version":3,"file":"ajv.umd.js","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n const parsedErrors: Record<string, FieldError> = {};\n\n const reduceError = (error: AjvError) => {\n // Ajv will return empty instancePath when require error\n if (error.keyword === 'required') {\n error.instancePath += `/${error.params.missingProperty}`;\n }\n\n // `/deepObject/data` -> `deepObject.data`\n const path = error.instancePath.substring(1).replace(/\\//g, '.');\n\n if (!parsedErrors[path]) {\n parsedErrors[path] = {\n message: error.message,\n type: error.keyword,\n };\n }\n\n if (validateAllFieldCriteria) {\n const types = parsedErrors[path].types;\n const messages = types && types[error.keyword];\n\n parsedErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n parsedErrors,\n error.keyword,\n messages\n ? ([] as string[]).concat(messages as string[], error.message || '')\n : error.message,\n ) as FieldError;\n }\n };\n\n for (let index = 0; index < ajvErrors.length; index += 1) {\n const error = ajvErrors[index];\n\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((originalError) => {\n originalError.message = error.message;\n reduceError(originalError);\n });\n } else {\n reduceError(error);\n }\n }\n\n return parsedErrors;\n};\n\n/**\n * Creates a resolver for react-hook-form using Ajv schema validation\n * @param {Schema} schema - The Ajv schema to validate against\n * @param {Object} schemaOptions - Additional schema validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {string} [resolverOptions.mode='async'] - Validation mode\n * @returns {Resolver<Schema>} A resolver function compatible with react-hook-form\n * @example\n * const schema = ajv.compile({\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * age: { type: 'number' }\n * }\n * });\n *\n * useForm({\n * resolver: ajvResolver(schema)\n * });\n */\nexport const ajvResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n const ajv = new Ajv(\n Object.assign(\n {},\n {\n allErrors: true,\n validateSchema: true,\n },\n schemaOptions,\n ),\n );\n\n ajvErrors(ajv);\n\n const validate = ajv.compile(\n Object.assign(\n { $async: resolverOptions && resolverOptions.mode === 'async' },\n schema,\n ),\n );\n\n const valid = validate(values);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return valid\n ? { values, errors: {} }\n : {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n validate.errors as DefinedError[],\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n };\n"],"names":["parseErrorSchema","ajvErrors","validateAllFieldCriteria","parsedErrors","reduceError","error","keyword","instancePath","params","missingProperty","path","substring","replace","message","type","types","messages","appendErrors","concat","_loop","index","errors","forEach","originalError","length","schema","schemaOptions","resolverOptions","values","_","options","ajv","Ajv","Object","assign","allErrors","validateSchema","validate","compile","$async","mode","valid","shouldUseNativeValidation","validateFieldsNatively","Promise","resolve","toNestErrors","criteriaMode","e","reject"],"mappings":"0jBAMMA,EAAmB,SACvBC,EACAC,GAoCA,IAlCA,IAAMC,EAA2C,GAE3CC,EAAc,SAACC,GAEG,aAAlBA,EAAMC,UACRD,EAAME,cAAY,IAAQF,EAAMG,OAAOC,iBAIzC,IAAMC,EAAOL,EAAME,aAAaI,UAAU,GAAGC,QAAQ,MAAO,KAS5D,GAPKT,EAAaO,KAChBP,EAAaO,GAAQ,CACnBG,QAASR,EAAMQ,QACfC,KAAMT,EAAMC,UAIZJ,EAA0B,CAC5B,IAAMa,EAAQZ,EAAaO,GAAMK,MAC3BC,EAAWD,GAASA,EAAMV,EAAMC,SAEtCH,EAAaO,GAAQO,EAAYA,aAC/BP,EACAR,EACAC,EACAE,EAAMC,QACNU,EACK,GAAgBE,OAAOF,EAAsBX,EAAMQ,SAAW,IAC/DR,EAAMQ,QAEd,CACF,EAAEM,EAAA,WAGA,IAAMd,EAAQJ,EAAUmB,GAEF,iBAAlBf,EAAMC,QACRD,EAAMG,OAAOa,OAAOC,QAAQ,SAACC,GAC3BA,EAAcV,QAAUR,EAAMQ,QAC9BT,EAAYmB,EACd,GAEAnB,EAAYC,EAEhB,EAXSe,EAAQ,EAAGA,EAAQnB,EAAUuB,OAAQJ,GAAS,EAACD,IAaxD,OAAOhB,CACT,gBAuBE,SAACsB,EAAQC,EAAeC,GAAoB,YAAL,IAAfA,IAAAA,EAAkB,IAAE,SACrCC,EAAQC,EAAGC,GAAW,IAC3B,IAAMC,EAAM,IAAIC,EAAG,QACjBC,OAAOC,OACL,GACA,CACEC,WAAW,EACXC,gBAAgB,GAElBV,IAIJzB,UAAU8B,GAEV,IAAMM,EAAWN,EAAIO,QACnBL,OAAOC,OACL,CAAEK,OAAQZ,GAA4C,UAAzBA,EAAgBa,MAC7Cf,IAIEgB,EAAQJ,EAAST,GAIvB,OAFAE,EAAQY,2BAA6BC,EAAAA,uBAAuB,CAAA,EAAIb,GAEhEc,QAAAC,QAAOJ,EACH,CAAEb,OAAAA,EAAQP,OAAQ,IAClB,CACEO,OAAQ,CAAE,EACVP,OAAQyB,eACN9C,EACEqC,EAAShB,QACRS,EAAQY,2BACkB,QAAzBZ,EAAQiB,cAEZjB,IAGV,CAAC,MAAAkB,UAAAJ,QAAAK,OAAAD,EAAA,CAAA,CAAA"}
|
package/ajv/dist/types.d.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import * as Ajv from 'ajv';
|
|
2
|
+
import type { DefinedError, ErrorObject } from 'ajv';
|
|
2
3
|
import { FieldValues, ResolverOptions, ResolverResult } from 'react-hook-form';
|
|
3
4
|
export type Resolver = <T>(schema: Ajv.JSONSchemaType<T>, schemaOptions?: Ajv.Options, factoryOptions?: {
|
|
4
5
|
mode?: 'async' | 'sync';
|
|
5
6
|
}) => <TFieldValues extends FieldValues, TContext>(values: TFieldValues, context: TContext | undefined, options: ResolverOptions<TFieldValues>) => Promise<ResolverResult<TFieldValues>>;
|
|
7
|
+
type ErrorMessage = ErrorObject<'errorMessage', {
|
|
8
|
+
errors: (DefinedError & {
|
|
9
|
+
emUsed: boolean;
|
|
10
|
+
})[];
|
|
11
|
+
}>;
|
|
12
|
+
export type AjvError = ErrorMessage | DefinedError;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { JSONSchemaType } from 'ajv';
|
|
2
|
+
import { Field, InternalFieldName } from 'react-hook-form';
|
|
3
|
+
|
|
4
|
+
interface DataA {
|
|
5
|
+
username: string;
|
|
6
|
+
password: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const schemaA: JSONSchemaType<DataA> = {
|
|
10
|
+
type: 'object',
|
|
11
|
+
properties: {
|
|
12
|
+
username: {
|
|
13
|
+
type: 'string',
|
|
14
|
+
minLength: 3,
|
|
15
|
+
errorMessage: {
|
|
16
|
+
minLength: 'username should be at least three characters long',
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
password: {
|
|
20
|
+
type: 'string',
|
|
21
|
+
pattern: '.*[A-Z].*',
|
|
22
|
+
minLength: 8,
|
|
23
|
+
errorMessage: {
|
|
24
|
+
pattern: 'One uppercase character',
|
|
25
|
+
minLength: 'passwords should be at least eight characters long',
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
required: ['username', 'password'],
|
|
30
|
+
additionalProperties: false,
|
|
31
|
+
errorMessage: {
|
|
32
|
+
required: {
|
|
33
|
+
username: 'username field is required',
|
|
34
|
+
password: 'password field is required',
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const validDataA: DataA = {
|
|
40
|
+
username: 'kt666',
|
|
41
|
+
password: 'validPassword',
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export const invalidDataA = {
|
|
45
|
+
username: 'kt',
|
|
46
|
+
password: 'invalid',
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export const undefinedDataA = {
|
|
50
|
+
username: undefined,
|
|
51
|
+
password: undefined,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export const fieldsA: Record<InternalFieldName, Field['_f']> = {
|
|
55
|
+
username: {
|
|
56
|
+
ref: { name: 'username' },
|
|
57
|
+
name: 'username',
|
|
58
|
+
},
|
|
59
|
+
password: {
|
|
60
|
+
ref: { name: 'password' },
|
|
61
|
+
name: 'password',
|
|
62
|
+
},
|
|
63
|
+
email: {
|
|
64
|
+
ref: { name: 'email' },
|
|
65
|
+
name: 'email',
|
|
66
|
+
},
|
|
67
|
+
birthday: {
|
|
68
|
+
ref: { name: 'birthday' },
|
|
69
|
+
name: 'birthday',
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
// examples from [ajv-errors](https://github.com/ajv-validator/ajv-errors)
|
|
74
|
+
|
|
75
|
+
interface DataB {
|
|
76
|
+
foo: number;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export const schemaB: JSONSchemaType<DataB> = {
|
|
80
|
+
type: 'object',
|
|
81
|
+
required: ['foo'],
|
|
82
|
+
properties: {
|
|
83
|
+
foo: { type: 'integer' },
|
|
84
|
+
},
|
|
85
|
+
additionalProperties: false,
|
|
86
|
+
errorMessage: 'should be an object with an integer property foo only',
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export const validDataB: DataB = { foo: 666 };
|
|
90
|
+
export const invalidDataB = { foo: 'kt', bar: 6 };
|
|
91
|
+
export const undefinedDataB = { foo: undefined };
|
|
92
|
+
|
|
93
|
+
interface DataC {
|
|
94
|
+
foo: number;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export const schemaC: JSONSchemaType<DataC> = {
|
|
98
|
+
type: 'object',
|
|
99
|
+
required: ['foo'],
|
|
100
|
+
properties: {
|
|
101
|
+
foo: { type: 'integer' },
|
|
102
|
+
},
|
|
103
|
+
additionalProperties: false,
|
|
104
|
+
errorMessage: {
|
|
105
|
+
type: 'should be an object',
|
|
106
|
+
required: 'should have property foo',
|
|
107
|
+
additionalProperties: 'should not have properties other than foo',
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
export const validDataC: DataC = { foo: 666 };
|
|
112
|
+
export const invalidDataC = { foo: 'kt', bar: 6 };
|
|
113
|
+
export const undefinedDataC = { foo: undefined };
|
|
114
|
+
export const invalidTypeDataC = 'something';
|
|
115
|
+
|
|
116
|
+
interface DataD {
|
|
117
|
+
foo: number;
|
|
118
|
+
bar: string;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export const schemaD: JSONSchemaType<DataD> = {
|
|
122
|
+
type: 'object',
|
|
123
|
+
required: ['foo', 'bar'],
|
|
124
|
+
properties: {
|
|
125
|
+
foo: { type: 'integer' },
|
|
126
|
+
bar: { type: 'string' },
|
|
127
|
+
},
|
|
128
|
+
errorMessage: {
|
|
129
|
+
type: 'should be an object', // will not replace internal "type" error for the property "foo"
|
|
130
|
+
required: {
|
|
131
|
+
foo: 'should have an integer property "foo"',
|
|
132
|
+
bar: 'should have a string property "bar"',
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
export const validDataD: DataD = { foo: 666, bar: 'kt' };
|
|
138
|
+
export const invalidDataD = { foo: 'kt', bar: 6 };
|
|
139
|
+
export const undefinedDataD = { foo: undefined, bar: undefined };
|
|
140
|
+
export const invalidTypeDataD = 'something';
|
|
141
|
+
|
|
142
|
+
interface DataE {
|
|
143
|
+
foo: number;
|
|
144
|
+
bar: string;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export const schemaE: JSONSchemaType<DataE> = {
|
|
148
|
+
type: 'object',
|
|
149
|
+
required: ['foo', 'bar'],
|
|
150
|
+
allOf: [
|
|
151
|
+
{
|
|
152
|
+
properties: {
|
|
153
|
+
foo: { type: 'integer', minimum: 2 },
|
|
154
|
+
bar: { type: 'string', minLength: 2 },
|
|
155
|
+
},
|
|
156
|
+
additionalProperties: false,
|
|
157
|
+
},
|
|
158
|
+
],
|
|
159
|
+
errorMessage: {
|
|
160
|
+
properties: {
|
|
161
|
+
foo: 'data.foo should be integer >= 2',
|
|
162
|
+
bar: 'data.bar should be string with length >= 2',
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
export const validDataE: DataE = { foo: 666, bar: 'kt' };
|
|
168
|
+
export const invalidDataE = { foo: 1, bar: 'k' };
|
|
169
|
+
export const undefinedDataE = { foo: undefined, bar: undefined };
|
|
170
|
+
|
|
171
|
+
interface DataF {
|
|
172
|
+
foo: number;
|
|
173
|
+
bar: string;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export const schemaF: JSONSchemaType<DataF> = {
|
|
177
|
+
type: 'object',
|
|
178
|
+
required: ['foo', 'bar'],
|
|
179
|
+
allOf: [
|
|
180
|
+
{
|
|
181
|
+
properties: {
|
|
182
|
+
foo: { type: 'integer', minimum: 2 },
|
|
183
|
+
bar: { type: 'string', minLength: 2 },
|
|
184
|
+
},
|
|
185
|
+
additionalProperties: false,
|
|
186
|
+
},
|
|
187
|
+
],
|
|
188
|
+
errorMessage: {
|
|
189
|
+
type: 'data should be an object',
|
|
190
|
+
properties: {
|
|
191
|
+
foo: 'data.foo should be integer >= 2',
|
|
192
|
+
bar: 'data.bar should be string with length >= 2',
|
|
193
|
+
},
|
|
194
|
+
_: 'data should have properties "foo" and "bar" only',
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
export const validDataF: DataF = { foo: 666, bar: 'kt' };
|
|
199
|
+
export const invalidDataF = {};
|
|
200
|
+
export const undefinedDataF = { foo: 1, bar: undefined };
|
|
201
|
+
export const invalidTypeDataF = 'something';
|
|
202
|
+
|
|
203
|
+
export const fieldsRest: Record<InternalFieldName, Field['_f']> = {
|
|
204
|
+
foo: {
|
|
205
|
+
ref: { name: 'foo' },
|
|
206
|
+
name: 'foo',
|
|
207
|
+
},
|
|
208
|
+
bar: {
|
|
209
|
+
ref: { name: 'bar' },
|
|
210
|
+
name: 'bar',
|
|
211
|
+
},
|
|
212
|
+
lorem: {
|
|
213
|
+
ref: { name: 'lorem' },
|
|
214
|
+
name: 'lorem',
|
|
215
|
+
},
|
|
216
|
+
};
|