@hookform/resolvers 4.1.2 → 5.0.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.
Files changed (159) hide show
  1. package/README.md +30 -0
  2. package/ajv/package.json +1 -1
  3. package/arktype/dist/arktype.d.ts +8 -20
  4. package/arktype/dist/arktype.js +1 -1
  5. package/arktype/dist/arktype.js.map +1 -1
  6. package/arktype/dist/arktype.mjs +1 -1
  7. package/arktype/dist/arktype.modern.mjs +1 -1
  8. package/arktype/dist/arktype.modern.mjs.map +1 -1
  9. package/arktype/dist/arktype.module.js +1 -1
  10. package/arktype/dist/arktype.module.js.map +1 -1
  11. package/arktype/dist/arktype.umd.js +1 -1
  12. package/arktype/dist/arktype.umd.js.map +1 -1
  13. package/arktype/package.json +1 -1
  14. package/arktype/src/__tests__/Form.tsx +0 -28
  15. package/arktype/src/__tests__/arktype.ts +56 -0
  16. package/arktype/src/arktype.ts +58 -22
  17. package/class-validator/src/__tests__/Form.tsx +0 -26
  18. package/computed-types/dist/computed-types.d.ts +2 -3
  19. package/computed-types/dist/computed-types.js.map +1 -1
  20. package/computed-types/dist/computed-types.modern.mjs.map +1 -1
  21. package/computed-types/dist/computed-types.module.js.map +1 -1
  22. package/computed-types/dist/computed-types.umd.js.map +1 -1
  23. package/computed-types/package.json +1 -1
  24. package/computed-types/src/__tests__/Form.tsx +0 -28
  25. package/computed-types/src/__tests__/computed-types.ts +55 -1
  26. package/computed-types/src/computed-types.ts +7 -5
  27. package/dist/resolvers.js +1 -1
  28. package/dist/resolvers.js.map +1 -1
  29. package/dist/resolvers.mjs +1 -1
  30. package/dist/resolvers.mjs.map +1 -1
  31. package/dist/resolvers.module.js +1 -1
  32. package/dist/resolvers.module.js.map +1 -1
  33. package/dist/resolvers.umd.js +1 -1
  34. package/dist/resolvers.umd.js.map +1 -1
  35. package/effect-ts/dist/effect-ts.d.ts +8 -16
  36. package/effect-ts/dist/effect-ts.js.map +1 -1
  37. package/effect-ts/dist/effect-ts.modern.mjs.map +1 -1
  38. package/effect-ts/dist/effect-ts.module.js.map +1 -1
  39. package/effect-ts/dist/effect-ts.umd.js.map +1 -1
  40. package/effect-ts/package.json +1 -1
  41. package/effect-ts/src/__tests__/effect-ts.ts +61 -0
  42. package/effect-ts/src/effect-ts.ts +21 -3
  43. package/fluentvalidation-ts/package.json +1 -1
  44. package/io-ts/dist/io-ts.d.ts +8 -17
  45. package/io-ts/dist/io-ts.js.map +1 -1
  46. package/io-ts/dist/io-ts.modern.mjs.map +1 -1
  47. package/io-ts/dist/io-ts.module.js.map +1 -1
  48. package/io-ts/dist/io-ts.umd.js.map +1 -1
  49. package/io-ts/package.json +1 -1
  50. package/io-ts/src/__tests__/__fixtures__/data.ts +3 -3
  51. package/io-ts/src/__tests__/io-ts.ts +54 -0
  52. package/io-ts/src/io-ts.ts +35 -8
  53. package/joi/package.json +1 -1
  54. package/nope/package.json +1 -1
  55. package/package.json +13 -13
  56. package/standard-schema/dist/standard-schema.d.ts +6 -23
  57. package/standard-schema/dist/standard-schema.js +1 -1
  58. package/standard-schema/dist/standard-schema.js.map +1 -1
  59. package/standard-schema/dist/standard-schema.mjs +1 -1
  60. package/standard-schema/dist/standard-schema.modern.mjs +1 -1
  61. package/standard-schema/dist/standard-schema.modern.mjs.map +1 -1
  62. package/standard-schema/dist/standard-schema.module.js +1 -1
  63. package/standard-schema/dist/standard-schema.module.js.map +1 -1
  64. package/standard-schema/dist/standard-schema.umd.js +1 -1
  65. package/standard-schema/dist/standard-schema.umd.js.map +1 -1
  66. package/standard-schema/package.json +1 -1
  67. package/standard-schema/src/__tests__/Form.tsx +0 -28
  68. package/standard-schema/src/__tests__/__fixtures__/data.ts +2 -2
  69. package/standard-schema/src/__tests__/standard-schema.ts +78 -1
  70. package/standard-schema/src/standard-schema.ts +32 -5
  71. package/superstruct/dist/superstruct.d.ts +6 -20
  72. package/superstruct/dist/superstruct.js.map +1 -1
  73. package/superstruct/dist/superstruct.modern.mjs.map +1 -1
  74. package/superstruct/dist/superstruct.module.js.map +1 -1
  75. package/superstruct/dist/superstruct.umd.js.map +1 -1
  76. package/superstruct/package.json +1 -1
  77. package/superstruct/src/__tests__/superstruct.ts +60 -0
  78. package/superstruct/src/superstruct.ts +20 -4
  79. package/typanion/dist/typanion.d.ts +8 -16
  80. package/typanion/dist/typanion.js.map +1 -1
  81. package/typanion/dist/typanion.modern.mjs.map +1 -1
  82. package/typanion/dist/typanion.module.js.map +1 -1
  83. package/typanion/dist/typanion.umd.js.map +1 -1
  84. package/typanion/package.json +1 -1
  85. package/typanion/src/__tests__/Form.tsx +0 -32
  86. package/typanion/src/__tests__/typanion.ts +49 -0
  87. package/typanion/src/typanion.ts +22 -4
  88. package/typebox/dist/typebox.d.ts +3 -3
  89. package/typebox/dist/typebox.js.map +1 -1
  90. package/typebox/dist/typebox.modern.mjs.map +1 -1
  91. package/typebox/dist/typebox.module.js.map +1 -1
  92. package/typebox/dist/typebox.umd.js.map +1 -1
  93. package/typebox/package.json +1 -1
  94. package/typebox/src/__tests__/Form-native-validation-compiler.tsx +1 -1
  95. package/typebox/src/__tests__/Form.tsx +0 -28
  96. package/typebox/src/__tests__/__fixtures__/data.ts +3 -3
  97. package/typebox/src/__tests__/typebox.ts +98 -0
  98. package/typebox/src/typebox.ts +7 -14
  99. package/typeschema/dist/index.d.ts +0 -1
  100. package/typeschema/dist/typeschema.d.ts +8 -19
  101. package/typeschema/dist/typeschema.js +1 -1
  102. package/typeschema/dist/typeschema.js.map +1 -1
  103. package/typeschema/dist/typeschema.mjs +1 -1
  104. package/typeschema/dist/typeschema.modern.mjs +1 -1
  105. package/typeschema/dist/typeschema.modern.mjs.map +1 -1
  106. package/typeschema/dist/typeschema.module.js +1 -1
  107. package/typeschema/dist/typeschema.module.js.map +1 -1
  108. package/typeschema/dist/typeschema.umd.js +1 -1
  109. package/typeschema/dist/typeschema.umd.js.map +1 -1
  110. package/typeschema/package.json +1 -1
  111. package/typeschema/src/__tests__/Form.tsx +2 -4
  112. package/typeschema/src/__tests__/__fixtures__/data.ts +1 -1
  113. package/typeschema/src/__tests__/typeschema.ts +77 -0
  114. package/typeschema/src/index.ts +0 -1
  115. package/typeschema/src/typeschema.ts +52 -25
  116. package/valibot/dist/valibot.d.ts +9 -30
  117. package/valibot/dist/valibot.js.map +1 -1
  118. package/valibot/dist/valibot.modern.mjs.map +1 -1
  119. package/valibot/dist/valibot.module.js.map +1 -1
  120. package/valibot/dist/valibot.umd.js.map +1 -1
  121. package/valibot/package.json +1 -1
  122. package/valibot/src/__tests__/valibot.ts +69 -3
  123. package/valibot/src/valibot.ts +29 -13
  124. package/vest/package.json +1 -1
  125. package/vine/dist/vine.d.ts +10 -24
  126. package/vine/dist/vine.js.map +1 -1
  127. package/vine/dist/vine.modern.mjs.map +1 -1
  128. package/vine/dist/vine.module.js.map +1 -1
  129. package/vine/dist/vine.umd.js.map +1 -1
  130. package/vine/package.json +1 -1
  131. package/vine/src/__tests__/Form.tsx +0 -28
  132. package/vine/src/__tests__/__fixtures__/data.ts +4 -4
  133. package/vine/src/__tests__/vine.ts +69 -0
  134. package/vine/src/vine.ts +26 -4
  135. package/yup/dist/yup.d.ts +7 -21
  136. package/yup/dist/yup.js +1 -1
  137. package/yup/dist/yup.js.map +1 -1
  138. package/yup/dist/yup.mjs +1 -1
  139. package/yup/dist/yup.modern.mjs +1 -1
  140. package/yup/dist/yup.modern.mjs.map +1 -1
  141. package/yup/dist/yup.module.js +1 -1
  142. package/yup/dist/yup.module.js.map +1 -1
  143. package/yup/dist/yup.umd.js +1 -1
  144. package/yup/dist/yup.umd.js.map +1 -1
  145. package/yup/package.json +1 -1
  146. package/yup/src/__tests__/yup.ts +66 -0
  147. package/yup/src/yup.ts +30 -8
  148. package/zod/dist/zod.d.ts +7 -22
  149. package/zod/dist/zod.js.map +1 -1
  150. package/zod/dist/zod.modern.mjs.map +1 -1
  151. package/zod/dist/zod.module.js.map +1 -1
  152. package/zod/dist/zod.umd.js.map +1 -1
  153. package/zod/package.json +1 -1
  154. package/zod/src/__tests__/Form.tsx +0 -28
  155. package/zod/src/__tests__/__fixtures__/data.ts +2 -2
  156. package/zod/src/__tests__/zod.ts +69 -0
  157. package/zod/src/zod.ts +29 -9
  158. package/typeschema/dist/types.d.ts +0 -9
  159. package/typeschema/src/types.ts +0 -18
@@ -1,4 +1,7 @@
1
- import * as valibot from 'valibot';
1
+ import { SubmitHandler } from 'react-hook-form';
2
+ import { useForm } from 'react-hook-form';
3
+ import { Resolver } from 'react-hook-form';
4
+ import * as v from 'valibot';
2
5
  /* eslint-disable no-console, @typescript-eslint/ban-ts-comment */
3
6
  import { valibotResolver } from '..';
