@hookform/resolvers 3.10.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/README.md +108 -6
  2. package/ajv/dist/ajv.d.ts +20 -0
  3. package/ajv/dist/ajv.js +1 -1
  4. package/ajv/dist/ajv.js.map +1 -1
  5. package/ajv/dist/ajv.mjs +1 -1
  6. package/ajv/dist/ajv.modern.mjs +1 -1
  7. package/ajv/dist/ajv.modern.mjs.map +1 -1
  8. package/ajv/dist/ajv.module.js +1 -1
  9. package/ajv/dist/ajv.module.js.map +1 -1
  10. package/ajv/dist/ajv.umd.js +1 -1
  11. package/ajv/dist/ajv.umd.js.map +1 -1
  12. package/ajv/dist/types.d.ts +8 -0
  13. package/ajv/src/__tests__/__fixtures__/data-errors.ts +216 -0
  14. package/ajv/src/__tests__/__snapshots__/ajv-errors.ts.snap +462 -0
  15. package/ajv/src/__tests__/__snapshots__/ajv.ts.snap +6 -6
  16. package/ajv/src/__tests__/ajv-errors.ts +227 -0
  17. package/ajv/src/ajv.ts +47 -14
  18. package/ajv/src/types.ts +8 -0
  19. package/arktype/dist/arktype.d.ts +20 -2
  20. package/arktype/dist/arktype.js +1 -1
  21. package/arktype/dist/arktype.js.map +1 -1
  22. package/arktype/dist/arktype.mjs +1 -1
  23. package/arktype/dist/arktype.modern.mjs +1 -1
  24. package/arktype/dist/arktype.modern.mjs.map +1 -1
  25. package/arktype/dist/arktype.module.js +1 -1
  26. package/arktype/dist/arktype.module.js.map +1 -1
  27. package/arktype/dist/arktype.umd.js +1 -1
  28. package/arktype/dist/arktype.umd.js.map +1 -1
  29. package/arktype/dist/index.d.ts +0 -1
  30. package/arktype/package.json +1 -1
  31. package/arktype/src/__tests__/Form-native-validation.tsx +3 -3
  32. package/arktype/src/__tests__/Form.tsx +34 -8
  33. package/arktype/src/__tests__/__fixtures__/data.ts +2 -2
  34. package/arktype/src/__tests__/__snapshots__/arktype.ts.snap +22 -415
  35. package/arktype/src/arktype.ts +46 -15
  36. package/arktype/src/index.ts +0 -1
  37. package/class-validator/dist/class-validator.d.ts +29 -2
  38. package/class-validator/dist/class-validator.js +1 -1
  39. package/class-validator/dist/class-validator.js.map +1 -1
  40. package/class-validator/dist/class-validator.mjs +1 -1
  41. package/class-validator/dist/class-validator.modern.mjs +1 -1
  42. package/class-validator/dist/class-validator.modern.mjs.map +1 -1
  43. package/class-validator/dist/class-validator.module.js +1 -1
  44. package/class-validator/dist/class-validator.module.js.map +1 -1
  45. package/class-validator/dist/class-validator.umd.js +1 -1
  46. package/class-validator/dist/class-validator.umd.js.map +1 -1
  47. package/class-validator/dist/index.d.ts +0 -1
  48. package/class-validator/src/__tests__/Form.tsx +26 -0
  49. package/class-validator/src/__tests__/__fixtures__/data.ts +1 -1
  50. package/class-validator/src/__tests__/class-validator.ts +22 -11
  51. package/class-validator/src/class-validator.ts +47 -13
  52. package/class-validator/src/index.ts +0 -1
  53. package/computed-types/dist/computed-types.d.ts +18 -2
  54. package/computed-types/dist/computed-types.js.map +1 -1
  55. package/computed-types/dist/computed-types.mjs +1 -1
  56. package/computed-types/dist/computed-types.modern.mjs +1 -1
  57. package/computed-types/dist/computed-types.modern.mjs.map +1 -1
  58. package/computed-types/dist/computed-types.module.js +1 -1
  59. package/computed-types/dist/computed-types.module.js.map +1 -1
  60. package/computed-types/dist/computed-types.umd.js.map +1 -1
  61. package/computed-types/dist/index.d.ts +0 -1
  62. package/computed-types/src/__tests__/Form-native-validation.tsx +2 -4
  63. package/computed-types/src/__tests__/Form.tsx +30 -6
  64. package/computed-types/src/__tests__/__fixtures__/data.ts +1 -1
  65. package/computed-types/src/__tests__/computed-types.ts +2 -0
  66. package/computed-types/src/computed-types.ts +24 -7
  67. package/computed-types/src/index.ts +0 -1
  68. package/dist/resolvers.js +1 -1
  69. package/dist/resolvers.js.map +1 -1
  70. package/dist/resolvers.mjs +1 -1
  71. package/dist/resolvers.mjs.map +1 -1
  72. package/dist/resolvers.module.js +1 -1
  73. package/dist/resolvers.module.js.map +1 -1
  74. package/dist/resolvers.umd.js +1 -1
  75. package/dist/resolvers.umd.js.map +1 -1
  76. package/effect-ts/dist/effect-ts.d.ts +19 -2
  77. package/effect-ts/dist/effect-ts.js +1 -1
  78. package/effect-ts/dist/effect-ts.js.map +1 -1
  79. package/effect-ts/dist/effect-ts.mjs +1 -1
  80. package/effect-ts/dist/effect-ts.modern.mjs +1 -1
  81. package/effect-ts/dist/effect-ts.modern.mjs.map +1 -1
  82. package/effect-ts/dist/effect-ts.module.js +1 -1
  83. package/effect-ts/dist/effect-ts.module.js.map +1 -1
  84. package/effect-ts/dist/effect-ts.umd.js +1 -1
  85. package/effect-ts/dist/effect-ts.umd.js.map +1 -1
  86. package/effect-ts/dist/index.d.ts +0 -1
  87. package/effect-ts/src/__tests__/Form.tsx +30 -4
  88. package/effect-ts/src/__tests__/__fixtures__/data.ts +1 -1
  89. package/effect-ts/src/__tests__/__snapshots__/effect-ts.ts.snap +35 -1
  90. package/effect-ts/src/__tests__/effect-ts.ts +61 -0
  91. package/effect-ts/src/effect-ts.ts +60 -13
  92. package/effect-ts/src/index.ts +0 -1
  93. package/fluentvalidation-ts/dist/fluentvalidation-ts.d.ts +21 -0
  94. package/fluentvalidation-ts/dist/fluentvalidation-ts.js +1 -1
  95. package/fluentvalidation-ts/dist/fluentvalidation-ts.js.map +1 -1
  96. package/fluentvalidation-ts/dist/fluentvalidation-ts.mjs +1 -1
  97. package/fluentvalidation-ts/dist/fluentvalidation-ts.modern.mjs +1 -1
  98. package/fluentvalidation-ts/dist/fluentvalidation-ts.modern.mjs.map +1 -1
  99. package/fluentvalidation-ts/dist/fluentvalidation-ts.module.js +1 -1
  100. package/fluentvalidation-ts/dist/fluentvalidation-ts.module.js.map +1 -1
  101. package/fluentvalidation-ts/dist/fluentvalidation-ts.umd.js +1 -1
  102. package/fluentvalidation-ts/dist/fluentvalidation-ts.umd.js.map +1 -1
  103. package/fluentvalidation-ts/src/fluentvalidation-ts.ts +24 -3
  104. package/io-ts/dist/errorsToRecord.d.ts +5 -1
  105. package/io-ts/dist/index.d.ts +0 -1
  106. package/io-ts/dist/io-ts.d.ts +19 -2
  107. package/io-ts/dist/io-ts.js +1 -1
  108. package/io-ts/dist/io-ts.js.map +1 -1
  109. package/io-ts/dist/io-ts.mjs +1 -1
  110. package/io-ts/dist/io-ts.modern.mjs +1 -1
  111. package/io-ts/dist/io-ts.modern.mjs.map +1 -1
  112. package/io-ts/dist/io-ts.module.js +1 -1
  113. package/io-ts/dist/io-ts.module.js.map +1 -1
  114. package/io-ts/dist/io-ts.umd.js +1 -1
  115. package/io-ts/dist/io-ts.umd.js.map +1 -1
  116. package/io-ts/src/__tests__/Form-native-validation.tsx +4 -11
  117. package/io-ts/src/__tests__/Form.tsx +30 -6
  118. package/io-ts/src/__tests__/__fixtures__/data.ts +2 -19
  119. package/io-ts/src/errorsToRecord.ts +4 -1
  120. package/io-ts/src/index.ts +0 -1
  121. package/io-ts/src/io-ts.ts +47 -25
  122. package/joi/dist/joi.d.ts +17 -0
  123. package/joi/dist/joi.js.map +1 -1
  124. package/joi/dist/joi.modern.mjs.map +1 -1
  125. package/joi/dist/joi.module.js.map +1 -1
  126. package/joi/dist/joi.umd.js.map +1 -1
  127. package/joi/src/joi.ts +17 -0
  128. package/nope/dist/nope.d.ts +17 -0
  129. package/nope/dist/nope.js +1 -1
  130. package/nope/dist/nope.js.map +1 -1
  131. package/nope/dist/nope.mjs +1 -1
  132. package/nope/dist/nope.modern.mjs.map +1 -1
  133. package/nope/dist/nope.module.js +1 -1
  134. package/nope/dist/nope.module.js.map +1 -1
  135. package/nope/dist/nope.umd.js +1 -1
  136. package/nope/dist/nope.umd.js.map +1 -1
  137. package/nope/src/nope.ts +17 -0
  138. package/package.json +49 -34
  139. package/standard-schema/dist/index.d.ts +1 -0
  140. package/standard-schema/dist/standard-schema.d.ts +25 -0
  141. package/standard-schema/dist/standard-schema.js +2 -0
  142. package/standard-schema/dist/standard-schema.js.map +1 -0
  143. package/standard-schema/dist/standard-schema.mjs +2 -0
  144. package/standard-schema/dist/standard-schema.modern.mjs +2 -0
  145. package/standard-schema/dist/standard-schema.modern.mjs.map +1 -0
  146. package/standard-schema/dist/standard-schema.module.js +2 -0
  147. package/standard-schema/dist/standard-schema.module.js.map +1 -0
  148. package/standard-schema/dist/standard-schema.umd.js +2 -0
  149. package/standard-schema/dist/standard-schema.umd.js.map +1 -0
  150. package/standard-schema/package.json +18 -0
  151. package/standard-schema/src/__tests__/Form-native-validation.tsx +82 -0
  152. package/standard-schema/src/__tests__/Form.tsx +82 -0
  153. package/standard-schema/src/__tests__/__fixtures__/data.ts +88 -0
  154. package/standard-schema/src/__tests__/__snapshots__/standard-schema.ts.snap +250 -0
  155. package/standard-schema/src/__tests__/standard-schema.ts +56 -0
  156. package/standard-schema/src/index.ts +1 -0
  157. package/standard-schema/src/standard-schema.ts +88 -0
  158. package/superstruct/dist/index.d.ts +0 -1
  159. package/superstruct/dist/superstruct.d.ts +22 -2
  160. package/superstruct/dist/superstruct.js +1 -1
  161. package/superstruct/dist/superstruct.js.map +1 -1
  162. package/superstruct/dist/superstruct.mjs +1 -1
  163. package/superstruct/dist/superstruct.modern.mjs +1 -1
  164. package/superstruct/dist/superstruct.modern.mjs.map +1 -1
  165. package/superstruct/dist/superstruct.module.js +1 -1
  166. package/superstruct/dist/superstruct.module.js.map +1 -1
  167. package/superstruct/dist/superstruct.umd.js +1 -1
  168. package/superstruct/dist/superstruct.umd.js.map +1 -1
  169. package/superstruct/src/__tests__/Form.tsx +26 -0
  170. package/superstruct/src/__tests__/__fixtures__/data.ts +1 -1
  171. package/superstruct/src/index.ts +0 -1
  172. package/superstruct/src/superstruct.ts +32 -10
  173. package/typanion/dist/index.d.ts +0 -1
  174. package/typanion/dist/typanion.d.ts +18 -2
  175. package/typanion/dist/typanion.js.map +1 -1
  176. package/typanion/dist/typanion.mjs +1 -1
  177. package/typanion/dist/typanion.modern.mjs +1 -1
  178. package/typanion/dist/typanion.modern.mjs.map +1 -1
  179. package/typanion/dist/typanion.module.js +1 -1
  180. package/typanion/dist/typanion.module.js.map +1 -1
  181. package/typanion/dist/typanion.umd.js.map +1 -1
  182. package/typanion/src/__tests__/Form-native-validation.tsx +6 -14
  183. package/typanion/src/__tests__/Form.tsx +32 -8
  184. package/typanion/src/__tests__/__fixtures__/data.ts +9 -9
  185. package/typanion/src/__tests__/typanion.ts +3 -3
  186. package/typanion/src/index.ts +0 -1
  187. package/typanion/src/typanion.ts +32 -9
  188. package/typebox/dist/index.d.ts +0 -1
  189. package/typebox/dist/typebox.d.ts +20 -2
  190. package/typebox/dist/typebox.js +1 -1
  191. package/typebox/dist/typebox.js.map +1 -1
  192. package/typebox/dist/typebox.mjs +1 -1
  193. package/typebox/dist/typebox.modern.mjs +1 -1
  194. package/typebox/dist/typebox.modern.mjs.map +1 -1
  195. package/typebox/dist/typebox.module.js +1 -1
  196. package/typebox/dist/typebox.module.js.map +1 -1
  197. package/typebox/dist/typebox.umd.js +1 -1
  198. package/typebox/dist/typebox.umd.js.map +1 -1
  199. package/typebox/src/__tests__/Form-compiler.tsx +4 -8
  200. package/typebox/src/__tests__/Form.tsx +32 -6
  201. package/typebox/src/__tests__/__fixtures__/data.ts +1 -1
  202. package/typebox/src/__tests__/__snapshots__/typebox-compiler.ts.snap +21 -21
  203. package/typebox/src/__tests__/__snapshots__/typebox.ts.snap +21 -21
  204. package/typebox/src/index.ts +0 -1
  205. package/typebox/src/typebox.ts +33 -7
  206. package/typeschema/dist/typeschema.d.ts +17 -0
  207. package/typeschema/dist/typeschema.js +1 -1
  208. package/typeschema/dist/typeschema.js.map +1 -1
  209. package/typeschema/dist/typeschema.mjs +1 -1
  210. package/typeschema/dist/typeschema.modern.mjs +1 -1
  211. package/typeschema/dist/typeschema.modern.mjs.map +1 -1
  212. package/typeschema/dist/typeschema.module.js +1 -1
  213. package/typeschema/dist/typeschema.module.js.map +1 -1
  214. package/typeschema/dist/typeschema.umd.js +1 -1
  215. package/typeschema/dist/typeschema.umd.js.map +1 -1
  216. package/typeschema/src/typeschema.ts +20 -1
  217. package/valibot/dist/index.d.ts +0 -1
  218. package/valibot/dist/valibot.d.ts +31 -2
  219. package/valibot/dist/valibot.js +1 -1
  220. package/valibot/dist/valibot.js.map +1 -1
  221. package/valibot/dist/valibot.mjs +1 -1
  222. package/valibot/dist/valibot.modern.mjs +1 -1
  223. package/valibot/dist/valibot.modern.mjs.map +1 -1
  224. package/valibot/dist/valibot.module.js +1 -1
  225. package/valibot/dist/valibot.module.js.map +1 -1
  226. package/valibot/dist/valibot.umd.js +1 -1
  227. package/valibot/dist/valibot.umd.js.map +1 -1
  228. package/valibot/package.json +1 -1
  229. package/valibot/src/__tests__/Form.tsx +26 -0
  230. package/valibot/src/__tests__/__fixtures__/data.ts +7 -3
  231. package/valibot/src/__tests__/valibot.ts +1 -1
  232. package/valibot/src/index.ts +0 -1
  233. package/valibot/src/valibot.ts +55 -6
  234. package/vest/dist/vest.d.ts +18 -0
  235. package/vest/dist/vest.js.map +1 -1
  236. package/vest/dist/vest.modern.mjs.map +1 -1
  237. package/vest/dist/vest.module.js.map +1 -1
  238. package/vest/dist/vest.umd.js.map +1 -1
  239. package/vest/src/vest.ts +18 -0
  240. package/vine/dist/index.d.ts +0 -1
  241. package/vine/dist/vine.d.ts +25 -2
  242. package/vine/dist/vine.js +1 -1
  243. package/vine/dist/vine.js.map +1 -1
  244. package/vine/dist/vine.mjs +1 -1
  245. package/vine/dist/vine.modern.mjs +1 -1
  246. package/vine/dist/vine.modern.mjs.map +1 -1
  247. package/vine/dist/vine.module.js +1 -1
  248. package/vine/dist/vine.module.js.map +1 -1
  249. package/vine/dist/vine.umd.js +1 -1
  250. package/vine/dist/vine.umd.js.map +1 -1
  251. package/vine/src/__tests__/Form-native-validation.tsx +2 -4
  252. package/vine/src/__tests__/Form.tsx +30 -6
  253. package/vine/src/__tests__/__fixtures__/data.ts +1 -1
  254. package/vine/src/index.ts +0 -1
  255. package/vine/src/vine.ts +38 -10
  256. package/yup/dist/yup.d.ts +18 -7
  257. package/yup/dist/yup.js +1 -1
  258. package/yup/dist/yup.js.map +1 -1
  259. package/yup/dist/yup.mjs +1 -1
  260. package/yup/dist/yup.modern.mjs +1 -1
  261. package/yup/dist/yup.modern.mjs.map +1 -1
  262. package/yup/dist/yup.module.js +1 -1
  263. package/yup/dist/yup.module.js.map +1 -1
  264. package/yup/dist/yup.umd.js +1 -1
  265. package/yup/dist/yup.umd.js.map +1 -1
  266. package/yup/src/yup.ts +22 -11
  267. package/zod/dist/index.d.ts +0 -1
  268. package/zod/dist/zod.d.ts +25 -2
  269. package/zod/dist/zod.js +1 -1
  270. package/zod/dist/zod.js.map +1 -1
  271. package/zod/dist/zod.mjs +1 -1
  272. package/zod/dist/zod.modern.mjs +1 -1
  273. package/zod/dist/zod.modern.mjs.map +1 -1
  274. package/zod/dist/zod.module.js +1 -1
  275. package/zod/dist/zod.module.js.map +1 -1
  276. package/zod/dist/zod.umd.js +1 -1
  277. package/zod/dist/zod.umd.js.map +1 -1
  278. package/zod/src/__tests__/Form.tsx +30 -6
  279. package/zod/src/__tests__/__fixtures__/data.ts +3 -3
  280. package/zod/src/index.ts +0 -1
  281. package/zod/src/zod.ts +40 -9
  282. package/arktype/dist/types.d.ts +0 -9
  283. package/arktype/src/types.ts +0 -18
  284. package/class-validator/dist/types.d.ts +0 -12
  285. package/class-validator/src/types.ts +0 -16
  286. package/computed-types/dist/types.d.ts +0 -2
  287. package/computed-types/src/types.ts +0 -13
  288. package/effect-ts/dist/types.d.ts +0 -4
  289. package/effect-ts/src/types.ts +0 -12
  290. package/io-ts/dist/types.d.ts +0 -7
  291. package/io-ts/src/types.ts +0 -18
  292. package/superstruct/dist/types.d.ts +0 -11
  293. package/superstruct/src/types.ts +0 -20
  294. package/typanion/dist/types.d.ts +0 -9
  295. package/typanion/src/types.ts +0 -20
  296. package/typebox/dist/types.d.ts +0 -4
  297. package/typebox/src/types.ts +0 -11
  298. package/valibot/dist/types.d.ts +0 -13
  299. package/valibot/src/types.ts +0 -34
  300. package/vine/dist/types.d.ts +0 -6
  301. package/vine/src/types.ts +0 -13
  302. package/zod/dist/types.d.ts +0 -13
  303. package/zod/src/types.ts +0 -22
