@hookform/resolvers 5.5.8 → 5.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 +66 -64
- 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/src/__tests__/special-path-names.ts +27 -0
- package/ajv/src/ajv.ts +5 -1
- 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/src/__tests__/special-path-names.ts +21 -0
- package/arktype/src/arktype.ts +2 -1
- package/ata-validator/dist/ata-validator.js +1 -1
- package/ata-validator/dist/ata-validator.js.map +1 -1
- package/ata-validator/dist/ata-validator.mjs +1 -1
- package/ata-validator/dist/ata-validator.modern.mjs +1 -1
- package/ata-validator/dist/ata-validator.modern.mjs.map +1 -1
- package/ata-validator/dist/ata-validator.module.js +1 -1
- package/ata-validator/dist/ata-validator.module.js.map +1 -1
- package/ata-validator/dist/ata-validator.umd.js +1 -1
- package/ata-validator/dist/ata-validator.umd.js.map +1 -1
- package/ata-validator/src/__tests__/special-path-names.ts +45 -0
- package/ata-validator/src/ata-validator.ts +2 -1
- 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/src/__tests__/special-path-names.ts +23 -0
- package/effect-ts/src/effect-ts.ts +5 -1
- package/joi/dist/joi.js +1 -1
- package/joi/dist/joi.js.map +1 -1
- package/joi/dist/joi.mjs +1 -1
- package/joi/dist/joi.modern.mjs +1 -1
- package/joi/dist/joi.modern.mjs.map +1 -1
- package/joi/dist/joi.module.js +1 -1
- package/joi/dist/joi.module.js.map +1 -1
- package/joi/dist/joi.umd.js +1 -1
- package/joi/dist/joi.umd.js.map +1 -1
- package/joi/src/__tests__/special-path-names.ts +24 -0
- package/joi/src/joi.ts +6 -2
- package/package.json +4 -4
- 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__/special-path-names.ts +21 -0
- package/typebox/src/typebox.ts +2 -1
- 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/__tests__/special-path-names.ts +21 -0
- package/typeschema/src/typeschema.ts +2 -1
- 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/src/__tests__/special-path-names.ts +21 -0
- package/valibot/src/valibot.ts +6 -2
- package/vest/dist/vest.js +1 -1
- package/vest/dist/vest.js.map +1 -1
- package/vest/dist/vest.mjs +1 -1
- package/vest/dist/vest.modern.mjs +1 -1
- package/vest/dist/vest.modern.mjs.map +1 -1
- package/vest/dist/vest.module.js +1 -1
- package/vest/dist/vest.module.js.map +1 -1
- package/vest/dist/vest.umd.js +1 -1
- package/vest/dist/vest.umd.js.map +1 -1
- package/vest/src/__tests__/special-path-names.ts +30 -0
- package/vest/src/vest.ts +2 -1
- 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/package.json +1 -1
- package/vine/src/__tests__/Form-native-validation.tsx +4 -6
- package/vine/src/__tests__/Form.tsx +4 -6
- package/vine/src/__tests__/__fixtures__/data.ts +26 -28
- package/vine/src/__tests__/special-path-names.ts +23 -0
- package/vine/src/__tests__/vine.ts +13 -19
- package/vine/src/vine.ts +9 -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/__tests__/special-path-names.ts +21 -0
- package/yup/src/yup.ts +5 -1
package/README.md
CHANGED
|
@@ -23,7 +23,7 @@ This function allows you to use any external validation library such as Yup, Zod
|
|
|
23
23
|
## Install
|
|
24
24
|
|
|
25
25
|
Install your preferred validation library alongside `@hookform/resolvers`.
|
|
26
|
-
|
|
26
|
+
|
|
27
27
|
npm install @hookform/resolvers # npm
|
|
28
28
|
yarn add @hookform/resolvers # yarn
|
|
29
29
|
pnpm install @hookform/resolvers # pnpm
|
|
@@ -31,29 +31,30 @@ Install your preferred validation library alongside `@hookform/resolvers`.
|
|
|
31
31
|
|
|
32
32
|
<details>
|
|
33
33
|
<summary>Resolver Comparison</summary>
|
|
34
|
-
|
|
35
|
-
| resolver
|
|
36
|
-
|
|
37
|
-
| AJV
|
|
38
|
-
| ata-validator
|
|
39
|
-
| Arktype
|
|
40
|
-
| class-validator
|
|
41
|
-
| computed-types
|
|
42
|
-
| Effect
|
|
43
|
-
| fluentvalidation-ts
|
|
44
|
-
| io-ts
|
|
45
|
-
| joi
|
|
46
|
-
| Nope
|
|
47
|
-
| Standard Schema
|
|
48
|
-
| Superstruct
|
|
49
|
-
| typanion
|
|
50
|
-
| typebox
|
|
51
|
-
| typeschema
|
|
52
|
-
| valibot
|
|
53
|
-
| vest
|
|
54
|
-
| vine
|
|
55
|
-
| yup
|
|
56
|
-
| zod
|
|
34
|
+
|
|
35
|
+
| resolver | Infer values <br /> from schema | [criteriaMode](https://react-hook-form.com/docs/useform#criteriaMode) |
|
|
36
|
+
| -------------------- | -------------------------------- | ----------------------------------------------------------------------- |
|
|
37
|
+
| AJV | ❌ | `firstError \| all` |
|
|
38
|
+
| ata-validator | ❌ | `firstError \| all` |
|
|
39
|
+
| Arktype | ✅ | `firstError` |
|
|
40
|
+
| class-validator | ✅ | `firstError \| all` |
|
|
41
|
+
| computed-types | ✅ | `firstError` |
|
|
42
|
+
| Effect | ✅ | `firstError \| all` |
|
|
43
|
+
| fluentvalidation-ts | ❌ | `firstError` |
|
|
44
|
+
| io-ts | ✅ | `firstError` |
|
|
45
|
+
| joi | ❌ | `firstError \| all` |
|
|
46
|
+
| Nope | ❌ | `firstError` |
|
|
47
|
+
| Standard Schema | ✅ | `firstError \| all` |
|
|
48
|
+
| Superstruct | ✅ | `firstError` |
|
|
49
|
+
| typanion | ✅ | `firstError` |
|
|
50
|
+
| typebox | ✅ | `firstError \| all` |
|
|
51
|
+
| typeschema | ❌ | `firstError \| all` |
|
|
52
|
+
| valibot | ✅ | `firstError \| all` |
|
|
53
|
+
| vest | ❌ | `firstError \| all` |
|
|
54
|
+
| vine | ✅ | `firstError \| all` |
|
|
55
|
+
| yup | ✅ | `firstError \| all` |
|
|
56
|
+
| zod | ✅ | `firstError \| all` |
|
|
57
|
+
|
|
57
58
|
</details>
|
|
58
59
|
|
|
59
60
|
## TypeScript
|
|
@@ -88,15 +89,14 @@ useForm<z.input<typeof schema>, any, z.output<typeof schema>>({
|
|
|
88
89
|
|
|
89
90
|
## Links
|
|
90
91
|
|
|
91
|
-
- [React-hook-form validation resolver documentation
|
|
92
|
+
- [React-hook-form validation resolver documentation](https://react-hook-form.com/docs/useform#resolver)
|
|
92
93
|
|
|
93
|
-
###
|
|
94
|
+
### Table of Contents
|
|
94
95
|
|
|
95
|
-
- [React Hook Form Resolvers](#react-hook-form-resolvers)
|
|
96
96
|
- [Install](#install)
|
|
97
97
|
- [TypeScript](#typescript)
|
|
98
98
|
- [Links](#links)
|
|
99
|
-
- [
|
|
99
|
+
- [Table of Contents](#table-of-contents)
|
|
100
100
|
- [API](#api)
|
|
101
101
|
- [Quickstart](#quickstart)
|
|
102
102
|
- [Yup](#yup)
|
|
@@ -110,10 +110,10 @@ useForm<z.input<typeof schema>, any, z.output<typeof schema>>({
|
|
|
110
110
|
- [computed-types](#computed-types)
|
|
111
111
|
- [typanion](#typanion)
|
|
112
112
|
- [Ajv](#ajv)
|
|
113
|
-
- [ata-validator](#ata-validator)
|
|
114
113
|
- [TypeBox](#typebox)
|
|
115
114
|
- [With `ValueCheck`](#with-valuecheck)
|
|
116
115
|
- [With `TypeCompiler`](#with-typecompiler)
|
|
116
|
+
- [Custom/third-party types](#customthird-party-types-eg-elysiajss-tfiles)
|
|
117
117
|
- [ArkType](#arktype)
|
|
118
118
|
- [Valibot](#valibot)
|
|
119
119
|
- [TypeSchema](#typeschema)
|
|
@@ -121,6 +121,7 @@ useForm<z.input<typeof schema>, any, z.output<typeof schema>>({
|
|
|
121
121
|
- [VineJS](#vinejs)
|
|
122
122
|
- [fluentvalidation-ts](#fluentvalidation-ts)
|
|
123
123
|
- [standard-schema](#standard-schema)
|
|
124
|
+
- [ata-validator](#ata-validator)
|
|
124
125
|
- [Backers](#backers)
|
|
125
126
|
- [Contributors](#contributors)
|
|
126
127
|
|
|
@@ -151,7 +152,7 @@ Dead simple Object schema validation.
|
|
|
151
152
|
|
|
152
153
|
> ⚠️ Pass context via `useForm({ context })`, not via `yupResolver`'s `schemaOptions`. `schemaOptions.context` is overridden by the form context, so use the `useForm` context object instead.
|
|
153
154
|
|
|
154
|
-
```
|
|
155
|
+
```tsx
|
|
155
156
|
// Correct
|
|
156
157
|
useForm({
|
|
157
158
|
resolver: yupResolver(schema),
|
|
@@ -162,7 +163,7 @@ useForm({
|
|
|
162
163
|
yupResolver(schema, { context: { foo: true } });
|
|
163
164
|
```
|
|
164
165
|
|
|
165
|
-
```
|
|
166
|
+
```tsx
|
|
166
167
|
import { useForm } from 'react-hook-form';
|
|
167
168
|
import { yupResolver } from '@hookform/resolvers/yup';
|
|
168
169
|
import * as yup from 'yup';
|
|
@@ -245,7 +246,7 @@ A simple and composable way to validate data in JavaScript (or TypeScript).
|
|
|
245
246
|
|
|
246
247
|
[](https://bundlephobia.com/result?p=superstruct)
|
|
247
248
|
|
|
248
|
-
```
|
|
249
|
+
```tsx
|
|
249
250
|
import { useForm } from 'react-hook-form';
|
|
250
251
|
import { superstructResolver } from '@hookform/resolvers/superstruct';
|
|
251
252
|
import { object, string, number } from 'superstruct';
|
|
@@ -276,7 +277,7 @@ The most powerful data validation library for JS.
|
|
|
276
277
|
|
|
277
278
|
[](https://bundlephobia.com/result?p=joi)
|
|
278
279
|
|
|
279
|
-
```
|
|
280
|
+
```tsx
|
|
280
281
|
import { useForm } from 'react-hook-form';
|
|
281
282
|
import { joiResolver } from '@hookform/resolvers/joi';
|
|
282
283
|
import Joi from 'joi';
|
|
@@ -307,7 +308,7 @@ Vest 🦺 Declarative Validation Testing.
|
|
|
307
308
|
|
|
308
309
|
[](https://bundlephobia.com/result?p=vest)
|
|
309
310
|
|
|
310
|
-
```
|
|
311
|
+
```tsx
|
|
311
312
|
import { useForm } from 'react-hook-form';
|
|
312
313
|
import { vestResolver } from '@hookform/resolvers/vest';
|
|
313
314
|
import { create, test, enforce } from 'vest';
|
|
@@ -323,7 +324,7 @@ const validationSuite = create((data = {}) => {
|
|
|
323
324
|
});
|
|
324
325
|
|
|
325
326
|
const App = () => {
|
|
326
|
-
const { register, handleSubmit
|
|
327
|
+
const { register, handleSubmit } = useForm({
|
|
327
328
|
resolver: vestResolver(validationSuite),
|
|
328
329
|
});
|
|
329
330
|
|
|
@@ -390,7 +391,7 @@ Validate your data with powerful decoders.
|
|
|
390
391
|
|
|
391
392
|
[](https://bundlephobia.com/result?p=io-ts)
|
|
392
393
|
|
|
393
|
-
```
|
|
394
|
+
```tsx
|
|
394
395
|
import React from 'react';
|
|
395
396
|
import { useForm } from 'react-hook-form';
|
|
396
397
|
import { ioTsResolver } from '@hookform/resolvers/io-ts';
|
|
@@ -426,7 +427,7 @@ A small, simple, and fast JS validator
|
|
|
426
427
|
|
|
427
428
|
[](https://bundlephobia.com/result?p=nope-validator)
|
|
428
429
|
|
|
429
|
-
```
|
|
430
|
+
```tsx
|
|
430
431
|
import { useForm } from 'react-hook-form';
|
|
431
432
|
import { nopeResolver } from '@hookform/resolvers/nope';
|
|
432
433
|
import Nope from 'nope-validator';
|
|
@@ -586,7 +587,7 @@ JSON Schema Type Builder with Static Type Resolution for TypeScript
|
|
|
586
587
|
|
|
587
588
|
#### With `ValueCheck`
|
|
588
589
|
|
|
589
|
-
```
|
|
590
|
+
```tsx
|
|
590
591
|
import { useForm } from 'react-hook-form';
|
|
591
592
|
import { typeboxResolver } from '@hookform/resolvers/typebox';
|
|
592
593
|
import { Type } from '@sinclair/typebox';
|
|
@@ -615,7 +616,7 @@ const App = () => {
|
|
|
615
616
|
|
|
616
617
|
A high-performance JIT of `TypeBox`, [read more](https://github.com/sinclairzx81/typebox#typecompiler)
|
|
617
618
|
|
|
618
|
-
```
|
|
619
|
+
```tsx
|
|
619
620
|
import { useForm } from 'react-hook-form';
|
|
620
621
|
import { typeboxResolver } from '@hookform/resolvers/typebox';
|
|
621
622
|
import { Type } from '@sinclair/typebox';
|
|
@@ -651,7 +652,7 @@ must be registered with TypeBox's own `TypeRegistry` (and `FormatRegistry` for s
|
|
|
651
652
|
it's used — this is a TypeBox-level extension point, not something `@hookform/resolvers` wraps or needs
|
|
652
653
|
to expose separately:
|
|
653
654
|
|
|
654
|
-
```
|
|
655
|
+
```tsx
|
|
655
656
|
import { TypeRegistry } from '@sinclair/typebox';
|
|
656
657
|
|
|
657
658
|
if (!TypeRegistry.Has('Files')) {
|
|
@@ -669,7 +670,7 @@ TypeScript's 1:1 validator, optimized from editor to runtime
|
|
|
669
670
|
|
|
670
671
|
[](https://bundlephobia.com/result?p=arktype)
|
|
671
672
|
|
|
672
|
-
```
|
|
673
|
+
```tsx
|
|
673
674
|
import { useForm } from 'react-hook-form';
|
|
674
675
|
import { arktypeResolver } from '@hookform/resolvers/arktype';
|
|
675
676
|
import { type } from 'arktype';
|
|
@@ -700,7 +701,7 @@ The modular and type safe schema library for validating structural data
|
|
|
700
701
|
|
|
701
702
|
[](https://bundlephobia.com/result?p=valibot)
|
|
702
703
|
|
|
703
|
-
```
|
|
704
|
+
```tsx
|
|
704
705
|
import { useForm } from 'react-hook-form';
|
|
705
706
|
import { valibotResolver } from '@hookform/resolvers/valibot';
|
|
706
707
|
import * as v from 'valibot';
|
|
@@ -753,7 +754,7 @@ Universal adapter for schema validation, compatible with [any validation library
|
|
|
753
754
|
|
|
754
755
|
[](https://bundlephobia.com/result?p=@typeschema/main)
|
|
755
756
|
|
|
756
|
-
```
|
|
757
|
+
```tsx
|
|
757
758
|
import { useForm } from 'react-hook-form';
|
|
758
759
|
import { typeschemaResolver } from '@hookform/resolvers/typeschema';
|
|
759
760
|
import { z } from 'zod';
|
|
@@ -785,7 +786,7 @@ A powerful TypeScript framework that provides a fully-fledged functional effect
|
|
|
785
786
|
|
|
786
787
|
[](https://bundlephobia.com/result?p=effect)
|
|
787
788
|
|
|
788
|
-
```
|
|
789
|
+
```tsx
|
|
789
790
|
import React from 'react';
|
|
790
791
|
import { useForm } from 'react-hook-form';
|
|
791
792
|
import { effectTsResolver } from '@hookform/resolvers/effect-ts';
|
|
@@ -836,20 +837,22 @@ VineJS is a form data validation library for Node.js
|
|
|
836
837
|
|
|
837
838
|
[](https://bundlephobia.com/result?p=@vinejs/vine)
|
|
838
839
|
|
|
839
|
-
```
|
|
840
|
+
```tsx
|
|
840
841
|
import { useForm } from 'react-hook-form';
|
|
841
842
|
import { vineResolver } from '@hookform/resolvers/vine';
|
|
842
843
|
import vine from '@vinejs/vine';
|
|
843
844
|
|
|
844
|
-
const schema = vine.
|
|
845
|
-
vine.
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
}),
|
|
849
|
-
);
|
|
845
|
+
const schema = vine.create({
|
|
846
|
+
username: vine.string().minLength(1),
|
|
847
|
+
password: vine.string().minLength(1),
|
|
848
|
+
});
|
|
850
849
|
|
|
851
850
|
const App = () => {
|
|
852
|
-
const {
|
|
851
|
+
const {
|
|
852
|
+
register,
|
|
853
|
+
handleSubmit,
|
|
854
|
+
formState: { errors },
|
|
855
|
+
} = useForm({
|
|
853
856
|
resolver: vineResolver(schema),
|
|
854
857
|
});
|
|
855
858
|
|
|
@@ -865,14 +868,13 @@ const App = () => {
|
|
|
865
868
|
};
|
|
866
869
|
```
|
|
867
870
|
|
|
868
|
-
|
|
869
871
|
### [fluentvalidation-ts](https://github.com/AlexJPotter/fluentvalidation-ts)
|
|
870
872
|
|
|
871
873
|
A TypeScript-first library for building strongly-typed validation rules
|
|
872
874
|
|
|
873
|
-
[](https://bundlephobia.com/result?p=fluentvalidation-ts)
|
|
874
876
|
|
|
875
|
-
```
|
|
877
|
+
```tsx
|
|
876
878
|
import { useForm } from 'react-hook-form';
|
|
877
879
|
import { fluentValidationResolver } from '@hookform/resolvers/fluentvalidation-ts';
|
|
878
880
|
import { Validator } from 'fluentvalidation-ts';
|
|
@@ -891,7 +893,11 @@ class FormDataValidator extends Validator<FormData> {
|
|
|
891
893
|
}
|
|
892
894
|
|
|
893
895
|
const App = () => {
|
|
894
|
-
const {
|
|
896
|
+
const {
|
|
897
|
+
register,
|
|
898
|
+
handleSubmit,
|
|
899
|
+
formState: { errors },
|
|
900
|
+
} = useForm({
|
|
895
901
|
resolver: fluentValidationResolver(new FormDataValidator()),
|
|
896
902
|
});
|
|
897
903
|
|
|
@@ -915,7 +921,7 @@ A standard interface for TypeScript schema validation libraries
|
|
|
915
921
|
|
|
916
922
|
Example zod
|
|
917
923
|
|
|
918
|
-
```
|
|
924
|
+
```tsx
|
|
919
925
|
import { useForm } from 'react-hook-form';
|
|
920
926
|
import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';
|
|
921
927
|
import { z } from 'zod';
|
|
@@ -948,7 +954,7 @@ const App = () => {
|
|
|
948
954
|
|
|
949
955
|
Example arkType
|
|
950
956
|
|
|
951
|
-
```
|
|
957
|
+
```tsx
|
|
952
958
|
import { useForm } from 'react-hook-form';
|
|
953
959
|
import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';
|
|
954
960
|
import { type } from 'arktype';
|
|
@@ -979,7 +985,7 @@ A JSON Schema-based validator for JavaScript and TypeScript
|
|
|
979
985
|
|
|
980
986
|
[](https://bundlephobia.com/result?p=ata-validator)
|
|
981
987
|
|
|
982
|
-
```
|
|
988
|
+
```tsx
|
|
983
989
|
import { useForm } from 'react-hook-form';
|
|
984
990
|
import { ataResolver } from '@hookform/resolvers/ata-validator';
|
|
985
991
|
|
|
@@ -1024,13 +1030,9 @@ const App = () => {
|
|
|
1024
1030
|
Thanks go to all our backers! [[Become a backer](https://opencollective.com/react-hook-form#backer)].
|
|
1025
1031
|
|
|
1026
1032
|
<a href="https://opencollective.com/react-hook-form#backers">
|
|
1027
|
-
<img src="https://opencollective.com/react-hook-form/backers.svg?width=950" />
|
|
1033
|
+
<img src="https://opencollective.com/react-hook-form/backers.svg?width=950" alt="React Hook Form backers" />
|
|
1028
1034
|
</a>
|
|
1029
1035
|
|
|
1030
1036
|
## Contributors
|
|
1031
1037
|
|
|
1032
1038
|
Thanks go to these wonderful people! [[Become a contributor](CONTRIBUTING.md)].
|
|
1033
|
-
|
|
1034
|
-
<a href="https://github.com/react-hook-form/react-hook-form/graphs/contributors">
|
|
1035
|
-
<img src="https://opencollective.com/react-hook-form/contributors.svg?width=950" />
|
|
1036
|
-
</a>
|
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("ajv-formats"),
|
|
1
|
+
var e=require("@hookform/resolvers"),r=require("ajv"),a=require("ajv-errors"),s=require("ajv-formats"),t=require("react-hook-form");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=/*#__PURE__*/o(r),n=/*#__PURE__*/o(a),u=/*#__PURE__*/o(s),c=function(e,r){for(var a=Object.create(null),s=function(e){"required"===e.keyword&&(e.instancePath+="/"+e.params.missingProperty);var s=e.instancePath.substring(1).replace(/\//g,".");if(a[s]||(a[s]={message:e.message,type:e.keyword}),r){var o=a[s].types,i=o&&o[e.keyword];a[s]=t.appendErrors(s,r,a,e.keyword,i?[].concat(i,e.message||""):e.message)}},o=function(){var r=e[i];"errorMessage"===r.keyword?r.params.errors.forEach(function(e){e.message=r.message,s(e)}):s(r)},i=0;i<e.length;i+=1)o();return a};exports.ajvResolver=function(r,a,s){return void 0===s&&(s={}),function(t,o,l){try{var d=new i.default(Object.assign({},{allErrors:!0,validateSchema:!0},a));n.default(d),u.default(d);var v=d.compile(Object.assign({$async:s&&"async"===s.mode},r)),f=structuredClone(t),m=v(f);return l.shouldUseNativeValidation&&e.validateFieldsNatively({},l),Promise.resolve(m?{values:f,errors:{}}:{values:{},errors:e.toNestErrors(c(v.errors,!l.shouldUseNativeValidation&&"all"===l.criteriaMode),l)})}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 addFormats from 'ajv-formats';\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> =
|
|
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 addFormats from 'ajv-formats';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n // A null-prototype object avoids false-positive hits from inherited\n // members (e.g. `toString`, `constructor`) when a field is named after\n // one of them — a plain `{}` would make `!parsedErrors[path]` truthy-skip\n // those paths and silently drop their errors.\n const parsedErrors: Record<string, FieldError> = Object.create(null);\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 addFormats(ajv);\n\n const validate = ajv.compile(\n Object.assign(\n { $async: resolverOptions && resolverOptions.mode === 'async' },\n schema,\n ),\n );\n\n // Ajv mutates the object passed to `validate` in place (e.g. to apply\n // `useDefaults`, `removeAdditional`, or `coerceTypes`). Validating a\n // clone keeps those mutations from leaking into react-hook-form's\n // internal form values, which are passed in by reference.\n const parsedValues = structuredClone(values);\n const valid = validate(parsedValues);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return valid\n ? { values: parsedValues, 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","Object","create","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","assign","allErrors","validateSchema","addFormats","validate","compile","$async","mode","parsedValues","structuredClone","valid","shouldUseNativeValidation","validateFieldsNatively","Promise","resolve","toNestErrors","criteriaMode","e","reject"],"mappings":"4QAOMA,EAAmB,SACvBC,EACAC,GAwCA,IAlCA,IAAMC,EAA2CC,OAAOC,OAAO,MAEzDC,EAAc,SAACC,GAEG,aAAlBA,EAAMC,UACRD,EAAME,cAAY,IAAQF,EAAMG,OAAOC,iBAIzC,IAAMC,EAAOL,EAAME,aAAaI,UAAU,GAAGC,QAAQ,MAAO,KAS5D,GAPKX,EAAaS,KAChBT,EAAaS,GAAQ,CACnBG,QAASR,EAAMQ,QACfC,KAAMT,EAAMC,UAIZN,EAA0B,CAC5B,IAAMe,EAAQd,EAAaS,GAAMK,MAC3BC,EAAWD,GAASA,EAAMV,EAAMC,SAEtCL,EAAaS,GAAQO,eACnBP,EACAV,EACAC,EACAI,EAAMC,QACNU,EACK,GAAgBE,OAAOF,EAAsBX,EAAMQ,SAAW,IAC/DR,EAAMQ,QAEd,CACF,EAAEM,EAAAA,WAGA,IAAMd,EAAQN,EAAUqB,GAEF,iBAAlBf,EAAMC,QACRD,EAAMG,OAAOa,OAAOC,QAAQ,SAACC,GAC3BA,EAAcV,QAAUR,EAAMQ,QAC9BT,EAAYmB,EACd,GAEAnB,EAAYC,EAEhB,EAXSe,EAAQ,EAAGA,EAAQrB,EAAUyB,OAAQJ,GAAS,EAACD,IAaxD,OAAOlB,CACT,sBAuBE,SAACwB,EAAQC,EAAeC,GAAoB,YAApBA,IAAAA,IAAAA,EAAkB,CAAA,GAAE,SACrCC,EAAQC,EAAGC,GAAW,IAC3B,IAAMC,EAAM,IAAIC,EAAG,QACjB9B,OAAO+B,OACL,CAAA,EACA,CACEC,WAAW,EACXC,gBAAgB,GAElBT,IAIJ3B,EAAAA,QAAUgC,GACVK,EAAAA,QAAWL,GAEX,IAAMM,EAAWN,EAAIO,QACnBpC,OAAO+B,OACL,CAAEM,OAAQZ,GAA4C,UAAzBA,EAAgBa,MAC7Cf,IAQEgB,EAAeC,gBAAgBd,GAC/Be,EAAQN,EAASI,GAIvB,OAFAX,EAAQc,2BAA6BC,EAAAA,uBAAuB,CAAE,EAAEf,GAEhEgB,QAAAC,QAAOJ,EACH,CAAEf,OAAQa,EAAcpB,OAAQ,CAAA,GAChC,CACEO,OAAQ,CAAE,EACVP,OAAQ2B,EAAAA,aACNlD,EACEuC,EAAShB,QACRS,EAAQc,2BACkB,QAAzBd,EAAQmB,cAEZnB,IAGV,CAAC,MAAAoB,GAAA,OAAAJ,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 s from"ajv-formats";import{appendErrors as t}from"react-hook-form";var i=function(r,e){for(var o=
|
|
1
|
+
import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import o from"ajv";import a from"ajv-errors";import s from"ajv-formats";import{appendErrors as t}from"react-hook-form";var i=function(r,e){for(var o=Object.create(null),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 s=o[a].types,i=s&&s[r.keyword];o[a]=t(a,e,o,r.keyword,i?[].concat(i,r.message||""):r.message)}},s=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)s();return o},n=function(t,n,m){return void 0===m&&(m={}),function(c,l,u){try{var v=new o(Object.assign({},{allErrors:!0,validateSchema:!0},n));a(v),s(v);var f=v.compile(Object.assign({$async:m&&"async"===m.mode},t)),d=structuredClone(c),g=f(d);return u.shouldUseNativeValidation&&r({},u),Promise.resolve(g?{values:d,errors:{}}:{values:{},errors:e(i(f.errors,!u.shouldUseNativeValidation&&"all"===u.criteriaMode),u)})}catch(r){return Promise.reject(r)}}};export{n as ajvResolver};
|
|
2
2
|
//# sourceMappingURL=ajv.module.js.map
|
package/ajv/dist/ajv.modern.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{validateFieldsNatively as
|
|
1
|
+
import{validateFieldsNatively as e,toNestErrors as r}from"@hookform/resolvers";import s from"ajv";import o from"ajv-errors";import a from"ajv-formats";import{appendErrors as t}from"react-hook-form";const n=(e,r)=>{const s=Object.create(null),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 a=s[o].types,n=a&&a[e.keyword];s[o]=t(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},c=(t,c,m={})=>async(i,l,d)=>{const g=new s(Object.assign({},{allErrors:!0,validateSchema:!0},c));o(g),a(g);const p=g.compile(Object.assign({$async:m&&"async"===m.mode},t)),f=structuredClone(i),u=p(f);return d.shouldUseNativeValidation&&e({},d),u?{values:f,errors:{}}:{values:{},errors:r(n(p.errors,!d.shouldUseNativeValidation&&"all"===d.criteriaMode),d)}};export{c 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 addFormats from 'ajv-formats';\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> =
|
|
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 addFormats from 'ajv-formats';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n // A null-prototype object avoids false-positive hits from inherited\n // members (e.g. `toString`, `constructor`) when a field is named after\n // one of them — a plain `{}` would make `!parsedErrors[path]` truthy-skip\n // those paths and silently drop their errors.\n const parsedErrors: Record<string, FieldError> = Object.create(null);\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 addFormats(ajv);\n\n const validate = ajv.compile(\n Object.assign(\n { $async: resolverOptions && resolverOptions.mode === 'async' },\n schema,\n ),\n );\n\n // Ajv mutates the object passed to `validate` in place (e.g. to apply\n // `useDefaults`, `removeAdditional`, or `coerceTypes`). Validating a\n // clone keeps those mutations from leaking into react-hook-form's\n // internal form values, which are passed in by reference.\n const parsedValues = structuredClone(values);\n const valid = validate(parsedValues);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return valid\n ? { values: parsedValues, 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","Object","create","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","assign","allErrors","validateSchema","addFormats","validate","compile","$async","mode","parsedValues","structuredClone","valid","shouldUseNativeValidation","validateFieldsNatively","toNestErrors","criteriaMode"],"mappings":"sMAOA,MAAMA,EAAmBA,CACvBC,EACAC,KAMA,MAAMC,EAA2CC,OAAOC,OAAO,MAEzDC,EAAeC,IAEG,aAAlBA,EAAMC,UACRD,EAAME,cAAgB,IAAIF,EAAMG,OAAOC,mBAIzC,MAAMC,EAAOL,EAAME,aAAaI,UAAU,GAAGC,QAAQ,MAAO,KAS5D,GAPKX,EAAaS,KAChBT,EAAaS,GAAQ,CACnBG,QAASR,EAAMQ,QACfC,KAAMT,EAAMC,UAIZN,EAA0B,CAC5B,MAAMe,EAAQd,EAAaS,GAAMK,MAC3BC,EAAWD,GAASA,EAAMV,EAAMC,SAEtCL,EAAaS,GAAQO,EACnBP,EACAV,EACAC,EACAI,EAAMC,QACNU,EACK,GAAgBE,OAAOF,EAAsBX,EAAMQ,SAAW,IAC/DR,EAAMQ,QAEd,GAGF,IAAK,IAAIM,EAAQ,EAAGA,EAAQpB,EAAUqB,OAAQD,GAAS,EAAG,CACxD,MAAMd,EAAQN,EAAUoB,GAEF,iBAAlBd,EAAMC,QACRD,EAAMG,OAAOa,OAAOC,QAASC,IAC3BA,EAAcV,QAAUR,EAAMQ,QAC9BT,EAAYmB,EAAc,GAG5BnB,EAAYC,EAEhB,CAEA,OAAOJ,CAAY,EAuBRuB,EACXA,CAACC,EAAQC,EAAeC,EAAkB,KAC1CC,MAAOC,EAAQC,EAAGC,KAChB,MAAMC,EAAM,IAAIC,EACd/B,OAAOgC,OACL,CAAA,EACA,CACEC,WAAW,EACXC,gBAAgB,GAElBV,IAIJ3B,EAAUiC,GACVK,EAAWL,GAEX,MAAMM,EAAWN,EAAIO,QACnBrC,OAAOgC,OACL,CAAEM,OAAQb,GAA4C,UAAzBA,EAAgBc,MAC7ChB,IAQEiB,EAAeC,gBAAgBd,GAC/Be,EAAQN,EAASI,GAIvB,OAFAX,EAAQc,2BAA6BC,EAAuB,GAAIf,GAEzDa,EACH,CAAEf,OAAQa,EAAcrB,OAAQ,IAChC,CACEQ,OAAQ,CAAE,EACVR,OAAQ0B,EACNjD,EACEwC,EAASjB,QACRU,EAAQc,2BACkB,QAAzBd,EAAQiB,cAEZjB,GAEH"}
|
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 s from"ajv-formats";import{appendErrors as t}from"react-hook-form";var i=function(r,e){for(var o=
|
|
1
|
+
import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import o from"ajv";import a from"ajv-errors";import s from"ajv-formats";import{appendErrors as t}from"react-hook-form";var i=function(r,e){for(var o=Object.create(null),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 s=o[a].types,i=s&&s[r.keyword];o[a]=t(a,e,o,r.keyword,i?[].concat(i,r.message||""):r.message)}},s=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)s();return o},n=function(t,n,m){return void 0===m&&(m={}),function(c,l,u){try{var v=new o(Object.assign({},{allErrors:!0,validateSchema:!0},n));a(v),s(v);var f=v.compile(Object.assign({$async:m&&"async"===m.mode},t)),d=structuredClone(c),g=f(d);return u.shouldUseNativeValidation&&r({},u),Promise.resolve(g?{values:d,errors:{}}:{values:{},errors:e(i(f.errors,!u.shouldUseNativeValidation&&"all"===u.criteriaMode),u)})}catch(r){return Promise.reject(r)}}};export{n 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 addFormats from 'ajv-formats';\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> =
|
|
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 addFormats from 'ajv-formats';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n // A null-prototype object avoids false-positive hits from inherited\n // members (e.g. `toString`, `constructor`) when a field is named after\n // one of them — a plain `{}` would make `!parsedErrors[path]` truthy-skip\n // those paths and silently drop their errors.\n const parsedErrors: Record<string, FieldError> = Object.create(null);\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 addFormats(ajv);\n\n const validate = ajv.compile(\n Object.assign(\n { $async: resolverOptions && resolverOptions.mode === 'async' },\n schema,\n ),\n );\n\n // Ajv mutates the object passed to `validate` in place (e.g. to apply\n // `useDefaults`, `removeAdditional`, or `coerceTypes`). Validating a\n // clone keeps those mutations from leaking into react-hook-form's\n // internal form values, which are passed in by reference.\n const parsedValues = structuredClone(values);\n const valid = validate(parsedValues);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return valid\n ? { values: parsedValues, 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","Object","create","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","assign","allErrors","validateSchema","addFormats","validate","compile","$async","mode","parsedValues","structuredClone","valid","shouldUseNativeValidation","validateFieldsNatively","Promise","resolve","toNestErrors","criteriaMode","e","reject"],"mappings":"sMAOA,IAAMA,EAAmB,SACvBC,EACAC,GAwCA,IAlCA,IAAMC,EAA2CC,OAAOC,OAAO,MAEzDC,EAAc,SAACC,GAEG,aAAlBA,EAAMC,UACRD,EAAME,cAAY,IAAQF,EAAMG,OAAOC,iBAIzC,IAAMC,EAAOL,EAAME,aAAaI,UAAU,GAAGC,QAAQ,MAAO,KAS5D,GAPKX,EAAaS,KAChBT,EAAaS,GAAQ,CACnBG,QAASR,EAAMQ,QACfC,KAAMT,EAAMC,UAIZN,EAA0B,CAC5B,IAAMe,EAAQd,EAAaS,GAAMK,MAC3BC,EAAWD,GAASA,EAAMV,EAAMC,SAEtCL,EAAaS,GAAQO,EACnBP,EACAV,EACAC,EACAI,EAAMC,QACNU,EACK,GAAgBE,OAAOF,EAAsBX,EAAMQ,SAAW,IAC/DR,EAAMQ,QAEd,CACF,EAAEM,EAAAA,WAGA,IAAMd,EAAQN,EAAUqB,GAEF,iBAAlBf,EAAMC,QACRD,EAAMG,OAAOa,OAAOC,QAAQ,SAACC,GAC3BA,EAAcV,QAAUR,EAAMQ,QAC9BT,EAAYmB,EACd,GAEAnB,EAAYC,EAEhB,EAXSe,EAAQ,EAAGA,EAAQrB,EAAUyB,OAAQJ,GAAS,EAACD,IAaxD,OAAOlB,CACT,EAsBawB,EACX,SAACC,EAAQC,EAAeC,GAAoB,YAApBA,IAAAA,IAAAA,EAAkB,CAAA,GAAE,SACrCC,EAAQC,EAAGC,GAAW,IAC3B,IAAMC,EAAM,IAAIC,EACd/B,OAAOgC,OACL,CAAA,EACA,CACEC,WAAW,EACXC,gBAAgB,GAElBT,IAIJ5B,EAAUiC,GACVK,EAAWL,GAEX,IAAMM,EAAWN,EAAIO,QACnBrC,OAAOgC,OACL,CAAEM,OAAQZ,GAA4C,UAAzBA,EAAgBa,MAC7Cf,IAQEgB,EAAeC,gBAAgBd,GAC/Be,EAAQN,EAASI,GAIvB,OAFAX,EAAQc,2BAA6BC,EAAuB,CAAE,EAAEf,GAEhEgB,QAAAC,QAAOJ,EACH,CAAEf,OAAQa,EAAcrB,OAAQ,CAAA,GAChC,CACEQ,OAAQ,CAAE,EACVR,OAAQ4B,EACNnD,EACEwC,EAASjB,QACRU,EAAQc,2BACkB,QAAzBd,EAAQmB,cAEZnB,IAGV,CAAC,MAAAoB,GAAA,OAAAJ,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("ajv-formats"),require("react-hook-form")):"function"==typeof define&&define.amd?define(["exports","@hookform/resolvers","ajv","ajv-errors","ajv-formats","react-hook-form"],r):r((e||self).hookformResolversAjv={},e.hookformResolvers,e.ajv,e.ajvErrors,e.ajvFormats,e.ReactHookForm)}(this,function(e,r,o,a,s,t){function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=/*#__PURE__*/n(o),f=/*#__PURE__*/n(a),
|
|
1
|
+
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@hookform/resolvers"),require("ajv"),require("ajv-errors"),require("ajv-formats"),require("react-hook-form")):"function"==typeof define&&define.amd?define(["exports","@hookform/resolvers","ajv","ajv-errors","ajv-formats","react-hook-form"],r):r((e||self).hookformResolversAjv={},e.hookformResolvers,e.ajv,e.ajvErrors,e.ajvFormats,e.ReactHookForm)}(this,function(e,r,o,a,s,t){function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=/*#__PURE__*/n(o),f=/*#__PURE__*/n(a),l=/*#__PURE__*/n(s),u=function(e,r){for(var o=Object.create(null),a=function(e){"required"===e.keyword&&(e.instancePath+="/"+e.params.missingProperty);var a=e.instancePath.substring(1).replace(/\//g,".");if(o[a]||(o[a]={message:e.message,type:e.keyword}),r){var s=o[a].types,n=s&&s[e.keyword];o[a]=t.appendErrors(a,r,o,e.keyword,n?[].concat(n,e.message||""):e.message)}},s=function(){var r=e[n];"errorMessage"===r.keyword?r.params.errors.forEach(function(e){e.message=r.message,a(e)}):a(r)},n=0;n<e.length;n+=1)s();return o};e.ajvResolver=function(e,o,a){return void 0===a&&(a={}),function(s,t,n){try{var c=new i.default(Object.assign({},{allErrors:!0,validateSchema:!0},o));f.default(c),l.default(c);var d=c.compile(Object.assign({$async:a&&"async"===a.mode},e)),v=structuredClone(s),m=d(v);return n.shouldUseNativeValidation&&r.validateFieldsNatively({},n),Promise.resolve(m?{values:v,errors:{}}:{values:{},errors:r.toNestErrors(u(d.errors,!n.shouldUseNativeValidation&&"all"===n.criteriaMode),n)})}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 addFormats from 'ajv-formats';\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> =
|
|
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 addFormats from 'ajv-formats';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n // A null-prototype object avoids false-positive hits from inherited\n // members (e.g. `toString`, `constructor`) when a field is named after\n // one of them — a plain `{}` would make `!parsedErrors[path]` truthy-skip\n // those paths and silently drop their errors.\n const parsedErrors: Record<string, FieldError> = Object.create(null);\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 addFormats(ajv);\n\n const validate = ajv.compile(\n Object.assign(\n { $async: resolverOptions && resolverOptions.mode === 'async' },\n schema,\n ),\n );\n\n // Ajv mutates the object passed to `validate` in place (e.g. to apply\n // `useDefaults`, `removeAdditional`, or `coerceTypes`). Validating a\n // clone keeps those mutations from leaking into react-hook-form's\n // internal form values, which are passed in by reference.\n const parsedValues = structuredClone(values);\n const valid = validate(parsedValues);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return valid\n ? { values: parsedValues, 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","Object","create","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","assign","allErrors","validateSchema","addFormats","validate","compile","$async","mode","parsedValues","structuredClone","valid","shouldUseNativeValidation","validateFieldsNatively","Promise","resolve","toNestErrors","criteriaMode","e","reject"],"mappings":"koBAOMA,EAAmB,SACvBC,EACAC,GAwCA,IAlCA,IAAMC,EAA2CC,OAAOC,OAAO,MAEzDC,EAAc,SAACC,GAEG,aAAlBA,EAAMC,UACRD,EAAME,cAAY,IAAQF,EAAMG,OAAOC,iBAIzC,IAAMC,EAAOL,EAAME,aAAaI,UAAU,GAAGC,QAAQ,MAAO,KAS5D,GAPKX,EAAaS,KAChBT,EAAaS,GAAQ,CACnBG,QAASR,EAAMQ,QACfC,KAAMT,EAAMC,UAIZN,EAA0B,CAC5B,IAAMe,EAAQd,EAAaS,GAAMK,MAC3BC,EAAWD,GAASA,EAAMV,EAAMC,SAEtCL,EAAaS,GAAQO,eACnBP,EACAV,EACAC,EACAI,EAAMC,QACNU,EACK,GAAgBE,OAAOF,EAAsBX,EAAMQ,SAAW,IAC/DR,EAAMQ,QAEd,CACF,EAAEM,EAAAA,WAGA,IAAMd,EAAQN,EAAUqB,GAEF,iBAAlBf,EAAMC,QACRD,EAAMG,OAAOa,OAAOC,QAAQ,SAACC,GAC3BA,EAAcV,QAAUR,EAAMQ,QAC9BT,EAAYmB,EACd,GAEAnB,EAAYC,EAEhB,EAXSe,EAAQ,EAAGA,EAAQrB,EAAUyB,OAAQJ,GAAS,EAACD,IAaxD,OAAOlB,CACT,gBAuBE,SAACwB,EAAQC,EAAeC,GAAoB,YAApBA,IAAAA,IAAAA,EAAkB,CAAA,GAAE,SACrCC,EAAQC,EAAGC,GAAW,IAC3B,IAAMC,EAAM,IAAIC,EAAG,QACjB9B,OAAO+B,OACL,CAAA,EACA,CACEC,WAAW,EACXC,gBAAgB,GAElBT,IAIJ3B,EAAAA,QAAUgC,GACVK,EAAAA,QAAWL,GAEX,IAAMM,EAAWN,EAAIO,QACnBpC,OAAO+B,OACL,CAAEM,OAAQZ,GAA4C,UAAzBA,EAAgBa,MAC7Cf,IAQEgB,EAAeC,gBAAgBd,GAC/Be,EAAQN,EAASI,GAIvB,OAFAX,EAAQc,2BAA6BC,EAAAA,uBAAuB,CAAE,EAAEf,GAEhEgB,QAAAC,QAAOJ,EACH,CAAEf,OAAQa,EAAcpB,OAAQ,CAAA,GAChC,CACEO,OAAQ,CAAE,EACVP,OAAQ2B,EAAAA,aACNlD,EACEuC,EAAShB,QACRS,EAAQc,2BACkB,QAAzBd,EAAQmB,cAEZnB,IAGV,CAAC,MAAAoB,GAAA,OAAAJ,QAAAK,OAAAD,EAAA,CAAA,CAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ajvResolver } from '..';
|
|
2
|
+
|
|
3
|
+
const shouldUseNativeValidation = false;
|
|
4
|
+
|
|
5
|
+
describe('ajvResolver special path names', () => {
|
|
6
|
+
it.each(['hasOwnProperty', 'toString'])(
|
|
7
|
+
'reports a validation error for a field named "%s"',
|
|
8
|
+
async (name) => {
|
|
9
|
+
const schema = {
|
|
10
|
+
type: 'object',
|
|
11
|
+
properties: { [name]: { type: 'string', minLength: 1 } },
|
|
12
|
+
required: [name],
|
|
13
|
+
} as any;
|
|
14
|
+
|
|
15
|
+
const result = await ajvResolver(schema)(
|
|
16
|
+
{ [name]: '' } as any,
|
|
17
|
+
undefined,
|
|
18
|
+
{
|
|
19
|
+
fields: {},
|
|
20
|
+
shouldUseNativeValidation,
|
|
21
|
+
} as any,
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
expect(result.errors[name]).toBeDefined();
|
|
25
|
+
},
|
|
26
|
+
);
|
|
27
|
+
});
|
package/ajv/src/ajv.ts
CHANGED
|
@@ -9,7 +9,11 @@ const parseErrorSchema = (
|
|
|
9
9
|
ajvErrors: AjvError[],
|
|
10
10
|
validateAllFieldCriteria: boolean,
|
|
11
11
|
) => {
|
|
12
|
-
|
|
12
|
+
// A null-prototype object avoids false-positive hits from inherited
|
|
13
|
+
// members (e.g. `toString`, `constructor`) when a field is named after
|
|
14
|
+
// one of them — a plain `{}` would make `!parsedErrors[path]` truthy-skip
|
|
15
|
+
// those paths and silently drop their errors.
|
|
16
|
+
const parsedErrors: Record<string, FieldError> = Object.create(null);
|
|
13
17
|
|
|
14
18
|
const reduceError = (error: AjvError) => {
|
|
15
19
|
// Ajv will return empty instancePath when require error
|
package/arktype/dist/arktype.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=require("@hookform/resolvers");function r(){return r=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)({}).hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},r.apply(null,arguments)}function t(e){if(e.path?.length){let r="";for(const t of e.path){const e="object"==typeof t?t.key:t;if("string"!=typeof e&&"number"!=typeof e)return null;r+=r?`.${e}`:e}return r}return null}exports.arktypeResolver=function(n,s,o){return void 0===o&&(o={}),function(s,a,i){try{var u=function(){if(l.issues){var n=function(e,n){for(var s=
|
|
1
|
+
var e=require("@hookform/resolvers");function r(){return r=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)({}).hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},r.apply(null,arguments)}function t(e){if(e.path?.length){let r="";for(const t of e.path){const e="object"==typeof t?t.key:t;if("string"!=typeof e&&"number"!=typeof e)return null;r+=r?`.${e}`:e}return r}return null}exports.arktypeResolver=function(n,s,o){return void 0===o&&(o={}),function(s,a,i){try{var u=function(){if(l.issues){var n=function(e,n){for(var s=Object.create(null),o=0;o<e.length;o++){var a=e[o],i=t(a);if(i&&(s[i]||(s[i]={message:a.message,type:""}),n)){var u,l=s[i].types||{};s[i].types=r({},l,((u={})[Object.keys(l).length]=a.message,u))}}return s}(l.issues,!i.shouldUseNativeValidation&&"all"===i.criteriaMode);return{values:{},errors:e.toNestErrors(n,i)}}return i.shouldUseNativeValidation&&e.validateFieldsNatively({},i),{values:o.raw?Object.assign({},s):l.value,errors:{}}},l=n["~standard"].validate(s),c=function(){if(l instanceof Promise)return Promise.resolve(l).then(function(e){l=e})}();return Promise.resolve(c&&c.then?c.then(u):u())}catch(e){return Promise.reject(e)}}};
|
|
2
2
|
//# sourceMappingURL=arktype.js.map
|