4
7
  import {
@@ -21,7 +24,7 @@ describe('valibotResolver', () => {
21
24
  ...a,
22
25
  };
23
26
  });
24
- const funcSpy = vi.spyOn(valibot, 'safeParseAsync');
27
+ const funcSpy = vi.spyOn(v, 'safeParseAsync');
25
28
 
26
29
  const result = await valibotResolver(schema, undefined, {
27
30
  mode: 'sync',
@@ -40,7 +43,7 @@ describe('valibotResolver', () => {
40
43
  ...a,
41
44
  };
42
45
  });
43
- const funcSpy = vi.spyOn(valibot, 'safeParseAsync');
46
+ const funcSpy = vi.spyOn(v, 'safeParseAsync');
44
47
 
45
48
  const result = await valibotResolver(schema, undefined, {
46
49
  mode: 'sync',
@@ -138,4 +141,67 @@ describe('valibotResolver', () => {
138
141
  values: {},
139
142
  });
140
143
  });
144
+
145
+ /**
146
+ * Type inference tests
147
+ */
148
+ it('should correctly infer the output type from a valibot schema', () => {
149
+ const resolver = valibotResolver(v.object({ id: v.number() }));
150
+
151
+ expectTypeOf(resolver).toEqualTypeOf<
152
+ Resolver<{ id: number }, unknown, { id: number }>
153
+ >();
154
+ });
155
+
156
+ it('should correctly infer the output type from a valibot schema using a transform', () => {
157
+ const resolver = valibotResolver(
158
+ v.object({
159
+ id: v.pipe(
160
+ v.number(),
161
+ v.transform((val) => String(val)),
162
+ ),
163
+ }),
164
+ );
165
+
166
+ expectTypeOf(resolver).toEqualTypeOf<
167
+ Resolver<{ id: number }, unknown, { id: string }>
168
+ >();
169
+ });
170
+
171
+ it('should correctly infer the output type from a valibot schema for the handleSubmit function in useForm', () => {
172
+ const schema = v.object({ id: v.number() });
173
+
174
+ const form = useForm({
175
+ resolver: valibotResolver(schema),
176
+ });
177
+
178
+ expectTypeOf(form.watch('id')).toEqualTypeOf<number>();
179
+
180
+ expectTypeOf(form.handleSubmit).parameter(0).toEqualTypeOf<
181
+ SubmitHandler<{
182
+ id: number;
183
+ }>
184
+ >();
185
+ });
186
+
187
+ it('should correctly infer the output type from a valibot schema with a transform for the handleSubmit function in useForm', () => {
188
+ const schema = v.object({
189
+ id: v.pipe(
190
+ v.number(),
191
+ v.transform((val) => String(val)),
192
+ ),
193
+ });
194
+
195
+ const form = useForm({
196
+ resolver: valibotResolver(schema),
197
+ });
198
+
199
+ expectTypeOf(form.watch('id')).toEqualTypeOf<number>();
200
+
201
+ expectTypeOf(form.handleSubmit).parameter(0).toEqualTypeOf<
202
+ SubmitHandler<{
203
+ id: string;
204
+ }>
205
+ >();
206
+ });
141
207
  });
@@ -6,13 +6,31 @@ import {
6
6
  appendErrors,
7
7
  } from 'react-hook-form';
8
8
  import { getDotPath, safeParseAsync } from 'valibot';
9
- import {
10
- BaseSchema,
11
- BaseSchemaAsync,
12
- Config,
13
- InferIssue,
14
- InferOutput,
15
- } from 'valibot';
9
+ import { BaseSchema, BaseSchemaAsync, Config, InferIssue } from 'valibot';
10
+
11
+ export function valibotResolver<Input extends FieldValues, Context, Output>(
12
+ schema: BaseSchema<Input, Output, any> | BaseSchemaAsync<Input, Output, any>,
13
+ schemaOptions?: Partial<
14
+ Omit<Config<InferIssue<typeof schema>>, 'abortPipeEarly' | 'skipPipe'>
15
+ >,
16
+ resolverOptions?: {
17
+ mode?: 'async' | 'sync';
18
+ raw?: false;
19
+ },
20
+ ): Resolver<Input, Context, Output>;
21
+
22
+ export function valibotResolver<Input extends FieldValues, Context, Output>(
23
+ schema: BaseSchema<Input, Output, any> | BaseSchemaAsync<Input, Output, any>,
24
+ schemaOptions:
25
+ | Partial<
26
+ Omit<Config<InferIssue<typeof schema>>, 'abortPipeEarly' | 'skipPipe'>
27
+ >
28
+ | undefined,
29
+ resolverOptions: {
30
+ mode?: 'async' | 'sync';
31
+ raw: true;
32
+ },
33
+ ): Resolver<Input, Context, Input>;
16
34
 
17
35
  /**
18
36
  * Creates a resolver for react-hook-form using Valibot schema validation
@@ -32,10 +50,8 @@ import {
32
50
  * resolver: valibotResolver(schema)
33
51
  * });
34
52
  */