@@ -0,0 +1,88 @@
1
+ import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';
2
+ import { StandardSchemaV1 } from '@standard-schema/spec';
3
+ import { FieldError, FieldValues, Resolver } from 'react-hook-form';
4
+
5
+ function parseIssues(
6
+ issues: readonly StandardSchemaV1.Issue[],
7
+ validateAllFieldCriteria: boolean,
8
+ ) {
9
+ const errors: Record<string, FieldError> = {};
10
+
11
+ for (let i = 0; i < issues.length; i++) {
12
+ const error = issues[i];
13
+ const path = error.path?.join('.');
14
+
15
+ if (path) {
16
+ if (!errors[path]) {
17
+ errors[path] = { message: error.message, type: '' };
18
+ }
19
+
20
+ if (validateAllFieldCriteria) {
21
+ const types = errors[path].types || {};
22
+
23
+ errors[path].types = {
24
+ ...types,
25
+ [Object.keys(types).length]: error.message,
26
+ };
27
+ }
28
+ }
29
+ }
30
+
31
+ return errors;
32
+ }
33
+
34
+ /**
35
+ * Creates a resolver for react-hook-form that validates data using a Standard Schema.
36
+ *
37
+ * @param {Schema} schema - The Standard Schema to validate against
38
+ * @param {Object} resolverOptions - Options for the resolver
39
+ * @param {boolean} [resolverOptions.raw=false] - Whether to return raw input values instead of parsed values
40
+ * @returns {Resolver} A resolver function compatible with react-hook-form
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * const schema = z.object({
45
+ * name: z.string().min(2),
46
+ * age: z.number().min(18)
47
+ * });
48
+ *
49
+ * useForm({
50
+ * resolver: standardSchemaResolver(schema)
51
+ * });
52
+ * ```
53
+ */
54
+ export function standardSchemaResolver<
55
+ TFieldValues extends FieldValues,
56
+ Schema extends StandardSchemaV1<TFieldValues, any>,
57
+ >(
58
+ schema: Schema,
59
+ resolverOptions: {
60
+ raw?: boolean;
61
+ } = {},
62
+ ): Resolver<NonNullable<(typeof schema)['~standard']['types']>['output']> {
63
+ return async (values: TFieldValues, _, options) => {
64
+ let result = schema['~standard'].validate(values);
65
+ if (result instanceof Promise) {
66
+ result = await result;
67
+ }
68
+
69
+ if (result.issues) {
70
+ const errors = parseIssues(
71
+ result.issues,
72
+ !options.shouldUseNativeValidation && options.criteriaMode === 'all',
73
+ );
74
+
75
+ return {
76
+ values: {},
77
+ errors: toNestErrors(errors, options),
78
+ };
79
+ }
80
+
81
+ options.shouldUseNativeValidation && validateFieldsNatively({}, options);
82
+
83
+ return {
84
+ values: resolverOptions.raw ? Object.assign({}, values) : result.value,
85
+ errors: {},
86
+ };
87
+ };
88
+ }
@@ -1,2 +1 @@
1
1
  export * from './superstruct';
2
- export * from './types';
@@ -1,2 +1,22 @@
1
- import { Resolver } from './types';
2
- export declare const superstructResolver: Resolver;
1
+ import { FieldValues, Resolver } from 'react-hook-form';
2
+ import { Infer, Struct, validate } from 'superstruct';
3
+ /**
4
+ * Creates a resolver for react-hook-form using Superstruct schema validation
5
+ * @param {Struct<TFieldValues, any>} schema - The Superstruct schema to validate against
6
+ * @param {Parameters<typeof validate>[2]} [schemaOptions] - Optional Superstruct validation options
7
+ * @param {Object} resolverOptions - Additional resolver configuration
8
+ * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values rather than validated results
9
+ * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form
10
+ * @example
11
+ * const schema = struct({
12
+ * name: string(),
13
+ * age: number()
14
+ * });
15
+ *
16
+ * useForm({
17
+ * resolver: superstructResolver(schema)
18
+ * });
19
+ */
20
+ export declare function superstructResolver<TFieldValues extends FieldValues>(schema: Struct<TFieldValues, any>, schemaOptions?: Parameters<typeof validate>[2], resolverOptions?: {
21
+ raw?: boolean;
22
+ }): Resolver<Infer<typeof schema>>;
@@ -1,2 +1,2 @@
1
- var e=require("@hookform/resolvers"),r=require("superstruct");exports.superstructResolver=function(s,t,a){return void 0===a&&(a={}),function(o,u,i){var l,n=r.validate(o,s,t);return n[0]?{values:{},errors:e.toNestErrors((l=n[0],l.failures().reduce(function(e,r){return(e[r.path.join(".")]={message:r.message,type:r.type})&&e},{})),i)}:(i.shouldUseNativeValidation&&e.validateFieldsNatively({},i),{values:a.raw?o:n[1],errors:{}})}};
1
+ var e=require("@hookform/resolvers"),r=require("superstruct");exports.superstructResolver=function(s,t,a){return void 0===a&&(a={}),function(o,u,i){var n,l=r.validate(o,s,t);return l[0]?{values:{},errors:e.toNestErrors((n=l[0],n.failures().reduce(function(e,r){return(e[r.path.join(".")]={message:r.message,type:r.type})&&e},{})),i)}:(i.shouldUseNativeValidation&&e.validateFieldsNatively({},i),{values:a.raw?Object.assign({},o):l[1],errors:{}})}};
2
2
  //# sourceMappingURL=superstruct.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"superstruct.js","sources":["../src/superstruct.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { FieldError } from 'react-hook-form';\n\nimport { StructError, validate } from 'superstruct';\nimport { Resolver } from './types';\n\nconst parseErrorSchema = (error: StructError) =>\n error.failures().reduce<Record<string, FieldError>>(\n (previous, error) =>\n (previous[error.path.join('.')] = {\n message: error.message,\n type: error.type,\n }) && previous,\n {},\n );\n\nexport const superstructResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n (values, _, options) => {\n const result = validate(values, schema, schemaOptions);\n\n if (result[0]) {\n return {\n values: {},\n errors: toNestErrors(parseErrorSchema(result[0]), options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? values : result[1],\n errors: {},\n };\n };\n"],"names":["schema","schemaOptions","resolverOptions","values","_","options","error","result","validate","errors","toNestErrors","failures","reduce","previous","path","join","message","type","shouldUseNativeValidation","validateFieldsNatively","raw"],"mappings":"0FAiBE,SAACA,EAAQC,EAAeC,GACxB,YADwBA,IAAAA,IAAAA,EAAkB,CAAA,GAC1C,SAACC,EAAQC,EAAGC,GACV,IAbsBC,EAahBC,EAASC,EAAQA,SAACL,EAAQH,EAAQC,GAExC,OAAIM,EAAO,GACF,CACLJ,OAAQ,CAAE,EACVM,OAAQC,EAAAA,cAlBUJ,EAkBoBC,EAAO,GAjBnDD,EAAMK,WAAWC,OACf,SAACC,EAAUP,GACT,OAACO,EAASP,EAAMQ,KAAKC,KAAK,MAAQ,CAChCC,QAASV,EAAMU,QACfC,KAAMX,EAAMW,QACRJ,CAAQ,EAChB,CAAA,IAWsDR,KAItDA,EAAQa,2BAA6BC,EAAAA,uBAAuB,CAAE,EAAEd,GAEzD,CACLF,OAAQD,EAAgBkB,IAAMjB,EAASI,EAAO,GAC9CE,OAAQ,CAAA,GAEZ,CAAC"}
1
+ {"version":3,"file":"superstruct.js","sources":["../src/superstruct.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { FieldError, FieldValues, Resolver } from 'react-hook-form';\nimport { Infer, Struct, StructError, validate } from 'superstruct';\n\nfunction parseErrorSchema(error: StructError) {\n return error.failures().reduce<Record<string, FieldError>>(\n (previous, error) =>\n (previous[error.path.join('.')] = {\n message: error.message,\n type: error.type,\n }) && previous,\n {},\n );\n}\n\n/**\n * Creates a resolver for react-hook-form using Superstruct schema validation\n * @param {Struct<TFieldValues, any>} schema - The Superstruct schema to validate against\n * @param {Parameters<typeof validate>[2]} [schemaOptions] - Optional Superstruct validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values rather than validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = struct({\n * name: string(),\n * age: number()\n * });\n *\n * useForm({\n * resolver: superstructResolver(schema)\n * });\n */\nexport function superstructResolver<TFieldValues extends FieldValues>(\n schema: Struct<TFieldValues, any>,\n schemaOptions?: Parameters<typeof validate>[2],\n resolverOptions: {\n raw?: boolean;\n } = {},\n): Resolver<Infer<typeof schema>> {\n return (values, _, options) => {\n const result = validate(values, schema, schemaOptions);\n\n if (result[0]) {\n return {\n values: {},\n errors: toNestErrors(parseErrorSchema(result[0]), options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result[1],\n errors: {},\n };\n };\n}\n"],"names":["schema","schemaOptions","resolverOptions","values","_","options","error","result","validate","errors","toNestErrors","failures","reduce","previous","path","join","message","type","shouldUseNativeValidation","validateFieldsNatively","raw","Object","assign"],"mappings":"mGAiCEA,EACAC,EACAC,GAIA,gBAJAA,IAAAA,EAEI,CAAE,GAEEC,SAAAA,EAAQC,EAAGC,GACjB,IApCsBC,EAoChBC,EAASC,EAAAA,SAASL,EAAQH,EAAQC,GAExC,OAAIM,EAAO,GACF,CACLJ,OAAQ,CAAA,EACRM,OAAQC,EAAYA,cAzCFJ,EAyCoBC,EAAO,GAxC5CD,EAAMK,WAAWC,OACtB,SAACC,EAAUP,GACT,OAACO,EAASP,EAAMQ,KAAKC,KAAK,MAAQ,CAChCC,QAASV,EAAMU,QACfC,KAAMX,EAAMW,QACRJ,CAAQ,EAChB,CAAA,IAkCsDR,KAItDA,EAAQa,2BAA6BC,yBAAuB,CAAA,EAAId,GAEzD,CACLF,OAAQD,EAAgBkB,IAAMC,OAAOC,OAAO,CAAE,EAAEnB,GAAUI,EAAO,GACjEE,OAAQ,CAAA,GAEZ,CACF"}
@@ -1,2 +1,2 @@
1
- import{toNestErrors as r,validateFieldsNatively as e}from"@hookform/resolvers";import{validate as o}from"superstruct";var t=function(t,s,u){return void 0===u&&(u={}),function(a,i,n){var f,m=o(a,t,s);return m[0]?{values:{},errors:r((f=m[0],f.failures().reduce(function(r,e){return(r[e.path.join(".")]={message:e.message,type:e.type})&&r},{})),n)}:(n.shouldUseNativeValidation&&e({},n),{values:u.raw?a:m[1],errors:{}})}};export{t as superstructResolver};
1
+ import{toNestErrors as r,validateFieldsNatively as e}from"@hookform/resolvers";import{validate as o}from"superstruct";function s(s,t,u){return void 0===u&&(u={}),function(a,i,n){var f,m=o(a,s,t);return m[0]?{values:{},errors:r((f=m[0],f.failures().reduce(function(r,e){return(r[e.path.join(".")]={message:e.message,type:e.type})&&r},{})),n)}:(n.shouldUseNativeValidation&&e({},n),{values:u.raw?Object.assign({},a):m[1],errors:{}})}}export{s as superstructResolver};
2
2
  //# sourceMappingURL=superstruct.module.js.map
@@ -1,2 +1,2 @@
1
- import{toNestErrors as r,validateFieldsNatively as e}from"@hookform/resolvers";import{validate as s}from"superstruct";const o=(o,t,a={})=>(u,i,m)=>{const p=s(u,o,t);return p[0]?{values:{},errors:r((l=p[0],l.failures().reduce((r,e)=>(r[e.path.join(".")]={message:e.message,type:e.type})&&r,{})),m)}:(m.shouldUseNativeValidation&&e({},m),{values:a.raw?u:p[1],errors:{}});var l};export{o as superstructResolver};
1
+ import{toNestErrors as r,validateFieldsNatively as e}from"@hookform/resolvers";import{validate as s}from"superstruct";function o(o,t,a={}){return(u,i,n)=>{const m=s(u,o,t);return m[0]?{values:{},errors:r((p=m[0],p.failures().reduce((r,e)=>(r[e.path.join(".")]={message:e.message,type:e.type})&&r,{})),n)}:(n.shouldUseNativeValidation&&e({},n),{values:a.raw?Object.assign({},u):m[1],errors:{}});var p}}export{o as superstructResolver};
2
2
  //# sourceMappingURL=superstruct.modern.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"superstruct.modern.mjs","sources":["../src/superstruct.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { FieldError } from 'react-hook-form';\n\nimport { StructError, validate } from 'superstruct';\nimport { Resolver } from './types';\n\nconst parseErrorSchema = (error: StructError) =>\n error.failures().reduce<Record<string, FieldError>>(\n (previous, error) =>\n (previous[error.path.join('.')] = {\n message: error.message,\n type: error.type,\n }) && previous,\n {},\n );\n\nexport const superstructResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n (values, _, options) => {\n const result = validate(values, schema, schemaOptions);\n\n if (result[0]) {\n return {\n values: {},\n errors: toNestErrors(parseErrorSchema(result[0]), options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? values : result[1],\n errors: {},\n };\n };\n"],"names":["superstructResolver","schema","schemaOptions","resolverOptions","values","_","options","result","validate","errors","toNestErrors","error","failures","reduce","previous","path","join","message","type","shouldUseNativeValidation","validateFieldsNatively","raw"],"mappings":"sHAMA,MAUaA,EACXA,CAACC,EAAQC,EAAeC,EAAkB,CAAE,IAC5C,CAACC,EAAQC,EAAGC,KACV,MAAMC,EAASC,EAASJ,EAAQH,EAAQC,GAExC,OAAIK,EAAO,GACF,CACLH,OAAQ,CAAA,EACRK,OAAQC,GAlBUC,EAkBoBJ,EAAO,GAjBnDI,EAAMC,WAAWC,OACf,CAACC,EAAUH,KACRG,EAASH,EAAMI,KAAKC,KAAK,MAAQ,CAChCC,QAASN,EAAMM,QACfC,KAAMP,EAAMO,QACRJ,EACR,CAAA,IAWsDR,KAItDA,EAAQa,2BAA6BC,EAAuB,CAAE,EAAEd,GAEzD,CACLF,OAAQD,EAAgBkB,IAAMjB,EAASG,EAAO,GAC9CE,OAAQ,KA1BYE"}