35
- export function valibotResolver<TFieldValues extends FieldValues>(
36
- schema:
37
- | BaseSchema<TFieldValues, TFieldValues, any>
38
- | BaseSchemaAsync<TFieldValues, TFieldValues, any>,
53
+ export function valibotResolver<Input extends FieldValues, Context, Output>(
54
+ schema: BaseSchema<Input, Output, any> | BaseSchemaAsync<Input, Output, any>,
39
55
  schemaOptions?: Partial<
40
56
  Omit<Config<InferIssue<typeof schema>>, 'abortPipeEarly' | 'skipPipe'>
41
57
  >,
@@ -50,8 +66,8 @@ export function valibotResolver<TFieldValues extends FieldValues>(
50
66
  */
51
67
  raw?: boolean;
52
68
  } = {},
53
- ): Resolver<InferOutput<typeof schema>> {
54
- return async (values, _, options) => {
69
+ ): Resolver<Input, Context, Output | Input> {
70
+ return async (values: Input, _, options) => {
55
71
  // Check if we should validate all field criteria
56
72
  const validateAllFieldCriteria =
57
73
  !options.shouldUseNativeValidation && options.criteriaMode === 'all';
package/vest/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "types": "dist/index.d.ts",
12
12
  "license": "MIT",
13
13
  "peerDependencies": {
14
- "react-hook-form": "^7.0.0",
14
+ "react-hook-form": "7.55.0",
15
15
  "@hookform/resolvers": "^2.0.0",
16
16
  "vest": ">=3.0.0"
17
17
  }
@@ -1,25 +1,11 @@
1
1
  import { VineValidator } from '@vinejs/vine';
2
- import { Infer, ValidationOptions } from '@vinejs/vine/build/src/types';
3
- import { Resolver } from 'react-hook-form';
4
- /**
5
- * Creates a resolver for react-hook-form using VineJS schema validation
6
- * @param {T} schema - The VineJS schema to validate against
7
- * @param {ValidationOptions<any>} [schemaOptions] - Optional VineJS validation options
8
- * @param {Object} [resolverOptions] - Optional resolver configuration
9
- * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values instead of validated results
10
- * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form
11
- * @example
12
- * const schema = vine.compile(
13
- * vine.object({
14
- * name: vine.string().minLength(2),
15
- * age: vine.number().min(18)
16
- * })
17
- * );
18
- *
19
- * useForm({
20
- * resolver: vineResolver(schema)
21
- * });
22
- */
23
- export declare function vineResolver<T extends VineValidator<any, any>>(schema: T, schemaOptions?: ValidationOptions<any>, resolverOptions?: {
24
- raw?: boolean;
25
- }): Resolver<Infer<typeof schema>>;
2
+ import { ConstructableSchema, ValidationOptions } from '@vinejs/vine/build/src/types';
3
+ import { FieldValues, Resolver } from 'react-hook-form';
4
+ export declare function vineResolver<Input extends FieldValues, Context, Output>(schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>, schemaOptions?: ValidationOptions<any>, resolverOptions?: {
5
+ mode?: 'async' | 'sync';
6
+ raw?: false;
7
+ }): Resolver<Input, Context, Output>;
8
+ export declare function vineResolver<Input extends FieldValues, Context, Output>(schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>, schemaOptions: ValidationOptions<any> | undefined, resolverOptions: {
9
+ mode?: 'async' | 'sync';
10
+ raw: true;
11
+ }): Resolver<Input, Context, Input>;
@@ -1 +1 @@
1
- {"version":3,"file":"vine.js","sources":["../src/vine.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { SimpleErrorReporter, VineValidator, errors } from '@vinejs/vine';\nimport { Infer, ValidationOptions } from '@vinejs/vine/build/src/types';\nimport {\n FieldError,\n FieldErrors,\n Resolver,\n appendErrors,\n} from 'react-hook-form';\n\nfunction parseErrorSchema(\n vineErrors: SimpleErrorReporter['errors'],\n validateAllFieldCriteria: boolean,\n) {\n const schemaErrors: Record<string, FieldError> = {};\n\n for (; vineErrors.length; ) {\n const error = vineErrors[0];\n const path = error.field;\n\n if (!(path in schemaErrors)) {\n schemaErrors[path] = { message: error.message, type: error.rule };\n }\n\n if (validateAllFieldCriteria) {\n const { types } = schemaErrors[path];\n const messages = types && types[error.rule];\n\n schemaErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n schemaErrors,\n error.rule,\n messages ? [...(messages as string[]), error.message] : error.message,\n ) as FieldError;\n }\n\n vineErrors.shift();\n }\n\n return schemaErrors;\n}\n\n/**\n * Creates a resolver for react-hook-form using VineJS schema validation\n * @param {T} schema - The VineJS schema to validate against\n * @param {ValidationOptions<any>} [schemaOptions] - Optional VineJS validation options\n * @param {Object} [resolverOptions] - Optional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values instead of validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = vine.compile(\n * vine.object({\n * name: vine.string().minLength(2),\n * age: vine.number().min(18)\n * })\n * );\n *\n * useForm({\n * resolver: vineResolver(schema)\n * });\n */\nexport function vineResolver<T extends VineValidator<any, any>>(\n schema: T,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions: { raw?: boolean } = {},\n): Resolver<Infer<typeof schema>> {\n return async (values, _, options) => {\n try {\n const data = await schema.validate(values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n };\n } catch (error: any) {\n if (error instanceof errors.E_VALIDATION_ERROR) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.messages,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n}\n"],"names":["parseErrorSchema","vineErrors","validateAllFieldCriteria","schemaErrors","length","error","path","field","message","type","rule","types","messages","appendErrors","concat","shift","schema","schemaOptions","resolverOptions","values","_","options","Promise","resolve","validate","then","data","shouldUseNativeValidation","validateFieldsNatively","errors","raw","Object","assign","_catch","E_VALIDATION_ERROR","toNestErrors","criteriaMode","e","reject"],"mappings":"4FAUA,SAASA,EACPC,EACAC,GAIA,IAFA,IAAMC,EAA2C,CAAA,EAE1CF,EAAWG,QAAU,CAC1B,IAAMC,EAAQJ,EAAW,GACnBK,EAAOD,EAAME,MAMnB,GAJMD,KAAQH,IACZA,EAAaG,GAAQ,CAAEE,QAASH,EAAMG,QAASC,KAAMJ,EAAMK,OAGzDR,EAA0B,CAC5B,IAAQS,EAAUR,EAAaG,GAAvBK,MACFC,EAAWD,GAASA,EAAMN,EAAMK,MAEtCP,EAAaG,GAAQO,eACnBP,EACAJ,EACAC,EACAE,EAAMK,KACNE,EAAQ,GAAAE,OAAQF,GAAuBP,EAAMG,UAAWH,EAAMG,QAElE,CAEAP,EAAWc,OACb,CAEA,OAAOZ,CACT,sBAqBM,SACJa,EACAC,EACAC,GAEA,gBAFAA,IAAAA,EAAqC,CAAA,YAEvBC,EAAQC,EAAGC,OAAWC,OAAAA,QAAAC,gCAC9BD,QAAAC,QACiBP,EAAOQ,SAASL,EAAQF,IAAcQ,KAAnDC,SAAAA,GAIN,OAFAL,EAAQM,2BAA6BC,EAAsBA,uBAAC,GAAIP,GAEzD,CACLQ,OAAQ,CAAiB,EACzBV,OAAQD,EAAgBY,IAAMC,OAAOC,OAAO,GAAIb,GAAUO,EAC1D,4DAT8BO,CAAA,EAUzB5B,SAAAA,GACP,GAAIA,aAAiBwB,EAAMA,OAACK,mBAC1B,MAAO,CACLf,OAAQ,CAAA,EACRU,OAAQM,EAAYA,aAClBnC,EACEK,EAAMO,UACLS,EAAQM,2BACkB,QAAzBN,EAAQe,cAEZf,IAKN,MAAMhB,CACR,GACF,CAAC,MAAAgC,GAAAf,OAAAA,QAAAgB,OAAAD,EACH,CAAA,CAAA"}
1
+ {"version":3,"file":"vine.js","sources":["../src/vine.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { SimpleErrorReporter, VineValidator, errors } from '@vinejs/vine';\nimport {\n ConstructableSchema,\n ValidationOptions,\n} from '@vinejs/vine/build/src/types';\nimport {\n FieldError,\n FieldErrors,\n FieldValues,\n Resolver,\n appendErrors,\n} from 'react-hook-form';\n\nfunction parseErrorSchema(\n vineErrors: SimpleErrorReporter['errors'],\n validateAllFieldCriteria: boolean,\n) {\n const schemaErrors: Record<string, FieldError> = {};\n\n for (; vineErrors.length; ) {\n const error = vineErrors[0];\n const path = error.field;\n\n if (!(path in schemaErrors)) {\n schemaErrors[path] = { message: error.message, type: error.rule };\n }\n\n if (validateAllFieldCriteria) {\n const { types } = schemaErrors[path];\n const messages = types && types[error.rule];\n\n schemaErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n schemaErrors,\n error.rule,\n messages ? [...(messages as string[]), error.message] : error.message,\n ) as FieldError;\n }\n\n vineErrors.shift();\n }\n\n return schemaErrors;\n}\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions: ValidationOptions<any> | undefined,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using VineJS schema validation\n * @param {T} schema - The VineJS schema to validate against\n * @param {ValidationOptions<any>} [schemaOptions] - Optional VineJS validation options\n * @param {Object} [resolverOptions] - Optional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values instead of validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = vine.compile(\n * vine.object({\n * name: vine.string().minLength(2),\n * age: vine.number().min(18)\n * })\n * );\n *\n * useForm({\n * resolver: vineResolver(schema)\n * });\n */\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions: { raw?: boolean } = {},\n): Resolver<Input, Context, Output | Input> {\n return async (values, _, options) => {\n try {\n const data = await schema.validate(values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n };\n } catch (error: any) {\n if (error instanceof errors.E_VALIDATION_ERROR) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.messages,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n}\n"],"names":["parseErrorSchema","vineErrors","validateAllFieldCriteria","schemaErrors","length","error","path","field","message","type","rule","types","messages","appendErrors","concat","shift","schema","schemaOptions","resolverOptions","values","_","options","Promise","resolve","validate","then","data","shouldUseNativeValidation","validateFieldsNatively","errors","raw","Object","assign","_catch","E_VALIDATION_ERROR","toNestErrors","criteriaMode","e","reject"],"mappings":"4FAcA,SAASA,EACPC,EACAC,GAIA,IAFA,IAAMC,EAA2C,CAAA,EAE1CF,EAAWG,QAAU,CAC1B,IAAMC,EAAQJ,EAAW,GACnBK,EAAOD,EAAME,MAMnB,GAJMD,KAAQH,IACZA,EAAaG,GAAQ,CAAEE,QAASH,EAAMG,QAASC,KAAMJ,EAAMK,OAGzDR,EAA0B,CAC5B,IAAQS,EAAUR,EAAaG,GAAvBK,MACFC,EAAWD,GAASA,EAAMN,EAAMK,MAEtCP,EAAaG,GAAQO,eACnBP,EACAJ,EACAC,EACAE,EAAMK,KACNE,EAAQ,GAAAE,OAAQF,GAAuBP,EAAMG,UAAWH,EAAMG,QAElE,CAEAP,EAAWc,OACb,CAEA,OAAOZ,CACT,sBAuCM,SACJa,EACAC,EACAC,GAEA,gBAFAA,IAAAA,EAAqC,CAAA,YAEvBC,EAAQC,EAAGC,OAAWC,OAAAA,QAAAC,gCAC9BD,QAAAC,QACiBP,EAAOQ,SAASL,EAAQF,IAAcQ,KAAnDC,SAAAA,GAIN,OAFAL,EAAQM,2BAA6BC,EAAsBA,uBAAC,GAAIP,GAEzD,CACLQ,OAAQ,CAAiB,EACzBV,OAAQD,EAAgBY,IAAMC,OAAOC,OAAO,GAAIb,GAAUO,EAC1D,4DAT8BO,CAAA,EAUzB5B,SAAAA,GACP,GAAIA,aAAiBwB,EAAMA,OAACK,mBAC1B,MAAO,CACLf,OAAQ,CAAA,EACRU,OAAQM,EAAYA,aAClBnC,EACEK,EAAMO,UACLS,EAAQM,2BACkB,QAAzBN,EAAQe,cAEZf,IAKN,MAAMhB,CACR,GACF,CAAC,MAAAgC,GAAAf,OAAAA,QAAAgB,OAAAD,EACH,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"vine.modern.mjs","sources":["../src/vine.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { SimpleErrorReporter, VineValidator, errors } from '@vinejs/vine';\nimport { Infer, ValidationOptions } from '@vinejs/vine/build/src/types';\nimport {\n FieldError,\n FieldErrors,\n Resolver,\n appendErrors,\n} from 'react-hook-form';\n\nfunction parseErrorSchema(\n vineErrors: SimpleErrorReporter['errors'],\n validateAllFieldCriteria: boolean,\n) {\n const schemaErrors: Record<string, FieldError> = {};\n\n for (; vineErrors.length; ) {\n const error = vineErrors[0];\n const path = error.field;\n\n if (!(path in schemaErrors)) {\n schemaErrors[path] = { message: error.message, type: error.rule };\n }\n\n if (validateAllFieldCriteria) {\n const { types } = schemaErrors[path];\n const messages = types && types[error.rule];\n\n schemaErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n schemaErrors,\n error.rule,\n messages ? [...(messages as string[]), error.message] : error.message,\n ) as FieldError;\n }\n\n vineErrors.shift();\n }\n\n return schemaErrors;\n}\n\n/**\n * Creates a resolver for react-hook-form using VineJS schema validation\n * @param {T} schema - The VineJS schema to validate against\n * @param {ValidationOptions<any>} [schemaOptions] - Optional VineJS validation options\n * @param {Object} [resolverOptions] - Optional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values instead of validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = vine.compile(\n * vine.object({\n * name: vine.string().minLength(2),\n * age: vine.number().min(18)\n * })\n * );\n *\n * useForm({\n * resolver: vineResolver(schema)\n * });\n */\nexport function vineResolver<T extends VineValidator<any, any>>(\n schema: T,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions: { raw?: boolean } = {},\n): Resolver<Infer<typeof schema>> {\n return async (values, _, options) => {\n try {\n const data = await schema.validate(values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n };\n } catch (error: any) {\n if (error instanceof errors.E_VALIDATION_ERROR) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.messages,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n}\n"],"names":["parseErrorSchema","vineErrors","validateAllFieldCriteria","schemaErrors","length","error","path","field","message","type","rule","types","messages","appendErrors","shift","vineResolver","schema","schemaOptions","resolverOptions","values","_","options","data","validate","shouldUseNativeValidation","validateFieldsNatively","errors","raw","Object","assign","E_VALIDATION_ERROR","toNestErrors","criteriaMode"],"mappings":"oKAUA,SAASA,EACPC,EACAC,GAEA,MAAMC,EAA2C,CAAA,EAEjD,KAAOF,EAAWG,QAAU,CAC1B,MAAMC,EAAQJ,EAAW,GACnBK,EAAOD,EAAME,MAMnB,GAJMD,KAAQH,IACZA,EAAaG,GAAQ,CAAEE,QAASH,EAAMG,QAASC,KAAMJ,EAAMK,OAGzDR,EAA0B,CAC5B,MAAMS,MAAEA,GAAUR,EAAaG,GACzBM,EAAWD,GAASA,EAAMN,EAAMK,MAEtCP,EAAaG,GAAQO,EACnBP,EACAJ,EACAC,EACAE,EAAMK,KACNE,EAAW,IAAKA,EAAuBP,EAAMG,SAAWH,EAAMG,QAElE,CAEAP,EAAWa,OACb,CAEA,OAAOX,CACT,CAqBM,SAAUY,EACdC,EACAC,EACAC,EAAqC,CAAA,GAErC,OAAcC,MAAAA,EAAQC,EAAGC,KACvB,IACE,MAAMC,QAAaN,EAAOO,SAASJ,EAAQF,GAI3C,OAFAI,EAAQG,2BAA6BC,EAAuB,CAAA,EAAIJ,GAEzD,CACLK,OAAQ,CAAiB,EACzBP,OAAQD,EAAgBS,IAAMC,OAAOC,OAAO,CAAA,EAAIV,GAAUG,EAE9D,CAAE,MAAOjB,GACP,GAAIA,aAAiBqB,EAAOI,mBAC1B,MAAO,CACLX,OAAQ,CAAA,EACRO,OAAQK,EACN/B,EACEK,EAAMO,UACLS,EAAQG,2BACkB,QAAzBH,EAAQW,cAEZX,IAKN,MAAMhB,CACR,EAEJ"}
1
+ {"version":3,"file":"vine.modern.mjs","sources":["../src/vine.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { SimpleErrorReporter, VineValidator, errors } from '@vinejs/vine';\nimport {\n ConstructableSchema,\n ValidationOptions,\n} from '@vinejs/vine/build/src/types';\nimport {\n FieldError,\n FieldErrors,\n FieldValues,\n Resolver,\n appendErrors,\n} from 'react-hook-form';\n\nfunction parseErrorSchema(\n vineErrors: SimpleErrorReporter['errors'],\n validateAllFieldCriteria: boolean,\n) {\n const schemaErrors: Record<string, FieldError> = {};\n\n for (; vineErrors.length; ) {\n const error = vineErrors[0];\n const path = error.field;\n\n if (!(path in schemaErrors)) {\n schemaErrors[path] = { message: error.message, type: error.rule };\n }\n\n if (validateAllFieldCriteria) {\n const { types } = schemaErrors[path];\n const messages = types && types[error.rule];\n\n schemaErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n schemaErrors,\n error.rule,\n messages ? [...(messages as string[]), error.message] : error.message,\n ) as FieldError;\n }\n\n vineErrors.shift();\n }\n\n return schemaErrors;\n}\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions: ValidationOptions<any> | undefined,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using VineJS schema validation\n * @param {T} schema - The VineJS schema to validate against\n * @param {ValidationOptions<any>} [schemaOptions] - Optional VineJS validation options\n * @param {Object} [resolverOptions] - Optional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values instead of validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = vine.compile(\n * vine.object({\n * name: vine.string().minLength(2),\n * age: vine.number().min(18)\n * })\n * );\n *\n * useForm({\n * resolver: vineResolver(schema)\n * });\n */\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions: { raw?: boolean } = {},\n): Resolver<Input, Context, Output | Input> {\n return async (values, _, options) => {\n try {\n const data = await schema.validate(values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n };\n } catch (error: any) {\n if (error instanceof errors.E_VALIDATION_ERROR) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.messages,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n}\n"],"names":["parseErrorSchema","vineErrors","validateAllFieldCriteria","schemaErrors","length","error","path","field","message","type","rule","types","messages","appendErrors","shift","vineResolver","schema","schemaOptions","resolverOptions","values","_","options","data","validate","shouldUseNativeValidation","validateFieldsNatively","errors","raw","Object","assign","E_VALIDATION_ERROR","toNestErrors","criteriaMode"],"mappings":"oKAcA,SAASA,EACPC,EACAC,GAEA,MAAMC,EAA2C,CAAA,EAEjD,KAAOF,EAAWG,QAAU,CAC1B,MAAMC,EAAQJ,EAAW,GACnBK,EAAOD,EAAME,MAMnB,GAJMD,KAAQH,IACZA,EAAaG,GAAQ,CAAEE,QAASH,EAAMG,QAASC,KAAMJ,EAAMK,OAGzDR,EAA0B,CAC5B,MAAMS,MAAEA,GAAUR,EAAaG,GACzBM,EAAWD,GAASA,EAAMN,EAAMK,MAEtCP,EAAaG,GAAQO,EACnBP,EACAJ,EACAC,EACAE,EAAMK,KACNE,EAAW,IAAKA,EAAuBP,EAAMG,SAAWH,EAAMG,QAElE,CAEAP,EAAWa,OACb,CAEA,OAAOX,CACT,CAuCM,SAAUY,EACdC,EACAC,EACAC,EAAqC,CAAA,GAErC,OAAcC,MAAAA,EAAQC,EAAGC,KACvB,IACE,MAAMC,QAAaN,EAAOO,SAASJ,EAAQF,GAI3C,OAFAI,EAAQG,2BAA6BC,EAAuB,CAAA,EAAIJ,GAEzD,CACLK,OAAQ,CAAiB,EACzBP,OAAQD,EAAgBS,IAAMC,OAAOC,OAAO,CAAA,EAAIV,GAAUG,EAE9D,CAAE,MAAOjB,GACP,GAAIA,aAAiBqB,EAAOI,mBAC1B,MAAO,CACLX,OAAQ,CAAA,EACRO,OAAQK,EACN/B,EACEK,EAAMO,UACLS,EAAQG,2BACkB,QAAzBH,EAAQW,cAEZX,IAKN,MAAMhB,CACR,EAEJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"vine.module.js","sources":["../src/vine.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { SimpleErrorReporter, VineValidator, errors } from '@vinejs/vine';\nimport { Infer, ValidationOptions } from '@vinejs/vine/build/src/types';\nimport {\n FieldError,\n FieldErrors,\n Resolver,\n appendErrors,\n} from 'react-hook-form';\n\nfunction parseErrorSchema(\n vineErrors: SimpleErrorReporter['errors'],\n validateAllFieldCriteria: boolean,\n) {\n const schemaErrors: Record<string, FieldError> = {};\n\n for (; vineErrors.length; ) {\n const error = vineErrors[0];\n const path = error.field;\n\n if (!(path in schemaErrors)) {\n schemaErrors[path] = { message: error.message, type: error.rule };\n }\n\n if (validateAllFieldCriteria) {\n const { types } = schemaErrors[path];\n const messages = types && types[error.rule];\n\n schemaErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n schemaErrors,\n error.rule,\n messages ? [...(messages as string[]), error.message] : error.message,\n ) as FieldError;\n }\n\n vineErrors.shift();\n }\n\n return schemaErrors;\n}\n\n/**\n * Creates a resolver for react-hook-form using VineJS schema validation\n * @param {T} schema - The VineJS schema to validate against\n * @param {ValidationOptions<any>} [schemaOptions] - Optional VineJS validation options\n * @param {Object} [resolverOptions] - Optional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values instead of validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = vine.compile(\n * vine.object({\n * name: vine.string().minLength(2),\n * age: vine.number().min(18)\n * })\n * );\n *\n * useForm({\n * resolver: vineResolver(schema)\n * });\n */\nexport function vineResolver<T extends VineValidator<any, any>>(\n schema: T,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions: { raw?: boolean } = {},\n): Resolver<Infer<typeof schema>> {\n return async (values, _, options) => {\n try {\n const data = await schema.validate(values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n };\n } catch (error: any) {\n if (error instanceof errors.E_VALIDATION_ERROR) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.messages,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n}\n"],"names":["parseErrorSchema","vineErrors","validateAllFieldCriteria","schemaErrors","length","error","path","field","message","type","rule","types","messages","appendErrors","concat","shift","vineResolver","schema","schemaOptions","resolverOptions","values","_","options","Promise","resolve","validate","then","data","shouldUseNativeValidation","validateFieldsNatively","errors","raw","Object","assign","_catch","E_VALIDATION_ERROR","toNestErrors","criteriaMode","e","reject"],"mappings":"oKAUA,SAASA,EACPC,EACAC,GAIA,IAFA,IAAMC,EAA2C,CAAA,EAE1CF,EAAWG,QAAU,CAC1B,IAAMC,EAAQJ,EAAW,GACnBK,EAAOD,EAAME,MAMnB,GAJMD,KAAQH,IACZA,EAAaG,GAAQ,CAAEE,QAASH,EAAMG,QAASC,KAAMJ,EAAMK,OAGzDR,EAA0B,CAC5B,IAAQS,EAAUR,EAAaG,GAAvBK,MACFC,EAAWD,GAASA,EAAMN,EAAMK,MAEtCP,EAAaG,GAAQO,EACnBP,EACAJ,EACAC,EACAE,EAAMK,KACNE,EAAQ,GAAAE,OAAQF,GAAuBP,EAAMG,UAAWH,EAAMG,QAElE,CAEAP,EAAWc,OACb,CAEA,OAAOZ,CACT,CAqBM,SAAUa,EACdC,EACAC,EACAC,GAEA,gBAFAA,IAAAA,EAAqC,CAAA,YAEvBC,EAAQC,EAAGC,OAAWC,OAAAA,QAAAC,gCAC9BD,QAAAC,QACiBP,EAAOQ,SAASL,EAAQF,IAAcQ,KAAnDC,SAAAA,GAIN,OAFAL,EAAQM,2BAA6BC,EAAuB,GAAIP,GAEzD,CACLQ,OAAQ,CAAiB,EACzBV,OAAQD,EAAgBY,IAAMC,OAAOC,OAAO,GAAIb,GAAUO,EAC1D,4DAT8BO,CAAA,EAUzB7B,SAAAA,GACP,GAAIA,aAAiByB,EAAOK,mBAC1B,MAAO,CACLf,OAAQ,CAAA,EACRU,OAAQM,EACNpC,EACEK,EAAMO,UACLU,EAAQM,2BACkB,QAAzBN,EAAQe,cAEZf,IAKN,MAAMjB,CACR,GACF,CAAC,MAAAiC,GAAAf,OAAAA,QAAAgB,OAAAD,EACH,CAAA,CAAA"}
1
+ {"version":3,"file":"vine.module.js","sources":["../src/vine.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { SimpleErrorReporter, VineValidator, errors } from '@vinejs/vine';\nimport {\n ConstructableSchema,\n ValidationOptions,\n} from '@vinejs/vine/build/src/types';\nimport {\n FieldError,\n FieldErrors,\n FieldValues,\n Resolver,\n appendErrors,\n} from 'react-hook-form';\n\nfunction parseErrorSchema(\n vineErrors: SimpleErrorReporter['errors'],\n validateAllFieldCriteria: boolean,\n) {\n const schemaErrors: Record<string, FieldError> = {};\n\n for (; vineErrors.length; ) {\n const error = vineErrors[0];\n const path = error.field;\n\n if (!(path in schemaErrors)) {\n schemaErrors[path] = { message: error.message, type: error.rule };\n }\n\n if (validateAllFieldCriteria) {\n const { types } = schemaErrors[path];\n const messages = types && types[error.rule];\n\n schemaErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n schemaErrors,\n error.rule,\n messages ? [...(messages as string[]), error.message] : error.message,\n ) as FieldError;\n }\n\n vineErrors.shift();\n }\n\n return schemaErrors;\n}\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions: ValidationOptions<any> | undefined,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using VineJS schema validation\n * @param {T} schema - The VineJS schema to validate against\n * @param {ValidationOptions<any>} [schemaOptions] - Optional VineJS validation options\n * @param {Object} [resolverOptions] - Optional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values instead of validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = vine.compile(\n * vine.object({\n * name: vine.string().minLength(2),\n * age: vine.number().min(18)\n * })\n * );\n *\n * useForm({\n * resolver: vineResolver(schema)\n * });\n */\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions: { raw?: boolean } = {},\n): Resolver<Input, Context, Output | Input> {\n return async (values, _, options) => {\n try {\n const data = await schema.validate(values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n };\n } catch (error: any) {\n if (error instanceof errors.E_VALIDATION_ERROR) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.messages,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n}\n"],"names":["parseErrorSchema","vineErrors","validateAllFieldCriteria","schemaErrors","length","error","path","field","message","type","rule","types","messages","appendErrors","concat","shift","vineResolver","schema","schemaOptions","resolverOptions","values","_","options","Promise","resolve","validate","then","data","shouldUseNativeValidation","validateFieldsNatively","errors","raw","Object","assign","_catch","E_VALIDATION_ERROR","toNestErrors","criteriaMode","e","reject"],"mappings":"oKAcA,SAASA,EACPC,EACAC,GAIA,IAFA,IAAMC,EAA2C,CAAA,EAE1CF,EAAWG,QAAU,CAC1B,IAAMC,EAAQJ,EAAW,GACnBK,EAAOD,EAAME,MAMnB,GAJMD,KAAQH,IACZA,EAAaG,GAAQ,CAAEE,QAASH,EAAMG,QAASC,KAAMJ,EAAMK,OAGzDR,EAA0B,CAC5B,IAAQS,EAAUR,EAAaG,GAAvBK,MACFC,EAAWD,GAASA,EAAMN,EAAMK,MAEtCP,EAAaG,GAAQO,EACnBP,EACAJ,EACAC,EACAE,EAAMK,KACNE,EAAQ,GAAAE,OAAQF,GAAuBP,EAAMG,UAAWH,EAAMG,QAElE,CAEAP,EAAWc,OACb,CAEA,OAAOZ,CACT,CAuCM,SAAUa,EACdC,EACAC,EACAC,GAEA,gBAFAA,IAAAA,EAAqC,CAAA,YAEvBC,EAAQC,EAAGC,OAAWC,OAAAA,QAAAC,gCAC9BD,QAAAC,QACiBP,EAAOQ,SAASL,EAAQF,IAAcQ,KAAnDC,SAAAA,GAIN,OAFAL,EAAQM,2BAA6BC,EAAuB,GAAIP,GAEzD,CACLQ,OAAQ,CAAiB,EACzBV,OAAQD,EAAgBY,IAAMC,OAAOC,OAAO,GAAIb,GAAUO,EAC1D,4DAT8BO,CAAA,EAUzB7B,SAAAA,GACP,GAAIA,aAAiByB,EAAOK,mBAC1B,MAAO,CACLf,OAAQ,CAAA,EACRU,OAAQM,EACNpC,EACEK,EAAMO,UACLU,EAAQM,2BACkB,QAAzBN,EAAQe,cAEZf,IAKN,MAAMjB,CACR,GACF,CAAC,MAAAiC,GAAAf,OAAAA,QAAAgB,OAAAD,EACH,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"vine.umd.js","sources":["../src/vine.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { SimpleErrorReporter, VineValidator, errors } from '@vinejs/vine';\nimport { Infer, ValidationOptions } from '@vinejs/vine/build/src/types';\nimport {\n FieldError,\n FieldErrors,\n Resolver,\n appendErrors,\n} from 'react-hook-form';\n\nfunction parseErrorSchema(\n vineErrors: SimpleErrorReporter['errors'],\n validateAllFieldCriteria: boolean,\n) {\n const schemaErrors: Record<string, FieldError> = {};\n\n for (; vineErrors.length; ) {\n const error = vineErrors[0];\n const path = error.field;\n\n if (!(path in schemaErrors)) {\n schemaErrors[path] = { message: error.message, type: error.rule };\n }\n\n if (validateAllFieldCriteria) {\n const { types } = schemaErrors[path];\n const messages = types && types[error.rule];\n\n schemaErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n schemaErrors,\n error.rule,\n messages ? [...(messages as string[]), error.message] : error.message,\n ) as FieldError;\n }\n\n vineErrors.shift();\n }\n\n return schemaErrors;\n}\n\n/**\n * Creates a resolver for react-hook-form using VineJS schema validation\n * @param {T} schema - The VineJS schema to validate against\n * @param {ValidationOptions<any>} [schemaOptions] - Optional VineJS validation options\n * @param {Object} [resolverOptions] - Optional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values instead of validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = vine.compile(\n * vine.object({\n * name: vine.string().minLength(2),\n * age: vine.number().min(18)\n * })\n * );\n *\n * useForm({\n * resolver: vineResolver(schema)\n * });\n */\nexport function vineResolver<T extends VineValidator<any, any>>(\n schema: T,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions: { raw?: boolean } = {},\n): Resolver<Infer<typeof schema>> {\n return async (values, _, options) => {\n try {\n const data = await schema.validate(values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n };\n } catch (error: any) {\n if (error instanceof errors.E_VALIDATION_ERROR) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.messages,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n}\n"],"names":["parseErrorSchema","vineErrors","validateAllFieldCriteria","schemaErrors","length","error","path","field","message","type","rule","types","messages","appendErrors","concat","shift","schema","schemaOptions","resolverOptions","values","_","options","Promise","resolve","validate","then","data","shouldUseNativeValidation","validateFieldsNatively","errors","raw","Object","assign","_catch","E_VALIDATION_ERROR","toNestErrors","criteriaMode","e","reject"],"mappings":"yaAUA,SAASA,EACPC,EACAC,GAIA,IAFA,IAAMC,EAA2C,CAAA,EAE1CF,EAAWG,QAAU,CAC1B,IAAMC,EAAQJ,EAAW,GACnBK,EAAOD,EAAME,MAMnB,GAJMD,KAAQH,IACZA,EAAaG,GAAQ,CAAEE,QAASH,EAAMG,QAASC,KAAMJ,EAAMK,OAGzDR,EAA0B,CAC5B,IAAQS,EAAUR,EAAaG,GAAvBK,MACFC,EAAWD,GAASA,EAAMN,EAAMK,MAEtCP,EAAaG,GAAQO,eACnBP,EACAJ,EACAC,EACAE,EAAMK,KACNE,EAAQ,GAAAE,OAAQF,GAAuBP,EAAMG,UAAWH,EAAMG,QAElE,CAEAP,EAAWc,OACb,CAEA,OAAOZ,CACT,gBAqBM,SACJa,EACAC,EACAC,GAEA,gBAFAA,IAAAA,EAAqC,CAAA,YAEvBC,EAAQC,EAAGC,OAAWC,OAAAA,QAAAC,gCAC9BD,QAAAC,QACiBP,EAAOQ,SAASL,EAAQF,IAAcQ,KAAnDC,SAAAA,GAIN,OAFAL,EAAQM,2BAA6BC,EAAsBA,uBAAC,GAAIP,GAEzD,CACLQ,OAAQ,CAAiB,EACzBV,OAAQD,EAAgBY,IAAMC,OAAOC,OAAO,GAAIb,GAAUO,EAC1D,4DAT8BO,CAAA,EAUzB5B,SAAAA,GACP,GAAIA,aAAiBwB,EAAMA,OAACK,mBAC1B,MAAO,CACLf,OAAQ,CAAA,EACRU,OAAQM,EAAYA,aAClBnC,EACEK,EAAMO,UACLS,EAAQM,2BACkB,QAAzBN,EAAQe,cAEZf,IAKN,MAAMhB,CACR,GACF,CAAC,MAAAgC,GAAAf,OAAAA,QAAAgB,OAAAD,EACH,CAAA,CAAA"}
1
+ {"version":3,"file":"vine.umd.js","sources":["../src/vine.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { SimpleErrorReporter, VineValidator, errors } from '@vinejs/vine';\nimport {\n ConstructableSchema,\n ValidationOptions,\n} from '@vinejs/vine/build/src/types';\nimport {\n FieldError,\n FieldErrors,\n FieldValues,\n Resolver,\n appendErrors,\n} from 'react-hook-form';\n\nfunction parseErrorSchema(\n vineErrors: SimpleErrorReporter['errors'],\n validateAllFieldCriteria: boolean,\n) {\n const schemaErrors: Record<string, FieldError> = {};\n\n for (; vineErrors.length; ) {\n const error = vineErrors[0];\n const path = error.field;\n\n if (!(path in schemaErrors)) {\n schemaErrors[path] = { message: error.message, type: error.rule };\n }\n\n if (validateAllFieldCriteria) {\n const { types } = schemaErrors[path];\n const messages = types && types[error.rule];\n\n schemaErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n schemaErrors,\n error.rule,\n messages ? [...(messages as string[]), error.message] : error.message,\n ) as FieldError;\n }\n\n vineErrors.shift();\n }\n\n return schemaErrors;\n}\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions: ValidationOptions<any> | undefined,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using VineJS schema validation\n * @param {T} schema - The VineJS schema to validate against\n * @param {ValidationOptions<any>} [schemaOptions] - Optional VineJS validation options\n * @param {Object} [resolverOptions] - Optional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values instead of validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = vine.compile(\n * vine.object({\n * name: vine.string().minLength(2),\n * age: vine.number().min(18)\n * })\n * );\n *\n * useForm({\n * resolver: vineResolver(schema)\n * });\n */\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions: { raw?: boolean } = {},\n): Resolver<Input, Context, Output | Input> {\n return async (values, _, options) => {\n try {\n const data = await schema.validate(values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n };\n } catch (error: any) {\n if (error instanceof errors.E_VALIDATION_ERROR) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.messages,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n}\n"],"names":["parseErrorSchema","vineErrors","validateAllFieldCriteria","schemaErrors","length","error","path","field","message","type","rule","types","messages","appendErrors","concat","shift","schema","schemaOptions","resolverOptions","values","_","options","Promise","resolve","validate","then","data","shouldUseNativeValidation","validateFieldsNatively","errors","raw","Object","assign","_catch","E_VALIDATION_ERROR","toNestErrors","criteriaMode","e","reject"],"mappings":"yaAcA,SAASA,EACPC,EACAC,GAIA,IAFA,IAAMC,EAA2C,CAAA,EAE1CF,EAAWG,QAAU,CAC1B,IAAMC,EAAQJ,EAAW,GACnBK,EAAOD,EAAME,MAMnB,GAJMD,KAAQH,IACZA,EAAaG,GAAQ,CAAEE,QAASH,EAAMG,QAASC,KAAMJ,EAAMK,OAGzDR,EAA0B,CAC5B,IAAQS,EAAUR,EAAaG,GAAvBK,MACFC,EAAWD,GAASA,EAAMN,EAAMK,MAEtCP,EAAaG,GAAQO,eACnBP,EACAJ,EACAC,EACAE,EAAMK,KACNE,EAAQ,GAAAE,OAAQF,GAAuBP,EAAMG,UAAWH,EAAMG,QAElE,CAEAP,EAAWc,OACb,CAEA,OAAOZ,CACT,gBAuCM,SACJa,EACAC,EACAC,GAEA,gBAFAA,IAAAA,EAAqC,CAAA,YAEvBC,EAAQC,EAAGC,OAAWC,OAAAA,QAAAC,gCAC9BD,QAAAC,QACiBP,EAAOQ,SAASL,EAAQF,IAAcQ,KAAnDC,SAAAA,GAIN,OAFAL,EAAQM,2BAA6BC,EAAsBA,uBAAC,GAAIP,GAEzD,CACLQ,OAAQ,CAAiB,EACzBV,OAAQD,EAAgBY,IAAMC,OAAOC,OAAO,GAAIb,GAAUO,EAC1D,4DAT8BO,CAAA,EAUzB5B,SAAAA,GACP,GAAIA,aAAiBwB,EAAMA,OAACK,mBAC1B,MAAO,CACLf,OAAQ,CAAA,EACRU,OAAQM,EAAYA,aAClBnC,EACEK,EAAMO,UACLS,EAAQM,2BACkB,QAAzBN,EAAQe,cAEZf,IAKN,MAAMhB,CACR,GACF,CAAC,MAAAgC,GAAAf,OAAAA,QAAAgB,OAAAD,EACH,CAAA,CAAA"}
package/vine/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "types": "dist/index.d.ts",
12
12
  "license": "MIT",
13
13
  "peerDependencies": {
14
- "react-hook-form": "^7.0.0",
14
+ "react-hook-form": "7.55.0",
15
15
  "@hookform/resolvers": "^2.0.0",
16
16
  "@vinejs/vine": "^2.0.0"
17
17
  }
@@ -13,8 +13,6 @@ const schema = vine.compile(
13
13
  }),
14
14
  );
15
15
 
16
- type FormData = Infer<typeof schema> & { unusedProperty: string };
17
-
18
16
  function TestComponent({
19
17
  onSubmit,
20
18
  }: { onSubmit: (data: Infer<typeof schema>) => void }) {
@@ -55,29 +53,3 @@ test("form's validation with Vine and TypeScript's integration", async () => {
55
53
  ).toBeInTheDocument();
56
54
  expect(handleSubmit).not.toHaveBeenCalled();
57
55
  });
58
-
59
- export function TestComponentManualType({
60
- onSubmit,
61
- }: {
62
- onSubmit: (data: FormData) => void;
63
- }) {
64
- const {
65
- register,
66
- handleSubmit,
67
- formState: { errors },
68
- } = useForm<Infer<typeof schema>, undefined, FormData>({
69
- resolver: vineResolver(schema), // Useful to check TypeScript regressions
70
- });
71
-
72
- return (
73
- <form onSubmit={handleSubmit(onSubmit)}>
74
- <input {...register('username')} />
75
- {errors.username && <span role="alert">{errors.username.message}</span>}
76
-
77
- <input {...register('password')} />
78
- {errors.password && <span role="alert">{errors.password.message}</span>}
79
-
80
- <button type="submit">submit</button>
81
- </form>
82
- );
83
- }
@@ -1,5 +1,5 @@
1
1
  import vine from '@vinejs/vine';
2
- import { Infer } from '@vinejs/vine/build/src/types';
2
+ import { InferInput } from '@vinejs/vine/build/src/types';
3
3
  import { Field, InternalFieldName } from 'react-hook-form';
4
4
 
5
5
  export const schema = vine.compile(
@@ -31,7 +31,7 @@ export const schema = vine.compile(
31
31
  }),
32
32
  );
33
33
 
34
- export const validData: Infer<typeof schema> = {
34
+ export const validData = {
35
35
  username: 'Doe',
36
36
  password: 'Password123_',
37
37
  repeatPassword: 'Password123_',
@@ -47,14 +47,14 @@ export const validData: Infer<typeof schema> = {
47
47
  },
48
48
  ],
49
49
  dateStr: '2020-01-01T00:00:00.000Z',
50
- };
50
+ } satisfies InferInput<typeof schema>;
51
51
 
52
52
  export const invalidData = {
53
53
  password: '___',
54
54
  email: '',
55
55
  birthYear: 'birthYear',
56
56
  like: [{ id: 'z' }],
57
- } as any as Infer<typeof schema>;
57
+ } as unknown as InferInput<typeof schema>;
58
58
 
59
59
  export const fields: Record<InternalFieldName, Field['_f']> = {
60
60
  username: {
@@ -1,3 +1,6 @@
1
+ import vine from '@vinejs/vine';
2
+ import { Resolver, useForm } from 'react-hook-form';
3
+ import { SubmitHandler } from 'react-hook-form';
1
4
  import { vineResolver } from '..';
2
5
  import { fields, invalidData, schema, validData } from './__fixtures__/data';
3
6
 
@@ -50,4 +53,70 @@ describe('vineResolver', () => {
50
53
  expect(schemaSpy).toHaveBeenCalledTimes(1);
51
54
  expect(result).toEqual({ errors: {}, values: validData });
52
55
  });
56
+
57
+ /**
58
+ * Type inference tests
59
+ */
60
+ it('should correctly infer the output type from a vine schema', () => {
61
+ const resolver = vineResolver(
62
+ vine.compile(vine.object({ id: vine.number() })),
63
+ );
64
+
65
+ expectTypeOf(resolver).toEqualTypeOf<
66
+ Resolver<{ id: number | string }, unknown, { id: number }>
67
+ >();
68
+ });
69
+
70
+ it('should correctly infer the output type from a vine schema using a transform', () => {
71
+ const resolver = vineResolver(
72
+ vine.compile(
73
+ vine.object({
74
+ id: vine
75
+ .number()
76
+ .decimal([2, 4])
77
+ .transform<string>((val: unknown) => String(val)),
78
+ }),
79
+ ),
80
+ );
81
+
82
+ expectTypeOf(resolver).toEqualTypeOf<
83
+ Resolver<{ id: number | string }, unknown, { id: string }>
84
+ >();
85
+ });
86
+
87
+ it('should correctly infer the output type from a vine schema for the handleSubmit function in useForm', () => {
88
+ const schema = vine.compile(vine.object({ id: vine.number() }));
89
+
90
+ const form = useForm({
91
+ resolver: vineResolver(schema),
92
+ });
93
+
94
+ expectTypeOf(form.watch('id')).toEqualTypeOf<number | string>();
95
+
96
+ expectTypeOf(form.handleSubmit).parameter(0).toEqualTypeOf<
97
+ SubmitHandler<{
98
+ id: number;
99
+ }>
100
+ >();
101
+ });
102
+
103
+ it('should correctly infer the output type from a vine schema with a transform for the handleSubmit function in useForm', () => {
104
+ const schema = vine.compile(
105
+ vine.object({
106
+ id: vine.number().transform<string>((val: unknown) => String(val)),
107
+ }),
108
+ );
109
+
110
+ const form = useForm({
111
+ resolver: vineResolver(schema),
112
+ });
113
+
114
+ expectTypeOf(form.watch('id')).toEqualTypeOf<string | number>();
115
+
116
+ expectTypeOf(form.handleSubmit).parameter(0).toEqualTypeOf<
117
+ SubmitHandler<{
118
+ id: string;
119
+ }>
120
+ >();
121
+ });
53
122
  });
package/vine/src/vine.ts CHANGED
@@ -1,9 +1,13 @@
1
1
  import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';
2
2
  import { SimpleErrorReporter, VineValidator, errors } from '@vinejs/vine';
3
- import { Infer, ValidationOptions } from '@vinejs/vine/build/src/types';
3
+ import {
4
+ ConstructableSchema,
5
+ ValidationOptions,
6
+ } from '@vinejs/vine/build/src/types';
4
7
  import {
5
8
  FieldError,
6
9
  FieldErrors,
10
+ FieldValues,
7
11
  Resolver,
8
12
  appendErrors,
9
13
  } from 'react-hook-form';
@@ -41,6 +45,24 @@ function parseErrorSchema(
41
45
  return schemaErrors;
42
46
  }
43
47
 
48
+ export function vineResolver<Input extends FieldValues, Context, Output>(
49
+ schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,
50
+ schemaOptions?: ValidationOptions<any>,
51
+ resolverOptions?: {
52
+ mode?: 'async' | 'sync';
53
+ raw?: false;
54
+ },
55
+ ): Resolver<Input, Context, Output>;
56
+
57
+ export function vineResolver<Input extends FieldValues, Context, Output>(
58
+ schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,
59
+ schemaOptions: ValidationOptions<any> | undefined,
60
+ resolverOptions: {
61
+ mode?: 'async' | 'sync';
62
+ raw: true;
63
+ },
64
+ ): Resolver<Input, Context, Input>;
65
+
44
66
  /**
45
67
  * Creates a resolver for react-hook-form using VineJS schema validation
46
68
  * @param {T} schema - The VineJS schema to validate against
@@ -60,11 +82,11 @@ function parseErrorSchema(
60
82
  * resolver: vineResolver(schema)
61
83
  * });
62
84
  */
63
- export function vineResolver<T extends VineValidator<any, any>>(
64
- schema: T,
85
+ export function vineResolver<Input extends FieldValues, Context, Output>(
86
+ schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,
65
87
  schemaOptions?: ValidationOptions<any>,
66
88
  resolverOptions: { raw?: boolean } = {},
67
- ): Resolver<Infer<typeof schema>> {
89
+ ): Resolver<Input, Context, Output | Input> {
68
90
  return async (values, _, options) => {
69
91
  try {
70
92
  const data = await schema.validate(values, schemaOptions);
package/yup/dist/yup.d.ts CHANGED
@@ -1,24 +1,10 @@
1
1
  import { FieldValues, Resolver } from 'react-hook-form';
2
2
  import * as Yup from 'yup';
3
- /**
4
- * Creates a resolver for react-hook-form using Yup schema validation
5
- * @param {Yup.ObjectSchema<TFieldValues> | ReturnType<typeof Yup.lazy<Yup.ObjectSchema<TFieldValues>>>} schema - Yup validation schema
6
- * @param {Parameters<(typeof schema)['validate']>[1]} schemaOptions - Options to pass to Yup's validate/validateSync
7
- * @param {Object} resolverOptions - Additional resolver configuration
8
- * @param {('async' | 'sync')} [resolverOptions.mode] - Validation mode
9
- * @param {boolean} [resolverOptions.raw] - If true, returns raw values instead of validated results
10
- * @returns {Resolver<Yup.InferType<typeof schema>>} A resolver function compatible with react-hook-form
11
- * @example
12
- * const schema = Yup.object({
13
- * name: Yup.string().required(),
14
- * age: Yup.number().required(),
15
- * });
16
- *
17
- * useForm({
18
- * resolver: yupResolver(schema)
19
- * });
20
- */
21
- export declare function yupResolver<TFieldValues extends FieldValues>(schema: Yup.ObjectSchema<TFieldValues> | ReturnType<typeof Yup.lazy<Yup.ObjectSchema<TFieldValues>>>, schemaOptions?: Parameters<(typeof schema)['validate']>[1], resolverOptions?: {
3
+ export declare function yupResolver<Input extends FieldValues, Context, Output>(schema: Yup.ObjectSchema<Input, any, Output, any> | ReturnType<typeof Yup.lazy<Yup.ObjectSchema<Input, any, Output, any>>>, schemaOptions?: Parameters<(typeof schema)['validate']>[1], resolverOptions?: {
22
4
  mode?: 'async' | 'sync';
23
- raw?: boolean;
24
- }): Resolver<Yup.InferType<typeof schema>>;
5
+ raw?: false;
6
+ }): Resolver<Input, Context, Yup.InferType<typeof schema>>;
7
+ export declare function yupResolver<Input extends FieldValues, Context, Output>(schema: Yup.ObjectSchema<Input, any, Output, any> | ReturnType<typeof Yup.lazy<Yup.ObjectSchema<Input, any, Output, any>>>, schemaOptions: Parameters<(typeof schema)['validate']>[1] | undefined, resolverOptions: {
8
+ mode?: 'async' | 'sync';
9
+ raw: true;
10
+ }): Resolver<Input, Context, Input>;
package/yup/dist/yup.js CHANGED
@@ -1,2 +1,2 @@
1
- var e=require("@hookform/resolvers"),t=require("react-hook-form");exports.yupResolver=function(r,o,n){return void 0===o&&(o={}),void 0===n&&(n={}),function(s,a,i){try{return Promise.resolve(function(t,u){try{var c=(o.context&&"development"===process.env.NODE_ENV&&console.warn("You should not used the yup options context. Please, use the 'useForm' context object instead"),Promise.resolve(r["sync"===n.mode?"validateSync":"validate"](s,Object.assign({abortEarly:!1},o,{context:a}))).then(function(t){return i.shouldUseNativeValidation&&e.validateFieldsNatively({},i),{values:n.raw?Object.assign({},s):t,errors:{}}}))}catch(e){return u(e)}return c&&c.then?c.then(void 0,u):c}(0,function(r){if(!r.inner)throw r;return{values:{},errors:e.toNestErrors((o=r,n=!i.shouldUseNativeValidation&&"all"===i.criteriaMode,(o.inner||[]).reduce(function(e,r){if(e[r.path]||(e[r.path]={message:r.message,type:r.type}),n){var o=e[r.path].types,s=o&&o[r.type];e[r.path]=t.appendErrors(r.path,n,e,r.type,s?[].concat(s,r.message):r.message)}return e},{})),i)};var o,n}))}catch(e){return Promise.reject(e)}}};
1
+ var e=require("@hookform/resolvers"),t=require("react-hook-form");exports.yupResolver=function(r,o,n){return void 0===n&&(n={}),function(s,a,i){try{return Promise.resolve(function(t,u){try{var c=(null!=o&&o.context&&"development"===process.env.NODE_ENV&&console.warn("You should not used the yup options context. Please, use the 'useForm' context object instead"),Promise.resolve(r["sync"===n.mode?"validateSync":"validate"](s,Object.assign({abortEarly:!1},o,{context:a}))).then(function(t){return i.shouldUseNativeValidation&&e.validateFieldsNatively({},i),{values:n.raw?Object.assign({},s):t,errors:{}}}))}catch(e){return u(e)}return c&&c.then?c.then(void 0,u):c}(0,function(r){if(!r.inner)throw r;return{values:{},errors:e.toNestErrors((o=r,n=!i.shouldUseNativeValidation&&"all"===i.criteriaMode,(o.inner||[]).reduce(function(e,r){if(e[r.path]||(e[r.path]={message:r.message,type:r.type}),n){var o=e[r.path].types,s=o&&o[r.type];e[r.path]=t.appendErrors(r.path,n,e,r.type,s?[].concat(s,r.message):r.message)}return e},{})),i)};var o,n}))}catch(e){return Promise.reject(e)}}};
2
2
  //# sourceMappingURL=yup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"yup.js","sources":["../src/yup.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport {\n FieldError,\n FieldValues,\n Resolver,\n appendErrors,\n} from 'react-hook-form';\nimport * as Yup from 'yup';\n\n/**\n * Why `path!` ? because it could be `undefined` in some case\n * https://github.com/jquense/yup#validationerrorerrors-string--arraystring-value-any-path-string\n */\nfunction parseErrorSchema(\n error: Yup.ValidationError,\n validateAllFieldCriteria: boolean,\n) {\n return (error.inner || []).reduce<Record<string, FieldError>>(\n (previous, error) => {\n if (!previous[error.path!]) {\n previous[error.path!] = { message: error.message, type: error.type! };\n }\n\n if (validateAllFieldCriteria) {\n const types = previous[error.path!].types;\n const messages = types && types[error.type!];\n\n previous[error.path!] = appendErrors(\n error.path!,\n validateAllFieldCriteria,\n previous,\n error.type!,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n return previous;\n },\n {},\n );\n}\n\n/**\n * Creates a resolver for react-hook-form using Yup schema validation\n * @param {Yup.ObjectSchema<TFieldValues> | ReturnType<typeof Yup.lazy<Yup.ObjectSchema<TFieldValues>>>} schema - Yup validation schema\n * @param {Parameters<(typeof schema)['validate']>[1]} schemaOptions - Options to pass to Yup's validate/validateSync\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {('async' | 'sync')} [resolverOptions.mode] - Validation mode\n * @param {boolean} [resolverOptions.raw] - If true, returns raw values instead of validated results\n * @returns {Resolver<Yup.InferType<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = Yup.object({\n * name: Yup.string().required(),\n * age: Yup.number().required(),\n * });\n *\n * useForm({\n * resolver: yupResolver(schema)\n * });\n */\nexport function yupResolver<TFieldValues extends FieldValues>(\n schema:\n | Yup.ObjectSchema<TFieldValues>\n | ReturnType<typeof Yup.lazy<Yup.ObjectSchema<TFieldValues>>>,\n schemaOptions: Parameters<(typeof schema)['validate']>[1] = {},\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw?: boolean;\n } = {},\n): Resolver<Yup.InferType<typeof schema>> {\n return async (values, context, options) => {\n try {\n if (schemaOptions.context && process.env.NODE_ENV === 'development') {\n // eslint-disable-next-line no-console\n console.warn(\n \"You should not used the yup options context. Please, use the 'useForm' context object instead\",\n );\n }\n\n const result = await schema[\n resolverOptions.mode === 'sync' ? 'validateSync' : 'validate'\n ](\n values,\n Object.assign({ abortEarly: false }, schemaOptions, { context }),\n );\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result,\n errors: {},\n };\n } catch (e: any) {\n if (!e.inner) {\n throw e;\n }\n\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n e,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n };\n}\n"],"names":["schema","schemaOptions","resolverOptions","values","context","options","Promise","resolve","process","env","NODE_ENV","console","warn","mode","Object","assign","abortEarly","then","result","shouldUseNativeValidation","validateFieldsNatively","raw","errors","_catch","e","inner","toNestErrors","error","validateAllFieldCriteria","criteriaMode","reduce","previous","path","message","type","types","messages","appendErrors","concat","reject"],"mappings":"sFA8DM,SACJA,EAGAC,EACAC,GAKA,YAN4D,IAA5DD,IAAAA,EAA4D,CAAA,YAC5DC,IAAAA,EAGI,CAAE,GAEN,SAAcC,EAAQC,EAASC,GAAO,WAAIC,QAAAC,iCAElCN,EAAcG,SAAoC,gBAAzBI,QAAQC,IAAIC,UAEvCC,QAAQC,KACN,iGAEHN,QAAAC,QAEoBP,EACM,SAAzBE,EAAgBW,KAAkB,eAAiB,YAEnDV,EACAW,OAAOC,OAAO,CAAEC,YAAY,GAASf,EAAe,CAAEG,QAAAA,MACvDa,KALKC,SAAAA,GASN,OAFAb,EAAQc,2BAA6BC,EAAAA,uBAAuB,CAAE,EAAEf,GAEzD,CACLF,OAAQD,EAAgBmB,IAAMP,OAAOC,OAAO,CAAA,EAAIZ,GAAUe,EAC1DI,OAAQ,CAAA,EACR,6DArBoCC,YAsB/BC,GACP,IAAKA,EAAEC,MACL,MAAMD,EAGR,MAAO,CACLrB,OAAQ,CAAE,EACVmB,OAAQI,EAAAA,cAvFdC,EAyFUH,EAxFVI,GAyFWvB,EAAQc,2BACkB,QAAzBd,EAAQwB,cAxFZF,EAAMF,OAAS,IAAIK,OACzB,SAACC,EAAUJ,GAKT,GAJKI,EAASJ,EAAMK,QAClBD,EAASJ,EAAMK,MAAS,CAAEC,QAASN,EAAMM,QAASC,KAAMP,EAAMO,OAG5DN,EAA0B,CAC5B,IAAMO,EAAQJ,EAASJ,EAAMK,MAAOG,MAC9BC,EAAWD,GAASA,EAAMR,EAAMO,MAEtCH,EAASJ,EAAMK,MAASK,EAAYA,aAClCV,EAAMK,KACNJ,EACAG,EACAJ,EAAMO,KACNE,EACK,GAAgBE,OAAOF,EAAsBT,EAAMM,SACpDN,EAAMM,QAEd,CAEA,OAAOF,CACT,EACA,CAAA,IAmEM1B,IA9FV,IACEsB,EACAC,CA+FE,GACF,CAAC,MAAAJ,GAAA,OAAAlB,QAAAiC,OAAAf,EACH,CAAA,CAAA"}
1
+ {"version":3,"file":"yup.js","sources":["../src/yup.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport {\n FieldError,\n FieldValues,\n Resolver,\n appendErrors,\n} from 'react-hook-form';\nimport * as Yup from 'yup';\n\n/**\n * Why `path!` ? because it could be `undefined` in some case\n * https://github.com/jquense/yup#validationerrorerrors-string--arraystring-value-any-path-string\n */\nfunction parseErrorSchema(\n error: Yup.ValidationError,\n validateAllFieldCriteria: boolean,\n) {\n return (error.inner || []).reduce<Record<string, FieldError>>(\n (previous, error) => {\n if (!previous[error.path!]) {\n previous[error.path!] = { message: error.message, type: error.type! };\n }\n\n if (validateAllFieldCriteria) {\n const types = previous[error.path!].types;\n const messages = types && types[error.type!];\n\n previous[error.path!] = appendErrors(\n error.path!,\n validateAllFieldCriteria,\n previous,\n error.type!,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n return previous;\n },\n {},\n );\n}\n\nexport function yupResolver<Input extends FieldValues, Context, Output>(\n schema:\n | Yup.ObjectSchema<Input, any, Output, any>\n | ReturnType<typeof Yup.lazy<Yup.ObjectSchema<Input, any, Output, any>>>,\n schemaOptions?: Parameters<(typeof schema)['validate']>[1],\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, Yup.InferType<typeof schema>>;\n\nexport function yupResolver<Input extends FieldValues, Context, Output>(\n schema:\n | Yup.ObjectSchema<Input, any, Output, any>\n | ReturnType<typeof Yup.lazy<Yup.ObjectSchema<Input, any, Output, any>>>,\n schemaOptions: Parameters<(typeof schema)['validate']>[1] | undefined,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using Yup schema validation\n * @param {Yup.ObjectSchema<TFieldValues> | ReturnType<typeof Yup.lazy<Yup.ObjectSchema<TFieldValues>>>} schema - Yup validation schema\n * @param {Parameters<(typeof schema)['validate']>[1]} schemaOptions - Options to pass to Yup's validate/validateSync\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {('async' | 'sync')} [resolverOptions.mode] - Validation mode\n * @param {boolean} [resolverOptions.raw] - If true, returns raw values instead of validated results\n * @returns {Resolver<Yup.InferType<typeof schema> | Input>} A resolver function compatible with react-hook-form\n * @example\n * const schema = Yup.object({\n * name: Yup.string().required(),\n * age: Yup.number().required(),\n * });\n *\n * useForm({\n * resolver: yupResolver(schema)\n * });\n */\nexport function yupResolver<Input extends FieldValues, Context, Output>(\n schema:\n | Yup.ObjectSchema<Input, any, Output, any>\n | ReturnType<typeof Yup.lazy<Yup.ObjectSchema<Input, any, Output, any>>>,\n schemaOptions?: Parameters<(typeof schema)['validate']>[1],\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Yup.InferType<typeof schema> | Input> {\n return async (values: Input, context, options) => {\n try {\n if (schemaOptions?.context && process.env.NODE_ENV === 'development') {\n // eslint-disable-next-line no-console\n console.warn(\n \"You should not used the yup options context. Please, use the 'useForm' context object instead\",\n );\n }\n\n const result = await schema[\n resolverOptions.mode === 'sync' ? 'validateSync' : 'validate'\n ](\n values,\n Object.assign({ abortEarly: false }, schemaOptions, { context }),\n );\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result,\n errors: {},\n };\n } catch (e: any) {\n if (!e.inner) {\n throw e;\n }\n\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n e,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n };\n}\n"],"names":["schema","schemaOptions","resolverOptions","values","context","options","Promise","resolve","process","env","NODE_ENV","console","warn","mode","Object","assign","abortEarly","then","result","shouldUseNativeValidation","validateFieldsNatively","raw","errors","_catch","e","inner","toNestErrors","error","validateAllFieldCriteria","criteriaMode","reduce","previous","path","message","type","types","messages","appendErrors","concat","reject"],"mappings":"sFAoFM,SACJA,EAGAC,EACAC,GAKA,gBALAA,IAAAA,EAGI,CAAA,GAEJ,SAAcC,EAAeC,EAASC,GAAO,WAAIC,QAAAC,iCAEzCN,MAAAA,GAAAA,EAAeG,SAAoC,gBAAzBI,QAAQC,IAAIC,UAExCC,QAAQC,KACN,iGAEHN,QAAAC,QAEoBP,EACM,SAAzBE,EAAgBW,KAAkB,eAAiB,YAEnDV,EACAW,OAAOC,OAAO,CAAEC,YAAY,GAASf,EAAe,CAAEG,QAAAA,MACvDa,cALKC,GASN,OAFAb,EAAQc,2BAA6BC,yBAAuB,CAAA,EAAIf,GAEzD,CACLF,OAAQD,EAAgBmB,IAAMP,OAAOC,OAAO,CAAE,EAAEZ,GAAUe,EAC1DI,OAAQ,GACR,6DArB2CC,GAsB9C,SAAQC,GACP,IAAKA,EAAEC,MACL,MAAMD,EAGR,MAAO,CACLrB,OAAQ,GACRmB,OAAQI,EAAYA,cA7G1BC,EA+GUH,EA9GVI,GA+GWvB,EAAQc,2BACkB,QAAzBd,EAAQwB,cA9GZF,EAAMF,OAAS,IAAIK,OACzB,SAACC,EAAUJ,GAKT,GAJKI,EAASJ,EAAMK,QAClBD,EAASJ,EAAMK,MAAS,CAAEC,QAASN,EAAMM,QAASC,KAAMP,EAAMO,OAG5DN,EAA0B,CAC5B,IAAMO,EAAQJ,EAASJ,EAAMK,MAAOG,MAC9BC,EAAWD,GAASA,EAAMR,EAAMO,MAEtCH,EAASJ,EAAMK,MAASK,eACtBV,EAAMK,KACNJ,EACAG,EACAJ,EAAMO,KACNE,EACK,GAAgBE,OAAOF,EAAsBT,EAAMM,SACpDN,EAAMM,QAEd,CAEA,OAAOF,CACT,EACA,CAAA,IAyFM1B,IApHV,IACEsB,EACAC,CAqHE,GACF,CAAC,MAAAJ,GAAA,OAAAlB,QAAAiC,OAAAf,EACH,CAAA,CAAA"}
package/yup/dist/yup.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{validateFieldsNatively as e,toNestErrors as t}from"@hookform/resolvers";import{appendErrors as r}from"react-hook-form";function o(o,n,s){return void 0===n&&(n={}),void 0===s&&(s={}),function(a,i,c){try{return Promise.resolve(function(t,r){try{var u=(n.context&&"development"===process.env.NODE_ENV&&console.warn("You should not used the yup options context. Please, use the 'useForm' context object instead"),Promise.resolve(o["sync"===s.mode?"validateSync":"validate"](a,Object.assign({abortEarly:!1},n,{context:i}))).then(function(t){return c.shouldUseNativeValidation&&e({},c),{values:s.raw?Object.assign({},a):t,errors:{}}}))}catch(e){return r(e)}return u&&u.then?u.then(void 0,r):u}(0,function(e){if(!e.inner)throw e;return{values:{},errors:t((o=e,n=!c.shouldUseNativeValidation&&"all"===c.criteriaMode,(o.inner||[]).reduce(function(e,t){if(e[t.path]||(e[t.path]={message:t.message,type:t.type}),n){var o=e[t.path].types,s=o&&o[t.type];e[t.path]=r(t.path,n,e,t.type,s?[].concat(s,t.message):t.message)}return e},{})),c)};var o,n}))}catch(e){return Promise.reject(e)}}}export{o as yupResolver};
1
+ import{validateFieldsNatively as e,toNestErrors as t}from"@hookform/resolvers";import{appendErrors as r}from"react-hook-form";function o(o,n,s){return void 0===s&&(s={}),function(a,i,c){try{return Promise.resolve(function(t,r){try{var u=(null!=n&&n.context&&"development"===process.env.NODE_ENV&&console.warn("You should not used the yup options context. Please, use the 'useForm' context object instead"),Promise.resolve(o["sync"===s.mode?"validateSync":"validate"](a,Object.assign({abortEarly:!1},n,{context:i}))).then(function(t){return c.shouldUseNativeValidation&&e({},c),{values:s.raw?Object.assign({},a):t,errors:{}}}))}catch(e){return r(e)}return u&&u.then?u.then(void 0,r):u}(0,function(e){if(!e.inner)throw e;return{values:{},errors:t((o=e,n=!c.shouldUseNativeValidation&&"all"===c.criteriaMode,(o.inner||[]).reduce(function(e,t){if(e[t.path]||(e[t.path]={message:t.message,type:t.type}),n){var o=e[t.path].types,s=o&&o[t.type];e[t.path]=r(t.path,n,e,t.type,s?[].concat(s,t.message):t.message)}return e},{})),c)};var o,n}))}catch(e){return Promise.reject(e)}}}export{o as yupResolver};
2
2
  //# sourceMappingURL=yup.module.js.map
@@ -1,2 +1,2 @@
1
- import{validateFieldsNatively as e,toNestErrors as t}from"@hookform/resolvers";import{appendErrors as o}from"react-hook-form";function a(a,r={},s={}){return async(n,c,i)=>{try{r.context&&"development"===process.env.NODE_ENV&&console.warn("You should not used the yup options context. Please, use the 'useForm' context object instead");const t=await a["sync"===s.mode?"validateSync":"validate"](n,Object.assign({abortEarly:!1},r,{context:c}));return i.shouldUseNativeValidation&&e({},i),{values:s.raw?Object.assign({},n):t,errors:{}}}catch(e){if(!e.inner)throw e;return{values:{},errors:t((p=e,l=!i.shouldUseNativeValidation&&"all"===i.criteriaMode,(p.inner||[]).reduce((e,t)=>{if(e[t.path]||(e[t.path]={message:t.message,type:t.type}),l){const a=e[t.path].types,r=a&&a[t.type];e[t.path]=o(t.path,l,e,t.type,r?[].concat(r,t.message):t.message)}return e},{})),i)}}var p,l}}export{a as yupResolver};
1
+ import{validateFieldsNatively as e,toNestErrors as t}from"@hookform/resolvers";import{appendErrors as o}from"react-hook-form";function a(a,r,s={}){return async(n,c,i)=>{try{null!=r&&r.context&&"development"===process.env.NODE_ENV&&console.warn("You should not used the yup options context. Please, use the 'useForm' context object instead");const t=await a["sync"===s.mode?"validateSync":"validate"](n,Object.assign({abortEarly:!1},r,{context:c}));return i.shouldUseNativeValidation&&e({},i),{values:s.raw?Object.assign({},n):t,errors:{}}}catch(e){if(!e.inner)throw e;return{values:{},errors:t((l=e,p=!i.shouldUseNativeValidation&&"all"===i.criteriaMode,(l.inner||[]).reduce((e,t)=>{if(e[t.path]||(e[t.path]={message:t.message,type:t.type}),p){const a=e[t.path].types,r=a&&a[t.type];e[t.path]=o(t.path,p,e,t.type,r?[].concat(r,t.message):t.message)}return e},{})),i)}}var l,p}}export{a as yupResolver};
2
2
  //# sourceMappingURL=yup.modern.mjs.map