1
+ {"version":3,"file":"superstruct.modern.mjs","sources":["../src/superstruct.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { FieldError, FieldValues, Resolver } from 'react-hook-form';\nimport { Infer, Struct, StructError, validate } from 'superstruct';\n\nfunction parseErrorSchema(error: StructError) {\n return error.failures().reduce<Record<string, FieldError>>(\n (previous, error) =>\n (previous[error.path.join('.')] = {\n message: error.message,\n type: error.type,\n }) && previous,\n {},\n );\n}\n\n/**\n * Creates a resolver for react-hook-form using Superstruct schema validation\n * @param {Struct<TFieldValues, any>} schema - The Superstruct schema to validate against\n * @param {Parameters<typeof validate>[2]} [schemaOptions] - Optional Superstruct validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values rather than validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = struct({\n * name: string(),\n * age: number()\n * });\n *\n * useForm({\n * resolver: superstructResolver(schema)\n * });\n */\nexport function superstructResolver<TFieldValues extends FieldValues>(\n schema: Struct<TFieldValues, any>,\n schemaOptions?: Parameters<typeof validate>[2],\n resolverOptions: {\n raw?: boolean;\n } = {},\n): Resolver<Infer<typeof schema>> {\n return (values, _, options) => {\n const result = validate(values, schema, schemaOptions);\n\n if (result[0]) {\n return {\n values: {},\n errors: toNestErrors(parseErrorSchema(result[0]), options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result[1],\n errors: {},\n };\n };\n}\n"],"names":["superstructResolver","schema","schemaOptions","resolverOptions","values","_","options","result","validate","errors","toNestErrors","error","failures","reduce","previous","path","join","message","type","shouldUseNativeValidation","validateFieldsNatively","raw","Object","assign"],"mappings":"sHAgCgB,SAAAA,EACdC,EACAC,EACAC,EAEI,CAAE,GAEN,MAAO,CAACC,EAAQC,EAAGC,KACjB,MAAMC,EAASC,EAASJ,EAAQH,EAAQC,GAExC,OAAIK,EAAO,GACF,CACLH,OAAQ,CAAA,EACRK,OAAQC,GAzCUC,EAyCoBJ,EAAO,GAxC5CI,EAAMC,WAAWC,OACtB,CAACC,EAAUH,KACRG,EAASH,EAAMI,KAAKC,KAAK,MAAQ,CAChCC,QAASN,EAAMM,QACfC,KAAMP,EAAMO,QACRJ,EACR,KAkCsDR,KAItDA,EAAQa,2BAA6BC,EAAuB,GAAId,GAEzD,CACLF,OAAQD,EAAgBkB,IAAMC,OAAOC,OAAO,CAAA,EAAInB,GAAUG,EAAO,GACjEE,OAAQ,CAAA,IAjDd,IAA0BE,EAoD1B"}
@@ -1,2 +1,2 @@
1
- import{toNestErrors as r,validateFieldsNatively as e}from"@hookform/resolvers";import{validate as o}from"superstruct";var t=function(t,s,u){return void 0===u&&(u={}),function(a,i,n){var f,m=o(a,t,s);return m[0]?{values:{},errors:r((f=m[0],f.failures().reduce(function(r,e){return(r[e.path.join(".")]={message:e.message,type:e.type})&&r},{})),n)}:(n.shouldUseNativeValidation&&e({},n),{values:u.raw?a:m[1],errors:{}})}};export{t as superstructResolver};
1
+ import{toNestErrors as r,validateFieldsNatively as e}from"@hookform/resolvers";import{validate as o}from"superstruct";function s(s,t,u){return void 0===u&&(u={}),function(a,i,n){var f,m=o(a,s,t);return m[0]?{values:{},errors:r((f=m[0],f.failures().reduce(function(r,e){return(r[e.path.join(".")]={message:e.message,type:e.type})&&r},{})),n)}:(n.shouldUseNativeValidation&&e({},n),{values:u.raw?Object.assign({},a):m[1],errors:{}})}}export{s as superstructResolver};
2
2
  //# sourceMappingURL=superstruct.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"superstruct.module.js","sources":["../src/superstruct.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { FieldError } from 'react-hook-form';\n\nimport { StructError, validate } from 'superstruct';\nimport { Resolver } from './types';\n\nconst parseErrorSchema = (error: StructError) =>\n error.failures().reduce<Record<string, FieldError>>(\n (previous, error) =>\n (previous[error.path.join('.')] = {\n message: error.message,\n type: error.type,\n }) && previous,\n {},\n );\n\nexport const superstructResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n (values, _, options) => {\n const result = validate(values, schema, schemaOptions);\n\n if (result[0]) {\n return {\n values: {},\n errors: toNestErrors(parseErrorSchema(result[0]), options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? values : result[1],\n errors: {},\n };\n };\n"],"names":["superstructResolver","schema","schemaOptions","resolverOptions","values","_","options","error","result","validate","errors","toNestErrors","failures","reduce","previous","path","join","message","type","shouldUseNativeValidation","validateFieldsNatively","raw"],"mappings":"sHAMA,IAUaA,EACX,SAACC,EAAQC,EAAeC,GACxB,YADwBA,IAAAA,IAAAA,EAAkB,CAAA,GAC1C,SAACC,EAAQC,EAAGC,GACV,IAbsBC,EAahBC,EAASC,EAASL,EAAQH,EAAQC,GAExC,OAAIM,EAAO,GACF,CACLJ,OAAQ,CAAE,EACVM,OAAQC,GAlBUJ,EAkBoBC,EAAO,GAjBnDD,EAAMK,WAAWC,OACf,SAACC,EAAUP,GACT,OAACO,EAASP,EAAMQ,KAAKC,KAAK,MAAQ,CAChCC,QAASV,EAAMU,QACfC,KAAMX,EAAMW,QACRJ,CAAQ,EAChB,CAAA,IAWsDR,KAItDA,EAAQa,2BAA6BC,EAAuB,CAAE,EAAEd,GAEzD,CACLF,OAAQD,EAAgBkB,IAAMjB,EAASI,EAAO,GAC9CE,OAAQ,CAAA,GAEZ,CAAC"}
1
+ {"version":3,"file":"superstruct.module.js","sources":["../src/superstruct.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { FieldError, FieldValues, Resolver } from 'react-hook-form';\nimport { Infer, Struct, StructError, validate } from 'superstruct';\n\nfunction parseErrorSchema(error: StructError) {\n return error.failures().reduce<Record<string, FieldError>>(\n (previous, error) =>\n (previous[error.path.join('.')] = {\n message: error.message,\n type: error.type,\n }) && previous,\n {},\n );\n}\n\n/**\n * Creates a resolver for react-hook-form using Superstruct schema validation\n * @param {Struct<TFieldValues, any>} schema - The Superstruct schema to validate against\n * @param {Parameters<typeof validate>[2]} [schemaOptions] - Optional Superstruct validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values rather than validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = struct({\n * name: string(),\n * age: number()\n * });\n *\n * useForm({\n * resolver: superstructResolver(schema)\n * });\n */\nexport function superstructResolver<TFieldValues extends FieldValues>(\n schema: Struct<TFieldValues, any>,\n schemaOptions?: Parameters<typeof validate>[2],\n resolverOptions: {\n raw?: boolean;\n } = {},\n): Resolver<Infer<typeof schema>> {\n return (values, _, options) => {\n const result = validate(values, schema, schemaOptions);\n\n if (result[0]) {\n return {\n values: {},\n errors: toNestErrors(parseErrorSchema(result[0]), options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result[1],\n errors: {},\n };\n };\n}\n"],"names":["superstructResolver","schema","schemaOptions","resolverOptions","values","_","options","error","result","validate","errors","toNestErrors","failures","reduce","previous","path","join","message","type","shouldUseNativeValidation","validateFieldsNatively","raw","Object","assign"],"mappings":"+HAgCgBA,EACdC,EACAC,EACAC,GAIA,gBAJAA,IAAAA,EAEI,CAAE,GAEEC,SAAAA,EAAQC,EAAGC,GACjB,IApCsBC,EAoChBC,EAASC,EAASL,EAAQH,EAAQC,GAExC,OAAIM,EAAO,GACF,CACLJ,OAAQ,CAAA,EACRM,OAAQC,GAzCUJ,EAyCoBC,EAAO,GAxC5CD,EAAMK,WAAWC,OACtB,SAACC,EAAUP,GACT,OAACO,EAASP,EAAMQ,KAAKC,KAAK,MAAQ,CAChCC,QAASV,EAAMU,QACfC,KAAMX,EAAMW,QACRJ,CAAQ,EAChB,CAAA,IAkCsDR,KAItDA,EAAQa,2BAA6BC,EAAuB,CAAA,EAAId,GAEzD,CACLF,OAAQD,EAAgBkB,IAAMC,OAAOC,OAAO,CAAE,EAAEnB,GAAUI,EAAO,GACjEE,OAAQ,CAAA,GAEZ,CACF"}
@@ -1,2 +1,2 @@
1
- !function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@hookform/resolvers"),require("superstruct")):"function"==typeof define&&define.amd?define(["exports","@hookform/resolvers","superstruct"],r):r((e||self).hookformResolversSuperstruct={},e.hookformResolvers,e.superstruct)}(this,function(e,r,o){e.superstructResolver=function(e,s,t){return void 0===t&&(t={}),function(u,i,n){var f,l=o.validate(u,e,s);return l[0]?{values:{},errors:r.toNestErrors((f=l[0],f.failures().reduce(function(e,r){return(e[r.path.join(".")]={message:r.message,type:r.type})&&e},{})),n)}:(n.shouldUseNativeValidation&&r.validateFieldsNatively({},n),{values:t.raw?u:l[1],errors:{}})}}});
1
+ !function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@hookform/resolvers"),require("superstruct")):"function"==typeof define&&define.amd?define(["exports","@hookform/resolvers","superstruct"],r):r((e||self).hookformResolversSuperstruct={},e.hookformResolvers,e.superstruct)}(this,function(e,r,o){e.superstructResolver=function(e,s,t){return void 0===t&&(t={}),function(u,i,n){var f,a=o.validate(u,e,s);return a[0]?{values:{},errors:r.toNestErrors((f=a[0],f.failures().reduce(function(e,r){return(e[r.path.join(".")]={message:r.message,type:r.type})&&e},{})),n)}:(n.shouldUseNativeValidation&&r.validateFieldsNatively({},n),{values:t.raw?Object.assign({},u):a[1],errors:{}})}}});
2
2
  //# sourceMappingURL=superstruct.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"superstruct.umd.js","sources":["../src/superstruct.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { FieldError } from 'react-hook-form';\n\nimport { StructError, validate } from 'superstruct';\nimport { Resolver } from './types';\n\nconst parseErrorSchema = (error: StructError) =>\n error.failures().reduce<Record<string, FieldError>>(\n (previous, error) =>\n (previous[error.path.join('.')] = {\n message: error.message,\n type: error.type,\n }) && previous,\n {},\n );\n\nexport const superstructResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n (values, _, options) => {\n const result = validate(values, schema, schemaOptions);\n\n if (result[0]) {\n return {\n values: {},\n errors: toNestErrors(parseErrorSchema(result[0]), options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? values : result[1],\n errors: {},\n };\n };\n"],"names":["schema","schemaOptions","resolverOptions","values","_","options","error","result","validate","errors","toNestErrors","failures","reduce","previous","path","join","message","type","shouldUseNativeValidation","validateFieldsNatively","raw"],"mappings":"4YAiBE,SAACA,EAAQC,EAAeC,GACxB,YADwBA,IAAAA,IAAAA,EAAkB,CAAA,GAC1C,SAACC,EAAQC,EAAGC,GACV,IAbsBC,EAahBC,EAASC,EAAQA,SAACL,EAAQH,EAAQC,GAExC,OAAIM,EAAO,GACF,CACLJ,OAAQ,CAAE,EACVM,OAAQC,EAAAA,cAlBUJ,EAkBoBC,EAAO,GAjBnDD,EAAMK,WAAWC,OACf,SAACC,EAAUP,GACT,OAACO,EAASP,EAAMQ,KAAKC,KAAK,MAAQ,CAChCC,QAASV,EAAMU,QACfC,KAAMX,EAAMW,QACRJ,CAAQ,EAChB,CAAA,IAWsDR,KAItDA,EAAQa,2BAA6BC,EAAAA,uBAAuB,CAAE,EAAEd,GAEzD,CACLF,OAAQD,EAAgBkB,IAAMjB,EAASI,EAAO,GAC9CE,OAAQ,CAAA,GAEZ,CAAC"}
1
+ {"version":3,"file":"superstruct.umd.js","sources":["../src/superstruct.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { FieldError, FieldValues, Resolver } from 'react-hook-form';\nimport { Infer, Struct, StructError, validate } from 'superstruct';\n\nfunction parseErrorSchema(error: StructError) {\n return error.failures().reduce<Record<string, FieldError>>(\n (previous, error) =>\n (previous[error.path.join('.')] = {\n message: error.message,\n type: error.type,\n }) && previous,\n {},\n );\n}\n\n/**\n * Creates a resolver for react-hook-form using Superstruct schema validation\n * @param {Struct<TFieldValues, any>} schema - The Superstruct schema to validate against\n * @param {Parameters<typeof validate>[2]} [schemaOptions] - Optional Superstruct validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values rather than validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = struct({\n * name: string(),\n * age: number()\n * });\n *\n * useForm({\n * resolver: superstructResolver(schema)\n * });\n */\nexport function superstructResolver<TFieldValues extends FieldValues>(\n schema: Struct<TFieldValues, any>,\n schemaOptions?: Parameters<typeof validate>[2],\n resolverOptions: {\n raw?: boolean;\n } = {},\n): Resolver<Infer<typeof schema>> {\n return (values, _, options) => {\n const result = validate(values, schema, schemaOptions);\n\n if (result[0]) {\n return {\n values: {},\n errors: toNestErrors(parseErrorSchema(result[0]), options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result[1],\n errors: {},\n };\n };\n}\n"],"names":["schema","schemaOptions","resolverOptions","values","_","options","error","result","validate","errors","toNestErrors","failures","reduce","previous","path","join","message","type","shouldUseNativeValidation","validateFieldsNatively","raw","Object","assign"],"mappings":"qZAiCEA,EACAC,EACAC,GAIA,gBAJAA,IAAAA,EAEI,CAAE,GAEEC,SAAAA,EAAQC,EAAGC,GACjB,IApCsBC,EAoChBC,EAASC,EAAAA,SAASL,EAAQH,EAAQC,GAExC,OAAIM,EAAO,GACF,CACLJ,OAAQ,CAAA,EACRM,OAAQC,EAAYA,cAzCFJ,EAyCoBC,EAAO,GAxC5CD,EAAMK,WAAWC,OACtB,SAACC,EAAUP,GACT,OAACO,EAASP,EAAMQ,KAAKC,KAAK,MAAQ,CAChCC,QAASV,EAAMU,QACfC,KAAMX,EAAMW,QACRJ,CAAQ,EAChB,CAAA,IAkCsDR,KAItDA,EAAQa,2BAA6BC,yBAAuB,CAAA,EAAId,GAEzD,CACLF,OAAQD,EAAgBkB,IAAMC,OAAOC,OAAO,CAAE,EAAEnB,GAAUI,EAAO,GACjEE,OAAQ,CAAA,GAEZ,CACF"}
@@ -58,3 +58,29 @@ test("form's validation with Superstruct and TypeScript's integration", async ()
58
58
  ).toBeInTheDocument();
59
59
  expect(handleSubmit).not.toHaveBeenCalled();
60
60
  });
61
+
62
+ export function TestComponentManualType({
63
+ onSubmit,
64
+ }: {
65
+ onSubmit: (data: FormData) => void;
66
+ }) {
67
+ const {
68
+ register,
69
+ handleSubmit,
70
+ formState: { errors },
71
+ } = useForm<Infer<typeof schema>, undefined, FormData>({
72
+ resolver: superstructResolver(schema), // Useful to check TypeScript regressions
73
+ });
74
+
75
+ return (
76
+ <form onSubmit={handleSubmit(onSubmit)}>
77
+ <input {...register('username')} />
78
+ {errors.username && <span role="alert">{errors.username.message}</span>}
79
+
80
+ <input {...register('password')} />
81
+ {errors.password && <span role="alert">{errors.password.message}</span>}
82
+
83
+ <button type="submit">submit</button>
84
+ </form>
85
+ );
86
+ }
@@ -53,7 +53,7 @@ export const invalidData = {
53
53
  email: '',
54
54
  birthYear: 'birthYear',
55
55
  like: [{ id: 'z' }],
56
- };
56
+ } as any as Infer<typeof schema>;
57
57
 
58
58
  export const fields: Record<InternalFieldName, Field['_f']> = {
59
59
  username: {
@@ -1,2 +1 @@
1
1
  export * from './superstruct';
2
- export * from './types';
@@ -1,11 +1,9 @@
1
1
  import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';
2
- import { FieldError } from 'react-hook-form';
2
+ import { FieldError, FieldValues, Resolver } from 'react-hook-form';
3
+ import { Infer, Struct, StructError, validate } from 'superstruct';
3
4
 
4
- import { StructError, validate } from 'superstruct';
5
- import { Resolver } from './types';
6
-
7
- const parseErrorSchema = (error: StructError) =>
8
- error.failures().reduce<Record<string, FieldError>>(
5
+ function parseErrorSchema(error: StructError) {
6
+ return error.failures().reduce<Record<string, FieldError>>(
9
7
  (previous, error) =>
10
8
  (previous[error.path.join('.')] = {
11
9
  message: error.message,
@@ -13,10 +11,33 @@ const parseErrorSchema = (error: StructError) =>
13
11
  }) && previous,
14
12
  {},
15
13
  );
14
+ }
16
15
 
17
- export const superstructResolver: Resolver =
18
- (schema, schemaOptions, resolverOptions = {}) =>
19
- (values, _, options) => {
16
+ /**
17
+ * Creates a resolver for react-hook-form using Superstruct schema validation
18
+ * @param {Struct<TFieldValues, any>} schema - The Superstruct schema to validate against
19
+ * @param {Parameters<typeof validate>[2]} [schemaOptions] - Optional Superstruct validation options
20
+ * @param {Object} resolverOptions - Additional resolver configuration
21
+ * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values rather than validated results
22
+ * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form
23
+ * @example
24
+ * const schema = struct({
25
+ * name: string(),
26
+ * age: number()
27
+ * });
28
+ *
29
+ * useForm({
30
+ * resolver: superstructResolver(schema)
31
+ * });
32
+ */
33
+ export function superstructResolver<TFieldValues extends FieldValues>(
34
+ schema: Struct<TFieldValues, any>,
35
+ schemaOptions?: Parameters<typeof validate>[2],
36
+ resolverOptions: {
37
+ raw?: boolean;
38
+ } = {},
39
+ ): Resolver<Infer<typeof schema>> {
40
+ return (values, _, options) => {
20
41
  const result = validate(values, schema, schemaOptions);
21
42
 
22
43
  if (result[0]) {
@@ -29,7 +50,8 @@ export const superstructResolver: Resolver =
29
50
  options.shouldUseNativeValidation && validateFieldsNatively({}, options);
30
51
 
31
52
  return {
32
- values: resolverOptions.raw ? values : result[1],
53
+ values: resolverOptions.raw ? Object.assign({}, values) : result[1],
33
54
  errors: {},
34
55
  };
35
56
  };
57
+ }
@@ -1,2 +1 @@
1
1
  export * from './typanion';
2
- export * from './types';
@@ -1,2 +1,18 @@
1
- import type { Resolver } from './types';
2
- export declare const typanionResolver: Resolver;
1
+ import type { FieldValues, Resolver } from 'react-hook-form';
2
+ import * as t from 'typanion';
3
+ /**
4
+ * Creates a resolver for react-hook-form using Typanion schema validation
5
+ * @param {t.StrictValidator<TFieldValues, TFieldValues>} schema - The Typanion schema to validate against
6
+ * @param {Pick<t.ValidationState, 'coercions' | 'coercion'>} [schemaOptions] - Optional Typanion validation options
7
+ * @returns {Resolver<t.InferType<typeof schema>>} A resolver function compatible with react-hook-form
8
+ * @example
9
+ * const schema = t.isObject({
10
+ * name: t.isString(),
11
+ * age: t.isInteger()
12
+ * });
13
+ *
14
+ * useForm({
15
+ * resolver: typanionResolver(schema)
16
+ * });
17
+ */
18
+ export declare function typanionResolver<TFieldValues extends FieldValues>(schema: t.StrictValidator<TFieldValues, TFieldValues>, schemaOptions?: Pick<t.ValidationState, 'coercions' | 'coercion'>): Resolver<t.InferType<typeof schema>>;
@@ -1 +1 @@
1
- {"version":3,"file":"typanion.js","sources":["../src/typanion.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type { FieldError, FieldErrors } from 'react-hook-form';\nimport type { Resolver } from './types';\n\nconst parseErrors = (errors: string[], parsedErrors: FieldErrors = {}) => {\n return errors.reduce((acc, error) => {\n const fieldIndex = error.indexOf(':');\n\n const field = error.slice(1, fieldIndex);\n const message = error.slice(fieldIndex + 1).trim();\n\n acc[field] = {\n message,\n } as FieldError;\n\n return acc;\n }, parsedErrors);\n};\n\nexport const typanionResolver: Resolver =\n (validator, validatorOptions = {}) =>\n (values, _, options) => {\n const rawErrors: string[] = [];\n const isValid = validator(\n values,\n Object.assign(\n {},\n {\n errors: rawErrors,\n },\n validatorOptions,\n ),\n );\n const parsedErrors = parseErrors(rawErrors);\n\n if (isValid) {\n options.shouldUseNativeValidation &&\n validateFieldsNatively(parsedErrors, options);\n\n return { values, errors: {} };\n }\n\n return { values: {}, errors: toNestErrors(parsedErrors, options) };\n };\n"],"names":["validator","validatorOptions","values","_","options","rawErrors","isValid","Object","assign","errors","parsedErrors","reduce","acc","error","fieldIndex","indexOf","field","slice","message","trim","parseErrors","shouldUseNativeValidation","validateFieldsNatively","toNestErrors"],"mappings":"8DAoBE,SAACA,EAAWC,eAAgB,IAAhBA,IAAAA,EAAmB,CAAE,GAChCC,SAAAA,EAAQC,EAAGC,GACV,IAAMC,EAAsB,GACtBC,EAAUN,EACdE,EACAK,OAAOC,OACL,GACA,CACEC,OAAQJ,GAEVJ,IAGES,EA7BU,SAACD,EAAkBC,GACrC,YADqCA,IAAAA,IAAAA,EAA4B,CAAE,GAC5DD,EAAOE,OAAO,SAACC,EAAKC,GACzB,IAAMC,EAAaD,EAAME,QAAQ,KAE3BC,EAAQH,EAAMI,MAAM,EAAGH,GACvBI,EAAUL,EAAMI,MAAMH,EAAa,GAAGK,OAM5C,OAJAP,EAAII,GAAS,CACXE,QAAAA,GAGKN,CACT,EAAGF,EACL,CAgByBU,CAAYf,GAEjC,OAAIC,GACFF,EAAQiB,2BACNC,yBAAuBZ,EAAcN,GAEhC,CAAEF,OAAAA,EAAQO,OAAQ,CAAA,IAGpB,CAAEP,OAAQ,GAAIO,OAAQc,EAAYA,aAACb,EAAcN,GAC1D,CAAC"}
1
+ {"version":3,"file":"typanion.js","sources":["../src/typanion.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type {\n FieldError,\n FieldErrors,\n FieldValues,\n Resolver,\n} from 'react-hook-form';\nimport * as t from 'typanion';\n\nfunction parseErrors(errors: string[], parsedErrors: FieldErrors = {}) {\n return errors.reduce((acc, error) => {\n const fieldIndex = error.indexOf(':');\n\n const field = error.slice(1, fieldIndex);\n const message = error.slice(fieldIndex + 1).trim();\n\n acc[field] = {\n message,\n } as FieldError;\n\n return acc;\n }, parsedErrors);\n}\n\n/**\n * Creates a resolver for react-hook-form using Typanion schema validation\n * @param {t.StrictValidator<TFieldValues, TFieldValues>} schema - The Typanion schema to validate against\n * @param {Pick<t.ValidationState, 'coercions' | 'coercion'>} [schemaOptions] - Optional Typanion validation options\n * @returns {Resolver<t.InferType<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = t.isObject({\n * name: t.isString(),\n * age: t.isInteger()\n * });\n *\n * useForm({\n * resolver: typanionResolver(schema)\n * });\n */\nexport function typanionResolver<TFieldValues extends FieldValues>(\n schema: t.StrictValidator<TFieldValues, TFieldValues>,\n schemaOptions: Pick<t.ValidationState, 'coercions' | 'coercion'> = {},\n): Resolver<t.InferType<typeof schema>> {\n return (values, _, options) => {\n const rawErrors: string[] = [];\n const isValid = schema(\n values,\n Object.assign(\n {},\n {\n errors: rawErrors,\n },\n schemaOptions,\n ),\n );\n const parsedErrors = parseErrors(rawErrors);\n\n if (isValid) {\n options.shouldUseNativeValidation &&\n validateFieldsNatively(parsedErrors, options);\n\n return { values, errors: {} };\n }\n\n return { values: {}, errors: toNestErrors(parsedErrors, options) };\n };\n}\n"],"names":["schema","schemaOptions","values","_","options","rawErrors","isValid","Object","assign","errors","parsedErrors","reduce","acc","error","fieldIndex","indexOf","field","slice","message","trim","parseErrors","shouldUseNativeValidation","validateFieldsNatively","toNestErrors"],"mappings":"8DAuCgB,SACdA,EACAC,GAEA,YAFAA,IAAAA,IAAAA,EAAmE,CAAE,GAE7DC,SAAAA,EAAQC,EAAGC,GACjB,IAAMC,EAAsB,GACtBC,EAAUN,EACdE,EACAK,OAAOC,OACL,CAAE,EACF,CACEC,OAAQJ,GAEVJ,IAGES,EA9CV,SAAqBD,EAAkBC,GACrC,gBADqCA,IAAAA,EAA4B,IAC1DD,EAAOE,OAAO,SAACC,EAAKC,GACzB,IAAMC,EAAaD,EAAME,QAAQ,KAE3BC,EAAQH,EAAMI,MAAM,EAAGH,GACvBI,EAAUL,EAAMI,MAAMH,EAAa,GAAGK,OAM5C,OAJAP,EAAII,GAAS,CACXE,QAAAA,GAGKN,CACT,EAAGF,EACL,CAiCyBU,CAAYf,GAEjC,OAAIC,GACFF,EAAQiB,2BACNC,EAAAA,uBAAuBZ,EAAcN,GAEhC,CAAEF,OAAAA,EAAQO,OAAQ,CAAA,IAGpB,CAAEP,OAAQ,GAAIO,OAAQc,EAAYA,aAACb,EAAcN,GAC1D,CACF"}
@@ -1,2 +1,2 @@
1
- import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";var o=function(o,i){return void 0===i&&(i={}),function(n,s,t){var u=[],a=o(n,Object.assign({},{errors:u},i)),v=function(r,e){return void 0===e&&(e={}),r.reduce(function(r,e){var o=e.indexOf(":"),i=e.slice(1,o),n=e.slice(o+1).trim();return r[i]={message:n},r},e)}(u);return a?(t.shouldUseNativeValidation&&r(v,t),{values:n,errors:{}}):{values:{},errors:e(v,t)}}};export{o as typanionResolver};
1
+ import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";function o(o,i){return void 0===i&&(i={}),function(n,s,t){var u=[],a=o(n,Object.assign({},{errors:u},i)),c=function(r,e){return void 0===e&&(e={}),r.reduce(function(r,e){var o=e.indexOf(":"),i=e.slice(1,o),n=e.slice(o+1).trim();return r[i]={message:n},r},e)}(u);return a?(t.shouldUseNativeValidation&&r(c,t),{values:n,errors:{}}):{values:{},errors:e(c,t)}}}export{o as typanionResolver};
2
2
  //# sourceMappingURL=typanion.module.js.map
@@ -1,2 +1,2 @@
1
- import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";const s=(s,o={})=>(t,i,n)=>{const a=[],c=s(t,Object.assign({},{errors:a},o)),l=((r,e={})=>r.reduce((r,e)=>{const s=e.indexOf(":"),o=e.slice(1,s),t=e.slice(s+1).trim();return r[o]={message:t},r},e))(a);return c?(n.shouldUseNativeValidation&&r(l,n),{values:t,errors:{}}):{values:{},errors:e(l,n)}};export{s as typanionResolver};
1
+ import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";function s(s,o={}){return(t,n,i)=>{const u=[],c=s(t,Object.assign({},{errors:u},o)),a=function(r,e={}){return r.reduce((r,e)=>{const s=e.indexOf(":"),o=e.slice(1,s),t=e.slice(s+1).trim();return r[o]={message:t},r},e)}(u);return c?(i.shouldUseNativeValidation&&r(a,i),{values:t,errors:{}}):{values:{},errors:e(a,i)}}}export{s as typanionResolver};
2
2
  //# sourceMappingURL=typanion.modern.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"typanion.modern.mjs","sources":["../src/typanion.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type { FieldError, FieldErrors } from 'react-hook-form';\nimport type { Resolver } from './types';\n\nconst parseErrors = (errors: string[], parsedErrors: FieldErrors = {}) => {\n return errors.reduce((acc, error) => {\n const fieldIndex = error.indexOf(':');\n\n const field = error.slice(1, fieldIndex);\n const message = error.slice(fieldIndex + 1).trim();\n\n acc[field] = {\n message,\n } as FieldError;\n\n return acc;\n }, parsedErrors);\n};\n\nexport const typanionResolver: Resolver =\n (validator, validatorOptions = {}) =>\n (values, _, options) => {\n const rawErrors: string[] = [];\n const isValid = validator(\n values,\n Object.assign(\n {},\n {\n errors: rawErrors,\n },\n validatorOptions,\n ),\n );\n const parsedErrors = parseErrors(rawErrors);\n\n if (isValid) {\n options.shouldUseNativeValidation &&\n validateFieldsNatively(parsedErrors, options);\n\n return { values, errors: {} };\n }\n\n return { values: {}, errors: toNestErrors(parsedErrors, options) };\n };\n"],"names":["typanionResolver","validator","validatorOptions","values","_","options","rawErrors","isValid","Object","assign","errors","parsedErrors","parseErrors","reduce","acc","error","fieldIndex","indexOf","field","slice","message","trim","shouldUseNativeValidation","validateFieldsNatively","toNestErrors"],"mappings":"+EAIA,MAeaA,EACXA,CAACC,EAAWC,EAAmB,CAAE,IACjC,CAACC,EAAQC,EAAGC,KACV,MAAMC,EAAsB,GACtBC,EAAUN,EACdE,EACAK,OAAOC,OACL,GACA,CACEC,OAAQJ,GAEVJ,IAGES,EA7BUC,EAACF,EAAkBC,EAA4B,CAAA,IAC1DD,EAAOG,OAAO,CAACC,EAAKC,KACzB,MAAMC,EAAaD,EAAME,QAAQ,KAE3BC,EAAQH,EAAMI,MAAM,EAAGH,GACvBI,EAAUL,EAAMI,MAAMH,EAAa,GAAGK,OAM5C,OAJAP,EAAII,GAAS,CACXE,WAGKN,GACNH,GAiBoBC,CAAYN,GAEjC,OAAIC,GACFF,EAAQiB,2BACNC,EAAuBZ,EAAcN,GAEhC,CAAEF,SAAQO,OAAQ,KAGpB,CAAEP,OAAQ,CAAA,EAAIO,OAAQc,EAAab,EAAcN"}
1
+ {"version":3,"file":"typanion.modern.mjs","sources":["../src/typanion.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type {\n FieldError,\n FieldErrors,\n FieldValues,\n Resolver,\n} from 'react-hook-form';\nimport * as t from 'typanion';\n\nfunction parseErrors(errors: string[], parsedErrors: FieldErrors = {}) {\n return errors.reduce((acc, error) => {\n const fieldIndex = error.indexOf(':');\n\n const field = error.slice(1, fieldIndex);\n const message = error.slice(fieldIndex + 1).trim();\n\n acc[field] = {\n message,\n } as FieldError;\n\n return acc;\n }, parsedErrors);\n}\n\n/**\n * Creates a resolver for react-hook-form using Typanion schema validation\n * @param {t.StrictValidator<TFieldValues, TFieldValues>} schema - The Typanion schema to validate against\n * @param {Pick<t.ValidationState, 'coercions' | 'coercion'>} [schemaOptions] - Optional Typanion validation options\n * @returns {Resolver<t.InferType<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = t.isObject({\n * name: t.isString(),\n * age: t.isInteger()\n * });\n *\n * useForm({\n * resolver: typanionResolver(schema)\n * });\n */\nexport function typanionResolver<TFieldValues extends FieldValues>(\n schema: t.StrictValidator<TFieldValues, TFieldValues>,\n schemaOptions: Pick<t.ValidationState, 'coercions' | 'coercion'> = {},\n): Resolver<t.InferType<typeof schema>> {\n return (values, _, options) => {\n const rawErrors: string[] = [];\n const isValid = schema(\n values,\n Object.assign(\n {},\n {\n errors: rawErrors,\n },\n schemaOptions,\n ),\n );\n const parsedErrors = parseErrors(rawErrors);\n\n if (isValid) {\n options.shouldUseNativeValidation &&\n validateFieldsNatively(parsedErrors, options);\n\n return { values, errors: {} };\n }\n\n return { values: {}, errors: toNestErrors(parsedErrors, options) };\n };\n}\n"],"names":["typanionResolver","schema","schemaOptions","values","_","options","rawErrors","isValid","Object","assign","errors","parsedErrors","reduce","acc","error","fieldIndex","indexOf","field","slice","message","trim","parseErrors","shouldUseNativeValidation","validateFieldsNatively","toNestErrors"],"mappings":"+EAuCgB,SAAAA,EACdC,EACAC,EAAmE,IAEnE,MAAO,CAACC,EAAQC,EAAGC,KACjB,MAAMC,EAAsB,GACtBC,EAAUN,EACdE,EACAK,OAAOC,OACL,CAAA,EACA,CACEC,OAAQJ,GAEVJ,IAGES,EA9CV,SAAqBD,EAAkBC,EAA4B,CAAE,GACnE,OAAOD,EAAOE,OAAO,CAACC,EAAKC,KACzB,MAAMC,EAAaD,EAAME,QAAQ,KAE3BC,EAAQH,EAAMI,MAAM,EAAGH,GACvBI,EAAUL,EAAMI,MAAMH,EAAa,GAAGK,OAM5C,OAJAP,EAAII,GAAS,CACXE,WAGKN,GACNF,EACL,CAiCyBU,CAAYf,GAEjC,OAAIC,GACFF,EAAQiB,2BACNC,EAAuBZ,EAAcN,GAEhC,CAAEF,SAAQO,OAAQ,KAGpB,CAAEP,OAAQ,CAAE,EAAEO,OAAQc,EAAab,EAAcN,IAE5D"}
@@ -1,2 +1,2 @@
1
- import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";var o=function(o,i){return void 0===i&&(i={}),function(n,s,t){var u=[],a=o(n,Object.assign({},{errors:u},i)),v=function(r,e){return void 0===e&&(e={}),r.reduce(function(r,e){var o=e.indexOf(":"),i=e.slice(1,o),n=e.slice(o+1).trim();return r[i]={message:n},r},e)}(u);return a?(t.shouldUseNativeValidation&&r(v,t),{values:n,errors:{}}):{values:{},errors:e(v,t)}}};export{o as typanionResolver};
1
+ import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";function o(o,i){return void 0===i&&(i={}),function(n,s,t){var u=[],a=o(n,Object.assign({},{errors:u},i)),c=function(r,e){return void 0===e&&(e={}),r.reduce(function(r,e){var o=e.indexOf(":"),i=e.slice(1,o),n=e.slice(o+1).trim();return r[i]={message:n},r},e)}(u);return a?(t.shouldUseNativeValidation&&r(c,t),{values:n,errors:{}}):{values:{},errors:e(c,t)}}}export{o as typanionResolver};
2
2
  //# sourceMappingURL=typanion.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"typanion.module.js","sources":["../src/typanion.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type { FieldError, FieldErrors } from 'react-hook-form';\nimport type { Resolver } from './types';\n\nconst parseErrors = (errors: string[], parsedErrors: FieldErrors = {}) => {\n return errors.reduce((acc, error) => {\n const fieldIndex = error.indexOf(':');\n\n const field = error.slice(1, fieldIndex);\n const message = error.slice(fieldIndex + 1).trim();\n\n acc[field] = {\n message,\n } as FieldError;\n\n return acc;\n }, parsedErrors);\n};\n\nexport const typanionResolver: Resolver =\n (validator, validatorOptions = {}) =>\n (values, _, options) => {\n const rawErrors: string[] = [];\n const isValid = validator(\n values,\n Object.assign(\n {},\n {\n errors: rawErrors,\n },\n validatorOptions,\n ),\n );\n const parsedErrors = parseErrors(rawErrors);\n\n if (isValid) {\n options.shouldUseNativeValidation &&\n validateFieldsNatively(parsedErrors, options);\n\n return { values, errors: {} };\n }\n\n return { values: {}, errors: toNestErrors(parsedErrors, options) };\n };\n"],"names":["typanionResolver","validator","validatorOptions","values","_","options","rawErrors","isValid","Object","assign","errors","parsedErrors","reduce","acc","error","fieldIndex","indexOf","field","slice","message","trim","parseErrors","shouldUseNativeValidation","validateFieldsNatively","toNestErrors"],"mappings":"+EAIA,IAeaA,EACX,SAACC,EAAWC,eAAgB,IAAhBA,IAAAA,EAAmB,CAAE,GAChCC,SAAAA,EAAQC,EAAGC,GACV,IAAMC,EAAsB,GACtBC,EAAUN,EACdE,EACAK,OAAOC,OACL,GACA,CACEC,OAAQJ,GAEVJ,IAGES,EA7BU,SAACD,EAAkBC,GACrC,YADqCA,IAAAA,IAAAA,EAA4B,CAAE,GAC5DD,EAAOE,OAAO,SAACC,EAAKC,GACzB,IAAMC,EAAaD,EAAME,QAAQ,KAE3BC,EAAQH,EAAMI,MAAM,EAAGH,GACvBI,EAAUL,EAAMI,MAAMH,EAAa,GAAGK,OAM5C,OAJAP,EAAII,GAAS,CACXE,QAAAA,GAGKN,CACT,EAAGF,EACL,CAgByBU,CAAYf,GAEjC,OAAIC,GACFF,EAAQiB,2BACNC,EAAuBZ,EAAcN,GAEhC,CAAEF,OAAAA,EAAQO,OAAQ,CAAA,IAGpB,CAAEP,OAAQ,GAAIO,OAAQc,EAAab,EAAcN,GAC1D,CAAC"}
1
+ {"version":3,"file":"typanion.module.js","sources":["../src/typanion.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type {\n FieldError,\n FieldErrors,\n FieldValues,\n Resolver,\n} from 'react-hook-form';\nimport * as t from 'typanion';\n\nfunction parseErrors(errors: string[], parsedErrors: FieldErrors = {}) {\n return errors.reduce((acc, error) => {\n const fieldIndex = error.indexOf(':');\n\n const field = error.slice(1, fieldIndex);\n const message = error.slice(fieldIndex + 1).trim();\n\n acc[field] = {\n message,\n } as FieldError;\n\n return acc;\n }, parsedErrors);\n}\n\n/**\n * Creates a resolver for react-hook-form using Typanion schema validation\n * @param {t.StrictValidator<TFieldValues, TFieldValues>} schema - The Typanion schema to validate against\n * @param {Pick<t.ValidationState, 'coercions' | 'coercion'>} [schemaOptions] - Optional Typanion validation options\n * @returns {Resolver<t.InferType<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = t.isObject({\n * name: t.isString(),\n * age: t.isInteger()\n * });\n *\n * useForm({\n * resolver: typanionResolver(schema)\n * });\n */\nexport function typanionResolver<TFieldValues extends FieldValues>(\n schema: t.StrictValidator<TFieldValues, TFieldValues>,\n schemaOptions: Pick<t.ValidationState, 'coercions' | 'coercion'> = {},\n): Resolver<t.InferType<typeof schema>> {\n return (values, _, options) => {\n const rawErrors: string[] = [];\n const isValid = schema(\n values,\n Object.assign(\n {},\n {\n errors: rawErrors,\n },\n schemaOptions,\n ),\n );\n const parsedErrors = parseErrors(rawErrors);\n\n if (isValid) {\n options.shouldUseNativeValidation &&\n validateFieldsNatively(parsedErrors, options);\n\n return { values, errors: {} };\n }\n\n return { values: {}, errors: toNestErrors(parsedErrors, options) };\n };\n}\n"],"names":["typanionResolver","schema","schemaOptions","values","_","options","rawErrors","isValid","Object","assign","errors","parsedErrors","reduce","acc","error","fieldIndex","indexOf","field","slice","message","trim","parseErrors","shouldUseNativeValidation","validateFieldsNatively","toNestErrors"],"mappings":"+EAuCgB,SAAAA,EACdC,EACAC,GAEA,YAFAA,IAAAA,IAAAA,EAAmE,CAAE,GAE7DC,SAAAA,EAAQC,EAAGC,GACjB,IAAMC,EAAsB,GACtBC,EAAUN,EACdE,EACAK,OAAOC,OACL,CAAE,EACF,CACEC,OAAQJ,GAEVJ,IAGES,EA9CV,SAAqBD,EAAkBC,GACrC,gBADqCA,IAAAA,EAA4B,IAC1DD,EAAOE,OAAO,SAACC,EAAKC,GACzB,IAAMC,EAAaD,EAAME,QAAQ,KAE3BC,EAAQH,EAAMI,MAAM,EAAGH,GACvBI,EAAUL,EAAMI,MAAMH,EAAa,GAAGK,OAM5C,OAJAP,EAAII,GAAS,CACXE,QAAAA,GAGKN,CACT,EAAGF,EACL,CAiCyBU,CAAYf,GAEjC,OAAIC,GACFF,EAAQiB,2BACNC,EAAuBZ,EAAcN,GAEhC,CAAEF,OAAAA,EAAQO,OAAQ,CAAA,IAGpB,CAAEP,OAAQ,GAAIO,OAAQc,EAAab,EAAcN,GAC1D,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"typanion.umd.js","sources":["../src/typanion.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type { FieldError, FieldErrors } from 'react-hook-form';\nimport type { Resolver } from './types';\n\nconst parseErrors = (errors: string[], parsedErrors: FieldErrors = {}) => {\n return errors.reduce((acc, error) => {\n const fieldIndex = error.indexOf(':');\n\n const field = error.slice(1, fieldIndex);\n const message = error.slice(fieldIndex + 1).trim();\n\n acc[field] = {\n message,\n } as FieldError;\n\n return acc;\n }, parsedErrors);\n};\n\nexport const typanionResolver: Resolver =\n (validator, validatorOptions = {}) =>\n (values, _, options) => {\n const rawErrors: string[] = [];\n const isValid = validator(\n values,\n Object.assign(\n {},\n {\n errors: rawErrors,\n },\n validatorOptions,\n ),\n );\n const parsedErrors = parseErrors(rawErrors);\n\n if (isValid) {\n options.shouldUseNativeValidation &&\n validateFieldsNatively(parsedErrors, options);\n\n return { values, errors: {} };\n }\n\n return { values: {}, errors: toNestErrors(parsedErrors, options) };\n };\n"],"names":["validator","validatorOptions","values","_","options","rawErrors","isValid","Object","assign","errors","parsedErrors","reduce","acc","error","fieldIndex","indexOf","field","slice","message","trim","parseErrors","shouldUseNativeValidation","validateFieldsNatively","toNestErrors"],"mappings":"iVAoBE,SAACA,EAAWC,eAAgB,IAAhBA,IAAAA,EAAmB,CAAE,GAChCC,SAAAA,EAAQC,EAAGC,GACV,IAAMC,EAAsB,GACtBC,EAAUN,EACdE,EACAK,OAAOC,OACL,GACA,CACEC,OAAQJ,GAEVJ,IAGES,EA7BU,SAACD,EAAkBC,GACrC,YADqCA,IAAAA,IAAAA,EAA4B,CAAE,GAC5DD,EAAOE,OAAO,SAACC,EAAKC,GACzB,IAAMC,EAAaD,EAAME,QAAQ,KAE3BC,EAAQH,EAAMI,MAAM,EAAGH,GACvBI,EAAUL,EAAMI,MAAMH,EAAa,GAAGK,OAM5C,OAJAP,EAAII,GAAS,CACXE,QAAAA,GAGKN,CACT,EAAGF,EACL,CAgByBU,CAAYf,GAEjC,OAAIC,GACFF,EAAQiB,2BACNC,yBAAuBZ,EAAcN,GAEhC,CAAEF,OAAAA,EAAQO,OAAQ,CAAA,IAGpB,CAAEP,OAAQ,GAAIO,OAAQc,EAAYA,aAACb,EAAcN,GAC1D,CAAC"}
1
+ {"version":3,"file":"typanion.umd.js","sources":["../src/typanion.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type {\n FieldError,\n FieldErrors,\n FieldValues,\n Resolver,\n} from 'react-hook-form';\nimport * as t from 'typanion';\n\nfunction parseErrors(errors: string[], parsedErrors: FieldErrors = {}) {\n return errors.reduce((acc, error) => {\n const fieldIndex = error.indexOf(':');\n\n const field = error.slice(1, fieldIndex);\n const message = error.slice(fieldIndex + 1).trim();\n\n acc[field] = {\n message,\n } as FieldError;\n\n return acc;\n }, parsedErrors);\n}\n\n/**\n * Creates a resolver for react-hook-form using Typanion schema validation\n * @param {t.StrictValidator<TFieldValues, TFieldValues>} schema - The Typanion schema to validate against\n * @param {Pick<t.ValidationState, 'coercions' | 'coercion'>} [schemaOptions] - Optional Typanion validation options\n * @returns {Resolver<t.InferType<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = t.isObject({\n * name: t.isString(),\n * age: t.isInteger()\n * });\n *\n * useForm({\n * resolver: typanionResolver(schema)\n * });\n */\nexport function typanionResolver<TFieldValues extends FieldValues>(\n schema: t.StrictValidator<TFieldValues, TFieldValues>,\n schemaOptions: Pick<t.ValidationState, 'coercions' | 'coercion'> = {},\n): Resolver<t.InferType<typeof schema>> {\n return (values, _, options) => {\n const rawErrors: string[] = [];\n const isValid = schema(\n values,\n Object.assign(\n {},\n {\n errors: rawErrors,\n },\n schemaOptions,\n ),\n );\n const parsedErrors = parseErrors(rawErrors);\n\n if (isValid) {\n options.shouldUseNativeValidation &&\n validateFieldsNatively(parsedErrors, options);\n\n return { values, errors: {} };\n }\n\n return { values: {}, errors: toNestErrors(parsedErrors, options) };\n };\n}\n"],"names":["schema","schemaOptions","values","_","options","rawErrors","isValid","Object","assign","errors","parsedErrors","reduce","acc","error","fieldIndex","indexOf","field","slice","message","trim","parseErrors","shouldUseNativeValidation","validateFieldsNatively","toNestErrors"],"mappings":"iVAuCgB,SACdA,EACAC,GAEA,YAFAA,IAAAA,IAAAA,EAAmE,CAAE,GAE7DC,SAAAA,EAAQC,EAAGC,GACjB,IAAMC,EAAsB,GACtBC,EAAUN,EACdE,EACAK,OAAOC,OACL,CAAE,EACF,CACEC,OAAQJ,GAEVJ,IAGES,EA9CV,SAAqBD,EAAkBC,GACrC,gBADqCA,IAAAA,EAA4B,IAC1DD,EAAOE,OAAO,SAACC,EAAKC,GACzB,IAAMC,EAAaD,EAAME,QAAQ,KAE3BC,EAAQH,EAAMI,MAAM,EAAGH,GACvBI,EAAUL,EAAMI,MAAMH,EAAa,GAAGK,OAM5C,OAJAP,EAAII,GAAS,CACXE,QAAAA,GAGKN,CACT,EAAGF,EACL,CAiCyBU,CAAYf,GAEjC,OAAIC,GACFF,EAAQiB,2BACNC,EAAAA,uBAAuBZ,EAAcN,GAEhC,CAAEF,OAAAA,EAAQO,OAAQ,CAAA,IAGpB,CAAEP,OAAQ,GAAIO,OAAQc,EAAYA,aAACb,EAAcN,GAC1D,CACF"}
@@ -9,22 +9,14 @@ const ERROR_MESSAGE =
9
9
  'Expected to have a length of at least 1 elements (got 0)';
10
10
 
11
11
  const schema = t.isObject({
12
- username: t.applyCascade(t.isString(), [t.hasMinLength(1)]),
13
- password: t.applyCascade(t.isString(), [t.hasMinLength(1)]),
12
+ username: t.cascade(t.isString(), [t.hasMinLength(1)]),
13
+ password: t.cascade(t.isString(), [t.hasMinLength(1)]),
14
14
  });
15
15
 
16
- interface FormData {
17
- unusedProperty: string;
18
- username: string;
19
- password: string;
20
- }
21
-
22
- interface Props {
23
- onSubmit: (data: FormData) => void;
24
- }
25
-
26
- function TestComponent({ onSubmit }: Props) {
27
- const { register, handleSubmit } = useForm<FormData>({
16
+ function TestComponent({
17
+ onSubmit,
18
+ }: { onSubmit: (data: t.InferType<typeof schema>) => void }) {
19
+ const { register, handleSubmit } = useForm({
28
20
  resolver: typanionResolver(schema),
29
21
  shouldUseNativeValidation: true,
30
22
  });
@@ -6,8 +6,8 @@ import * as t from 'typanion';
6
6
  import { typanionResolver } from '..';
7
7
 
8
8
  const schema = t.isObject({
9
- username: t.applyCascade(t.isString(), [t.hasMinLength(1)]),
10
- password: t.applyCascade(t.isString(), [t.hasMinLength(1)]),
9
+ username: t.cascade(t.isString(), [t.hasMinLength(1)]),
10
+ password: t.cascade(t.isString(), [t.hasMinLength(1)]),
11
11
  });
12
12
 
13
13
  interface FormData {
@@ -16,16 +16,14 @@ interface FormData {
16
16
  password: string;
17
17
  }
18
18
 
19
- interface Props {
20
- onSubmit: (data: FormData) => void;
21
- }
22
-
23
- function TestComponent({ onSubmit }: Props) {
19
+ function TestComponent({
20
+ onSubmit,
21
+ }: { onSubmit: (data: t.InferType<typeof schema>) => void }) {
24
22
  const {
25
23
  register,
26
24
  formState: { errors },
27
25
  handleSubmit,
28
- } = useForm<FormData>({
26
+ } = useForm({
29
27
  resolver: typanionResolver(schema), // Useful to check TypeScript regressions
30
28
  });
31
29
 
@@ -57,3 +55,29 @@ test("form's validation with Typanion and TypeScript's integration", async () =>
57
55
  ).toHaveLength(2);
58
56
  expect(handleSubmit).not.toHaveBeenCalled();
59
57
  });
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<t.InferType<typeof schema>, undefined, FormData>({
69
+ resolver: typanionResolver(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,13 +1,13 @@
1
1
  import { Field, InternalFieldName } from 'react-hook-form';
2
2
  import * as t from 'typanion';
3
3
 
4
- export const isSchema = t.isObject({
5
- username: t.applyCascade(t.isString(), [
4
+ export const schema = t.isObject({
5
+ username: t.cascade(t.isString(), [
6
6
  t.matchesRegExp(/^\w+$/),
7
7
  t.hasMinLength(2),
8
8
  t.hasMaxLength(30),
9
9
  ]),
10
- password: t.applyCascade(t.isString(), [
10
+ password: t.cascade(t.isString(), [
11
11
  t.matchesRegExp(new RegExp('.*[A-Z].*')), // one uppercase character
12
12
  t.matchesRegExp(new RegExp('.*[a-z].*')), // one lowercase character
13
13
  t.matchesRegExp(new RegExp('.*\\d.*')), // one number
@@ -16,7 +16,7 @@ export const isSchema = t.isObject({
16
16
  ), // one special character
17
17
  t.hasMinLength(8), // Must be at least 8 characters in length
18
18
  ]),
19
- repeatPassword: t.applyCascade(t.isString(), [
19
+ repeatPassword: t.cascade(t.isString(), [
20
20
  t.matchesRegExp(new RegExp('.*[A-Z].*')), // one uppercase character
21
21
  t.matchesRegExp(new RegExp('.*[a-z].*')), // one lowercase character
22
22
  t.matchesRegExp(new RegExp('.*\\d.*')), // one number
@@ -26,16 +26,16 @@ export const isSchema = t.isObject({
26
26
  t.hasMinLength(8), // Must be at least 8 characters in length
27
27
  ]),
28
28
  accessToken: t.isString(),
29
- birthYear: t.applyCascade(t.isNumber(), [
29
+ birthYear: t.cascade(t.isNumber(), [
30
30
  t.isInteger(),
31
31
  t.isInInclusiveRange(1900, 2013),
32
32
  ]),
33
- email: t.applyCascade(t.isString(), [t.matchesRegExp(/^\S+@\S+$/)]),
33
+ email: t.cascade(t.isString(), [t.matchesRegExp(/^\S+@\S+$/)]),
34
34
  tags: t.isArray(t.isString()),
35
35
  enabled: t.isBoolean(),
36
36
  like: t.isObject({
37
- id: t.applyCascade(t.isNumber(), [t.isInteger(), t.isPositive()]),
38
- name: t.applyCascade(t.isString(), [t.hasMinLength(4)]),
37
+ id: t.cascade(t.isNumber(), [t.isInteger(), t.isPositive()]),
38
+ name: t.cascade(t.isString(), [t.hasMinLength(4)]),
39
39
  }),
40
40
  });
41
41
 
@@ -60,7 +60,7 @@ export const invalidData = {
60
60
  birthYear: 'birthYear',
61
61
  like: { id: 'z' },
62
62
  tags: [1, 2, 3],
63
- };
63
+ } as any as t.InferType<typeof schema>;
64
64
 
65
65
  export const fields: Record<InternalFieldName, Field['_f']> = {
66
66
  username: {
@@ -1,8 +1,8 @@
1
1
  import { typanionResolver } from '..';
2
- import { fields, invalidData, isSchema, validData } from './__fixtures__/data';
2
+ import { fields, invalidData, schema, validData } from './__fixtures__/data';
3
3
 
4
4
  const tmpObj = {
5
- validate: isSchema,
5
+ validate: schema,
6
6
  };
7
7
 
8
8
  const shouldUseNativeValidation = false;
@@ -25,7 +25,7 @@ describe('typanionResolver', () => {
25
25
  });
26
26
 
27
27
  it('should return a single error from typanionResolver when validation fails', async () => {
28
- const result = await typanionResolver(isSchema)(invalidData, undefined, {
28
+ const result = await typanionResolver(schema)(invalidData, undefined, {
29
29
  fields,
30
30
  shouldUseNativeValidation,
31
31
  });
@@ -1,2 +1 @@
1
1
  export * from './typanion';
2
- export * from './types';