@hookform/resolvers 3.0.1 → 3.1.1

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 (39) hide show
  1. package/README.md +46 -0
  2. package/arktype/dist/arktype.d.ts +2 -0
  3. package/arktype/dist/arktype.js +2 -0
  4. package/arktype/dist/arktype.js.map +1 -0
  5. package/arktype/dist/arktype.mjs +2 -0
  6. package/arktype/dist/arktype.modern.mjs +2 -0
  7. package/arktype/dist/arktype.modern.mjs.map +1 -0
  8. package/arktype/dist/arktype.module.js +2 -0
  9. package/arktype/dist/arktype.module.js.map +1 -0
  10. package/arktype/dist/arktype.umd.js +2 -0
  11. package/arktype/dist/arktype.umd.js.map +1 -0
  12. package/arktype/dist/index.d.ts +2 -0
  13. package/arktype/dist/types.d.ts +9 -0
  14. package/arktype/package.json +17 -0
  15. package/arktype/src/__tests__/Form-native-validation.tsx +82 -0
  16. package/arktype/src/__tests__/Form.tsx +56 -0
  17. package/arktype/src/__tests__/__fixtures__/data.ts +67 -0
  18. package/arktype/src/__tests__/__snapshots__/arktype.ts.snap +76 -0
  19. package/arktype/src/__tests__/arktype.ts +26 -0
  20. package/arktype/src/arktype.ts +41 -0
  21. package/arktype/src/index.ts +2 -0
  22. package/arktype/src/types.ts +18 -0
  23. package/package.json +29 -17
  24. package/typebox/src/__tests__/__snapshots__/typebox.ts.snap +4 -4
  25. package/yup/dist/index.d.ts +0 -1
  26. package/yup/dist/yup.d.ts +13 -2
  27. package/yup/dist/yup.js.map +1 -1
  28. package/yup/dist/yup.mjs +1 -1
  29. package/yup/dist/yup.modern.mjs +1 -1
  30. package/yup/dist/yup.modern.mjs.map +1 -1
  31. package/yup/dist/yup.module.js +1 -1
  32. package/yup/dist/yup.module.js.map +1 -1
  33. package/yup/dist/yup.umd.js.map +1 -1
  34. package/yup/src/__tests__/Form.tsx +4 -4
  35. package/yup/src/__tests__/__fixtures__/data.ts +4 -3
  36. package/yup/src/index.ts +0 -1
  37. package/yup/src/yup.ts +23 -5
  38. package/yup/dist/types.d.ts +0 -15
  39. package/yup/src/types.ts +0 -24
package/README.md CHANGED
@@ -24,6 +24,21 @@
24
24
 
25
25
  - [React-hook-form validation resolver documentation ](https://react-hook-form.com/api/useform/#resolver)
26
26
 
27
+ ### Supported resolvers
28
+
29
+ - [Yup](#Yup)
30
+ - [Zod](#Zod)
31
+ - [Superstruct](#Superstruct)
32
+ - [Joi](#Joi)
33
+ - [Class Validator](#Class-Validator)
34
+ - [io-ts](#io-ts)
35
+ - [Nope](#Nope)
36
+ - [computed-types](#computed-types)
37
+ - [typanion](#typanion)
38
+ - [Ajv](#Ajv)
39
+ - [TypeBox](#TypeBox)
40
+ - [ArkType](#ArkType)
41
+
27
42
  ## API
28
43
 
29
44
  ```
@@ -486,6 +501,37 @@ const App = () => {
486
501
  };
487
502
  ```
488
503
 
504
+ ### [ArkType](https://github.com/arktypeio/arktype)
505
+
506
+ TypeScript's 1:1 validator, optimized from editor to runtime
507
+
508
+ [![npm](https://img.shields.io/bundlephobia/minzip/arktype?style=for-the-badge)](https://bundlephobia.com/result?p=arktype)
509
+
510
+ ```typescript jsx
511
+ import { useForm } from 'react-hook-form';
512
+ import { arktypeResolver } from '@hookform/resolvers/arktype';
513
+ import { type } from 'arktype';
514
+
515
+ const schema = type({
516
+ username: 'string>1',
517
+ password: 'string>1',
518
+ });
519
+
520
+ const App = () => {
521
+ const { register, handleSubmit } = useForm({
522
+ resolver: arktypeResolver(schema),
523
+ });
524
+
525
+ return (
526
+ <form onSubmit={handleSubmit((d) => console.log(d))}>
527
+ <input {...register('username')} />
528
+ <input type="password" {...register('password')} />
529
+ <input type="submit" />
530
+ </form>
531
+ );
532
+ };
533
+ ```
534
+
489
535
  ## Backers
490
536
 
491
537
  Thanks goes to all our backers! [[Become a backer](https://opencollective.com/react-hook-form#backer)].
@@ -0,0 +1,2 @@
1
+ import type { Resolver } from './types';
2
+ export declare const arktypeResolver: Resolver;
@@ -0,0 +1,2 @@
1
+ var r=require("@hookform/resolvers"),e=function(r){for(var e={};r.length;){var o=r[0],a=o.path.join(".");e[a]||(e[a]={message:o.message,type:o.code}),r.shift()}return e};exports.arktypeResolver=function(o,a,s){return void 0===s&&(s={}),function(a,t,i){var l=o(a);return l.problems?{values:{},errors:r.toNestError(e(l.problems),i)}:(i.shouldUseNativeValidation&&r.validateFieldsNatively({},i),{errors:{},values:s.raw?a:l.data})}};
2
+ //# sourceMappingURL=arktype.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arktype.js","sources":["../src/arktype.ts"],"sourcesContent":["import { FieldError, FieldErrors } from 'react-hook-form';\nimport { toNestError, validateFieldsNatively } from '@hookform/resolvers';\nimport type { Resolver } from './types';\nimport { Problems } from 'arktype';\n\nconst parseErrorSchema = (e: Problems) => {\n const errors: Record<string, FieldError> = {};\n for (; e.length; ) {\n const error = e[0];\n const _path = error.path.join('.');\n\n if (!errors[_path]) {\n errors[_path] = { message: error.message, type: error.code };\n }\n\n // @ts-expect-error - false positive Property 'shift' does not exist on type 'Problems'.\n e.shift();\n }\n\n return errors;\n};\n\nexport const arktypeResolver: Resolver =\n (schema, _schemaOptions, resolverOptions = {}) =>\n (values, _, options) => {\n const result = schema(values);\n\n if (result.problems) {\n return {\n values: {},\n errors: toNestError(parseErrorSchema(result.problems), options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? values : result.data,\n };\n };\n"],"names":["parseErrorSchema","e","errors","length","error","_path","path","join","message","type","code","shift","schema","_schemaOptions","resolverOptions","values","_","options","result","problems","toNestError","shouldUseNativeValidation","validateFieldsNatively","raw","data"],"mappings":"qCAKMA,EAAmB,SAACC,GAExB,IADA,IAAMC,EAAqC,GACpCD,EAAEE,QAAU,CACjB,IAAMC,EAAQH,EAAE,GACVI,EAAQD,EAAME,KAAKC,KAAK,KAEzBL,EAAOG,KACVH,EAAOG,GAAS,CAAEG,QAASJ,EAAMI,QAASC,KAAML,EAAMM,OAIxDT,EAAEU,OACH,CAED,OAAOT,CACT,0BAGE,SAACU,EAAQC,EAAgBC,GAAoB,gBAApBA,IAAAA,EAAkB,CAAE,YAC5CC,EAAQC,EAAGC,GACV,IAAMC,EAASN,EAAOG,GAEtB,OAAIG,EAAOC,SACF,CACLJ,OAAQ,CAAA,EACRb,OAAQkB,EAAWA,YAACpB,EAAiBkB,EAAOC,UAAWF,KAI3DA,EAAQI,2BAA6BC,EAAsBA,uBAAC,GAAIL,GAEzD,CACLf,OAAQ,CAAiB,EACzBa,OAAQD,EAAgBS,IAAMR,EAASG,EAAOM,MAElD,CAAC"}
@@ -0,0 +1,2 @@
1
+ import{toNestError as r,validateFieldsNatively as e}from"@hookform/resolvers";var o=function(r){for(var e={};r.length;){var o=r[0],a=o.path.join(".");e[a]||(e[a]={message:o.message,type:o.code}),r.shift()}return e},a=function(a,s,t){return void 0===t&&(t={}),function(s,n,i){var u=a(s);return u.problems?{values:{},errors:r(o(u.problems),i)}:(i.shouldUseNativeValidation&&e({},i),{errors:{},values:t.raw?s:u.data})}};export{a as arktypeResolver};
2
+ //# sourceMappingURL=arktype.module.js.map
@@ -0,0 +1,2 @@
1
+ import{toNestError as e,validateFieldsNatively as o}from"@hookform/resolvers";const r=e=>{const o={};for(;e.length;){const r=e[0],s=r.path.join(".");o[s]||(o[s]={message:r.message,type:r.code}),e.shift()}return o},s=(s,t,a={})=>(t,n,l)=>{const m=s(t);return m.problems?{values:{},errors:e(r(m.problems),l)}:(l.shouldUseNativeValidation&&o({},l),{errors:{},values:a.raw?t:m.data})};export{s as arktypeResolver};
2
+ //# sourceMappingURL=arktype.modern.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arktype.modern.mjs","sources":["../src/arktype.ts"],"sourcesContent":["import { FieldError, FieldErrors } from 'react-hook-form';\nimport { toNestError, validateFieldsNatively } from '@hookform/resolvers';\nimport type { Resolver } from './types';\nimport { Problems } from 'arktype';\n\nconst parseErrorSchema = (e: Problems) => {\n const errors: Record<string, FieldError> = {};\n for (; e.length; ) {\n const error = e[0];\n const _path = error.path.join('.');\n\n if (!errors[_path]) {\n errors[_path] = { message: error.message, type: error.code };\n }\n\n // @ts-expect-error - false positive Property 'shift' does not exist on type 'Problems'.\n e.shift();\n }\n\n return errors;\n};\n\nexport const arktypeResolver: Resolver =\n (schema, _schemaOptions, resolverOptions = {}) =>\n (values, _, options) => {\n const result = schema(values);\n\n if (result.problems) {\n return {\n values: {},\n errors: toNestError(parseErrorSchema(result.problems), options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? values : result.data,\n };\n };\n"],"names":["parseErrorSchema","e","errors","length","error","_path","path","join","message","type","code","shift","arktypeResolver","schema","_schemaOptions","resolverOptions","values","_","options","result","problems","toNestError","shouldUseNativeValidation","validateFieldsNatively","raw","data"],"mappings":"8EAKA,MAAMA,EAAoBC,IACxB,MAAMC,EAAqC,CAAA,EAC3C,KAAOD,EAAEE,QAAU,CACjB,MAAMC,EAAQH,EAAE,GACVI,EAAQD,EAAME,KAAKC,KAAK,KAEzBL,EAAOG,KACVH,EAAOG,GAAS,CAAEG,QAASJ,EAAMI,QAASC,KAAML,EAAMM,OAIxDT,EAAEU,OACH,CAED,OAAOT,GAGIU,EACXA,CAACC,EAAQC,EAAgBC,EAAkB,CAAE,IAC7C,CAACC,EAAQC,EAAGC,KACV,MAAMC,EAASN,EAAOG,GAEtB,OAAIG,EAAOC,SACF,CACLJ,OAAQ,CAAE,EACVd,OAAQmB,EAAYrB,EAAiBmB,EAAOC,UAAWF,KAI3DA,EAAQI,2BAA6BC,EAAuB,CAAA,EAAIL,GAEzD,CACLhB,OAAQ,CAAiB,EACzBc,OAAQD,EAAgBS,IAAMR,EAASG,EAAOM"}
@@ -0,0 +1,2 @@
1
+ import{toNestError as r,validateFieldsNatively as e}from"@hookform/resolvers";var o=function(r){for(var e={};r.length;){var o=r[0],a=o.path.join(".");e[a]||(e[a]={message:o.message,type:o.code}),r.shift()}return e},a=function(a,s,t){return void 0===t&&(t={}),function(s,n,i){var u=a(s);return u.problems?{values:{},errors:r(o(u.problems),i)}:(i.shouldUseNativeValidation&&e({},i),{errors:{},values:t.raw?s:u.data})}};export{a as arktypeResolver};
2
+ //# sourceMappingURL=arktype.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arktype.module.js","sources":["../src/arktype.ts"],"sourcesContent":["import { FieldError, FieldErrors } from 'react-hook-form';\nimport { toNestError, validateFieldsNatively } from '@hookform/resolvers';\nimport type { Resolver } from './types';\nimport { Problems } from 'arktype';\n\nconst parseErrorSchema = (e: Problems) => {\n const errors: Record<string, FieldError> = {};\n for (; e.length; ) {\n const error = e[0];\n const _path = error.path.join('.');\n\n if (!errors[_path]) {\n errors[_path] = { message: error.message, type: error.code };\n }\n\n // @ts-expect-error - false positive Property 'shift' does not exist on type 'Problems'.\n e.shift();\n }\n\n return errors;\n};\n\nexport const arktypeResolver: Resolver =\n (schema, _schemaOptions, resolverOptions = {}) =>\n (values, _, options) => {\n const result = schema(values);\n\n if (result.problems) {\n return {\n values: {},\n errors: toNestError(parseErrorSchema(result.problems), options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? values : result.data,\n };\n };\n"],"names":["parseErrorSchema","e","errors","length","error","_path","path","join","message","type","code","shift","arktypeResolver","schema","_schemaOptions","resolverOptions","values","_","options","result","problems","toNestError","shouldUseNativeValidation","validateFieldsNatively","raw","data"],"mappings":"8EAKA,IAAMA,EAAmB,SAACC,GAExB,IADA,IAAMC,EAAqC,GACpCD,EAAEE,QAAU,CACjB,IAAMC,EAAQH,EAAE,GACVI,EAAQD,EAAME,KAAKC,KAAK,KAEzBL,EAAOG,KACVH,EAAOG,GAAS,CAAEG,QAASJ,EAAMI,QAASC,KAAML,EAAMM,OAIxDT,EAAEU,OACH,CAED,OAAOT,CACT,EAEaU,EACX,SAACC,EAAQC,EAAgBC,GAAoB,gBAApBA,IAAAA,EAAkB,CAAE,YAC5CC,EAAQC,EAAGC,GACV,IAAMC,EAASN,EAAOG,GAEtB,OAAIG,EAAOC,SACF,CACLJ,OAAQ,CAAA,EACRd,OAAQmB,EAAYrB,EAAiBmB,EAAOC,UAAWF,KAI3DA,EAAQI,2BAA6BC,EAAuB,GAAIL,GAEzD,CACLhB,OAAQ,CAAiB,EACzBc,OAAQD,EAAgBS,IAAMR,EAASG,EAAOM,MAElD,CAAC"}
@@ -0,0 +1,2 @@
1
+ !function(e,o){"object"==typeof exports&&"undefined"!=typeof module?o(exports,require("@hookform/resolvers")):"function"==typeof define&&define.amd?define(["exports","@hookform/resolvers"],o):o((e||self).hookformResolversArktype={},e.hookformResolvers)}(this,function(e,o){var r=function(e){for(var o={};e.length;){var r=e[0],s=r.path.join(".");o[s]||(o[s]={message:r.message,type:r.code}),e.shift()}return o};e.arktypeResolver=function(e,s,t){return void 0===t&&(t={}),function(s,n,i){var a=e(s);return a.problems?{values:{},errors:o.toNestError(r(a.problems),i)}:(i.shouldUseNativeValidation&&o.validateFieldsNatively({},i),{errors:{},values:t.raw?s:a.data})}}});
2
+ //# sourceMappingURL=arktype.umd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arktype.umd.js","sources":["../src/arktype.ts"],"sourcesContent":["import { FieldError, FieldErrors } from 'react-hook-form';\nimport { toNestError, validateFieldsNatively } from '@hookform/resolvers';\nimport type { Resolver } from './types';\nimport { Problems } from 'arktype';\n\nconst parseErrorSchema = (e: Problems) => {\n const errors: Record<string, FieldError> = {};\n for (; e.length; ) {\n const error = e[0];\n const _path = error.path.join('.');\n\n if (!errors[_path]) {\n errors[_path] = { message: error.message, type: error.code };\n }\n\n // @ts-expect-error - false positive Property 'shift' does not exist on type 'Problems'.\n e.shift();\n }\n\n return errors;\n};\n\nexport const arktypeResolver: Resolver =\n (schema, _schemaOptions, resolverOptions = {}) =>\n (values, _, options) => {\n const result = schema(values);\n\n if (result.problems) {\n return {\n values: {},\n errors: toNestError(parseErrorSchema(result.problems), options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {} as FieldErrors,\n values: resolverOptions.raw ? values : result.data,\n };\n };\n"],"names":["parseErrorSchema","e","errors","length","error","_path","path","join","message","type","code","shift","schema","_schemaOptions","resolverOptions","values","_","options","result","problems","toNestError","shouldUseNativeValidation","validateFieldsNatively","raw","data"],"mappings":"6TAKA,IAAMA,EAAmB,SAACC,GAExB,IADA,IAAMC,EAAqC,GACpCD,EAAEE,QAAU,CACjB,IAAMC,EAAQH,EAAE,GACVI,EAAQD,EAAME,KAAKC,KAAK,KAEzBL,EAAOG,KACVH,EAAOG,GAAS,CAAEG,QAASJ,EAAMI,QAASC,KAAML,EAAMM,OAIxDT,EAAEU,OACH,CAED,OAAOT,CACT,oBAGE,SAACU,EAAQC,EAAgBC,GAAoB,gBAApBA,IAAAA,EAAkB,CAAE,YAC5CC,EAAQC,EAAGC,GACV,IAAMC,EAASN,EAAOG,GAEtB,OAAIG,EAAOC,SACF,CACLJ,OAAQ,CAAA,EACRb,OAAQkB,EAAWA,YAACpB,EAAiBkB,EAAOC,UAAWF,KAI3DA,EAAQI,2BAA6BC,EAAsBA,uBAAC,GAAIL,GAEzD,CACLf,OAAQ,CAAiB,EACzBa,OAAQD,EAAgBS,IAAMR,EAASG,EAAOM,MAElD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './arktype';
2
+ export * from './types';
@@ -0,0 +1,9 @@
1
+ import { FieldValues, ResolverResult, ResolverOptions } from 'react-hook-form';
2
+ import { Type } from 'arktype';
3
+ export type Resolver = <T extends Type<any>>(schema: T, schemaOptions?: never, factoryOptions?: {
4
+ /**
5
+ * Return the raw input values rather than the parsed values.
6
+ * @default false
7
+ */
8
+ raw?: boolean;
9
+ }) => <TFieldValues extends FieldValues, TContext>(values: TFieldValues, context: TContext | undefined, options: ResolverOptions<TFieldValues>) => ResolverResult<TFieldValues>;
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "@hookform/resolvers/arktype",
3
+ "amdName": "hookformResolversArktype",
4
+ "version": "1.0.0",
5
+ "private": true,
6
+ "description": "React Hook Form validation resolver: arktype",
7
+ "main": "dist/arktype.js",
8
+ "module": "dist/arktype.module.js",
9
+ "umd:main": "dist/arktype.umd.js",
10
+ "source": "src/index.ts",
11
+ "types": "dist/index.d.ts",
12
+ "license": "MIT",
13
+ "peerDependencies": {
14
+ "react-hook-form": "^7.0.0",
15
+ "@hookform/resolvers": "^2.0.0"
16
+ }
17
+ }
@@ -0,0 +1,82 @@
1
+ import React from 'react';
2
+ import { useForm } from 'react-hook-form';
3
+ import { render, screen } from '@testing-library/react';
4
+ import user from '@testing-library/user-event';
5
+ import { arktypeResolver } from '..';
6
+ import { type } from 'arktype';
7
+
8
+ const schema = type({
9
+ username: 'string>1',
10
+ password: 'string>1',
11
+ });
12
+
13
+ type FormData = typeof schema.infer;
14
+
15
+ interface Props {
16
+ onSubmit: (data: FormData) => void;
17
+ }
18
+
19
+ function TestComponent({ onSubmit }: Props) {
20
+ const { register, handleSubmit } = useForm<FormData>({
21
+ resolver: arktypeResolver(schema),
22
+ shouldUseNativeValidation: true,
23
+ });
24
+
25
+ return (
26
+ <form onSubmit={handleSubmit(onSubmit)}>
27
+ <input {...register('username')} placeholder="username" />
28
+
29
+ <input {...register('password')} placeholder="password" />
30
+
31
+ <button type="submit">submit</button>
32
+ </form>
33
+ );
34
+ }
35
+
36
+ test("form's native validation with Zod", async () => {
37
+ const handleSubmit = vi.fn();
38
+ render(<TestComponent onSubmit={handleSubmit} />);
39
+
40
+ // username
41
+ let usernameField = screen.getByPlaceholderText(
42
+ /username/i,
43
+ ) as HTMLInputElement;
44
+ expect(usernameField.validity.valid).toBe(true);
45
+ expect(usernameField.validationMessage).toBe('');
46
+
47
+ // password
48
+ let passwordField = screen.getByPlaceholderText(
49
+ /password/i,
50
+ ) as HTMLInputElement;
51
+ expect(passwordField.validity.valid).toBe(true);
52
+ expect(passwordField.validationMessage).toBe('');
53
+
54
+ await user.click(screen.getByText(/submit/i));
55
+
56
+ // username
57
+ usernameField = screen.getByPlaceholderText(/username/i) as HTMLInputElement;
58
+ expect(usernameField.validity.valid).toBe(false);
59
+ expect(usernameField.validationMessage).toBe(
60
+ 'username must be more than 1 characters (was 0)',
61
+ );
62
+
63
+ // password
64
+ passwordField = screen.getByPlaceholderText(/password/i) as HTMLInputElement;
65
+ expect(passwordField.validity.valid).toBe(false);
66
+ expect(passwordField.validationMessage).toBe(
67
+ 'password must be more than 1 characters (was 0)',
68
+ );
69
+
70
+ await user.type(screen.getByPlaceholderText(/username/i), 'joe');
71
+ await user.type(screen.getByPlaceholderText(/password/i), 'password');
72
+
73
+ // username
74
+ usernameField = screen.getByPlaceholderText(/username/i) as HTMLInputElement;
75
+ expect(usernameField.validity.valid).toBe(true);
76
+ expect(usernameField.validationMessage).toBe('');
77
+
78
+ // password
79
+ passwordField = screen.getByPlaceholderText(/password/i) as HTMLInputElement;
80
+ expect(passwordField.validity.valid).toBe(true);
81
+ expect(passwordField.validationMessage).toBe('');
82
+ });
@@ -0,0 +1,56 @@
1
+ import React from 'react';
2
+ import { render, screen } from '@testing-library/react';
3
+ import user from '@testing-library/user-event';
4
+ import { useForm } from 'react-hook-form';
5
+ import { arktypeResolver } from '..';
6
+ import { type } from 'arktype';
7
+
8
+ const schema = type({
9
+ username: 'string>1',
10
+ password: 'string>1',
11
+ });
12
+
13
+ type FormData = typeof schema.infer & { unusedProperty: string };
14
+
15
+ interface Props {
16
+ onSubmit: (data: FormData) => void;
17
+ }
18
+
19
+ function TestComponent({ onSubmit }: Props) {
20
+ const {
21
+ register,
22
+ handleSubmit,
23
+ formState: { errors },
24
+ } = useForm<FormData>({
25
+ resolver: arktypeResolver(schema), // Useful to check TypeScript regressions
26
+ });
27
+
28
+ return (
29
+ <form onSubmit={handleSubmit(onSubmit)}>
30
+ <input {...register('username')} />
31
+ {errors.username && <span role="alert">{errors.username.message}</span>}
32
+
33
+ <input {...register('password')} />
34
+ {errors.password && <span role="alert">{errors.password.message}</span>}
35
+
36
+ <button type="submit">submit</button>
37
+ </form>
38
+ );
39
+ }
40
+
41
+ test("form's validation with arkType and TypeScript's integration", async () => {
42
+ const handleSubmit = vi.fn();
43
+ render(<TestComponent onSubmit={handleSubmit} />);
44
+
45
+ expect(screen.queryAllByRole('alert')).toHaveLength(0);
46
+
47
+ await user.click(screen.getByText(/submit/i));
48
+
49
+ expect(
50
+ screen.getByText('username must be more than 1 characters (was 0)'),
51
+ ).toBeInTheDocument();
52
+ expect(
53
+ screen.getByText('password must be more than 1 characters (was 0)'),
54
+ ).toBeInTheDocument();
55
+ expect(handleSubmit).not.toHaveBeenCalled();
56
+ });
@@ -0,0 +1,67 @@
1
+ import { Field, InternalFieldName } from 'react-hook-form';
2
+ import { type, arrayOf, union } from 'arktype';
3
+
4
+ export const schema = type({
5
+ username: 'string>2',
6
+ password: union(['string>8', '&', '/.*[A-Za-z].*/'], ['/.*\\d.*/']),
7
+ repeatPassword: 'string>1',
8
+ accessToken: union('string', 'number'),
9
+ birthYear: '1900<number<2013',
10
+ email: 'email',
11
+ tags: arrayOf('string'),
12
+ enabled: 'boolean',
13
+ url: 'string>1',
14
+ 'like?': arrayOf(
15
+ type({
16
+ id: 'number',
17
+ name: 'string>3',
18
+ }),
19
+ ),
20
+ dateStr: 'Date',
21
+ });
22
+
23
+ export const validData: typeof schema.infer = {
24
+ username: 'Doe',
25
+ password: 'Password123_',
26
+ repeatPassword: 'Password123_',
27
+ birthYear: 2000,
28
+ email: 'john@doe.com',
29
+ tags: ['tag1', 'tag2'],
30
+ enabled: true,
31
+ accessToken: 'accessToken',
32
+ url: 'https://react-hook-form.com/',
33
+ like: [
34
+ {
35
+ id: 1,
36
+ name: 'name',
37
+ },
38
+ ],
39
+ dateStr: new Date('2020-01-01'),
40
+ };
41
+
42
+ export const invalidData = {
43
+ password: '___',
44
+ email: '',
45
+ birthYear: 'birthYear',
46
+ like: [{ id: 'z' }],
47
+ url: 'abc',
48
+ };
49
+
50
+ export const fields: Record<InternalFieldName, Field['_f']> = {
51
+ username: {
52
+ ref: { name: 'username' },
53
+ name: 'username',
54
+ },
55
+ password: {
56
+ ref: { name: 'password' },
57
+ name: 'password',
58
+ },
59
+ email: {
60
+ ref: { name: 'email' },
61
+ name: 'email',
62
+ },
63
+ birthday: {
64
+ ref: { name: 'birthday' },
65
+ name: 'birthday',
66
+ },
67
+ };
@@ -0,0 +1,76 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`arktypeResolver > should return a single error from arktypeResolver when validation fails 1`] = `
4
+ {
5
+ "errors": {
6
+ "accessToken": {
7
+ "message": "accessToken must be defined",
8
+ "ref": undefined,
9
+ "type": "missing",
10
+ },
11
+ "birthYear": {
12
+ "message": "birthYear must be a number (was string)",
13
+ "ref": undefined,
14
+ "type": "domain",
15
+ },
16
+ "dateStr": {
17
+ "message": "dateStr must be defined",
18
+ "ref": undefined,
19
+ "type": "missing",
20
+ },
21
+ "email": {
22
+ "message": "email must be a valid email (was '')",
23
+ "ref": {
24
+ "name": "email",
25
+ },
26
+ "type": "regex",
27
+ },
28
+ "enabled": {
29
+ "message": "enabled must be defined",
30
+ "ref": undefined,
31
+ "type": "missing",
32
+ },
33
+ "like": [
34
+ {
35
+ "id": {
36
+ "message": "like/0/id must be a number (was string)",
37
+ "ref": undefined,
38
+ "type": "domain",
39
+ },
40
+ "name": {
41
+ "message": "like/0/name must be defined",
42
+ "ref": undefined,
43
+ "type": "missing",
44
+ },
45
+ },
46
+ ],
47
+ "password": {
48
+ "message": "At password, '___' must be...
49
+ • more than 8 characters
50
+ • a string matching /.*[A-Za-z].*/",
51
+ "ref": {
52
+ "name": "password",
53
+ },
54
+ "type": "multi",
55
+ },
56
+ "repeatPassword": {
57
+ "message": "repeatPassword must be defined",
58
+ "ref": undefined,
59
+ "type": "missing",
60
+ },
61
+ "tags": {
62
+ "message": "tags must be defined",
63
+ "ref": undefined,
64
+ "type": "missing",
65
+ },
66
+ "username": {
67
+ "message": "username must be defined",
68
+ "ref": {
69
+ "name": "username",
70
+ },
71
+ "type": "missing",
72
+ },
73
+ },
74
+ "values": {},
75
+ }
76
+ `;
@@ -0,0 +1,26 @@
1
+ import { arktypeResolver } from '..';
2
+ import { schema, validData, invalidData, fields } from './__fixtures__/data';
3
+
4
+ const shouldUseNativeValidation = false;
5
+
6
+ describe('arktypeResolver', () => {
7
+ it('should return values from arktypeResolver when validation pass & raw=true', async () => {
8
+ const result = await arktypeResolver(schema, undefined, {
9
+ raw: true,
10
+ })(validData, undefined, {
11
+ fields,
12
+ shouldUseNativeValidation,
13
+ });
14
+
15
+ expect(result).toEqual({ errors: {}, values: validData });
16
+ });
17
+
18
+ it('should return a single error from arktypeResolver when validation fails', async () => {
19
+ const result = await arktypeResolver(schema)(invalidData, undefined, {
20
+ fields,
21
+ shouldUseNativeValidation,
22
+ });
23
+
24
+ expect(result).toMatchSnapshot();
25
+ });
26
+ });
@@ -0,0 +1,41 @@
1
+ import { FieldError, FieldErrors } from 'react-hook-form';
2
+ import { toNestError, validateFieldsNatively } from '@hookform/resolvers';
3
+ import type { Resolver } from './types';
4
+ import { Problems } from 'arktype';
5
+
6
+ const parseErrorSchema = (e: Problems) => {
7
+ const errors: Record<string, FieldError> = {};
8
+ for (; e.length; ) {
9
+ const error = e[0];
10
+ const _path = error.path.join('.');
11
+
12
+ if (!errors[_path]) {
13
+ errors[_path] = { message: error.message, type: error.code };
14
+ }
15
+
16
+ // @ts-expect-error - false positive Property 'shift' does not exist on type 'Problems'.
17
+ e.shift();
18
+ }
19
+
20
+ return errors;
21
+ };
22
+
23
+ export const arktypeResolver: Resolver =
24
+ (schema, _schemaOptions, resolverOptions = {}) =>
25
+ (values, _, options) => {
26
+ const result = schema(values);
27
+
28
+ if (result.problems) {
29
+ return {
30
+ values: {},
31
+ errors: toNestError(parseErrorSchema(result.problems), options),
32
+ };
33
+ }
34
+
35
+ options.shouldUseNativeValidation && validateFieldsNatively({}, options);
36
+
37
+ return {
38
+ errors: {} as FieldErrors,
39
+ values: resolverOptions.raw ? values : result.data,
40
+ };
41
+ };
@@ -0,0 +1,2 @@
1
+ export * from './arktype';
2
+ export * from './types';
@@ -0,0 +1,18 @@
1
+ import { FieldValues, ResolverResult, ResolverOptions } from 'react-hook-form';
2
+ import { Type } from 'arktype';
3
+
4
+ export type Resolver = <T extends Type<any>>(
5
+ schema: T,
6
+ schemaOptions?: never,
7
+ factoryOptions?: {
8
+ /**
9
+ * Return the raw input values rather than the parsed values.
10
+ * @default false
11
+ */
12
+ raw?: boolean;
13
+ },
14
+ ) => <TFieldValues extends FieldValues, TContext>(
15
+ values: TFieldValues,
16
+ context: TContext | undefined,
17
+ options: ResolverOptions<TFieldValues>,
18
+ ) => ResolverResult<TFieldValues>;
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@hookform/resolvers",
3
3
  "amdName": "hookformResolvers",
4
- "version": "3.0.1",
5
- "description": "React Hook Form validation resolvers: Yup, Joi, Superstruct, Zod, Vest, Class Validator, io-ts, Nope, computed-types, TypeBox and Typanion",
4
+ "version": "3.1.1",
5
+ "description": "React Hook Form validation resolvers: Yup, Joi, Superstruct, Zod, Vest, Class Validator, io-ts, Nope, computed-types, TypeBox, arktype and Typanion",
6
6
  "main": "dist/resolvers.js",
7
7
  "module": "dist/resolvers.module.js",
8
8
  "umd:main": "dist/resolvers.umd.js",
@@ -87,6 +87,12 @@
87
87
  "import": "./ajv/dist/ajv.mjs",
88
88
  "require": "./ajv/dist/ajv.js"
89
89
  },
90
+ "./arktype": {
91
+ "types": "./arktype/dist/index.d.ts",
92
+ "umd": "./arktype/dist/arktype.umd.js",
93
+ "import": "./arktype/dist/arktype.mjs",
94
+ "require": "./arktype/dist/arktype.js"
95
+ },
90
96
  "./package.json": "./package.json",
91
97
  "./*": "./*"
92
98
  },
@@ -127,7 +133,10 @@
127
133
  "ajv/dist",
128
134
  "typebox/package.json",
129
135
  "typebox/src",
130
- "typebox/dist"
136
+ "typebox/dist",
137
+ "arktype/package.json",
138
+ "arktype/src",
139
+ "arktype/dist"
131
140
  ],
132
141
  "publishConfig": {
133
142
  "access": "public"
@@ -148,6 +157,7 @@
148
157
  "build:typanion": "microbundle --cwd typanion --globals @hookform/resolvers=hookformResolvers,react-hook-form=ReactHookForm",
149
158
  "build:ajv": "microbundle --cwd ajv --globals @hookform/resolvers=hookformResolvers,react-hook-form=ReactHookForm",
150
159
  "build:typebox": "microbundle --cwd typebox --globals @hookform/resolvers=hookformResolvers,react-hook-form=ReactHookForm,@sinclair/typebox/value=value",
160
+ "build:arktype": "microbundle --cwd arktype --globals @hookform/resolvers=hookformResolvers,react-hook-form=ReactHookForm",
151
161
  "postbuild": "node ./config/node-13-exports.js",
152
162
  "lint": "eslint . --ext .ts,.js --ignore-path .gitignore",
153
163
  "lint:types": "tsc",
@@ -173,7 +183,8 @@
173
183
  "computed-types",
174
184
  "typanion",
175
185
  "ajv",
176
- "TypeBox"
186
+ "TypeBox",
187
+ "arktype"
177
188
  ],
178
189
  "repository": {
179
190
  "type": "git",
@@ -186,25 +197,26 @@
186
197
  },
187
198
  "homepage": "https://react-hook-form.com",
188
199
  "devDependencies": {
189
- "@sinclair/typebox": "^0.26.3",
190
- "@testing-library/dom": "^9.0.1",
200
+ "@sinclair/typebox": "^0.27.6",
201
+ "@testing-library/dom": "^9.2.0",
191
202
  "@testing-library/jest-dom": "^5.16.5",
192
203
  "@testing-library/react": "^14.0.0",
193
204
  "@testing-library/user-event": "^14.4.3",
194
- "@types/node": "^18.15.7",
195
- "@types/react": "^18.0.28",
205
+ "@types/node": "^18.15.11",
206
+ "@types/react": "^18.0.35",
196
207
  "@types/testing-library__jest-dom": "^5.14.5",
197
- "@typescript-eslint/eslint-plugin": "^5.56.0",
198
- "@typescript-eslint/parser": "^5.56.0",
208
+ "@typescript-eslint/eslint-plugin": "^5.58.0",
209
+ "@typescript-eslint/parser": "^5.58.0",
199
210
  "@vitejs/plugin-react": "^3.1.0",
200
211
  "ajv": "^8.12.0",
201
212
  "ajv-errors": "^3.0.0",
213
+ "arktype": "1.0.13-alpha",
202
214
  "check-export-map": "^1.3.0",
203
215
  "class-transformer": "^0.5.1",
204
216
  "class-validator": "^0.14.0",
205
217
  "computed-types": "^1.11.2",
206
218
  "cross-env": "^7.0.3",
207
- "eslint": "^8.36.0",
219
+ "eslint": "^8.38.0",
208
220
  "eslint-config-prettier": "^8.8.0",
209
221
  "fp-ts": "^2.13.1",
210
222
  "husky": "^8.0.3",
@@ -212,7 +224,7 @@
212
224
  "io-ts-types": "^0.5.19",
213
225
  "joi": "^17.9.1",
214
226
  "jsdom": "^21.1.1",
215
- "lint-staged": "^13.2.0",
227
+ "lint-staged": "^13.2.1",
216
228
  "microbundle": "^0.15.1",
217
229
  "monocle-ts": "^2.3.13",
218
230
  "newtype-ts": "^0.3.5",
@@ -221,16 +233,16 @@
221
233
  "prettier": "^2.8.7",
222
234
  "react": "^18.2.0",
223
235
  "react-dom": "^18.2.0",
224
- "react-hook-form": "^7.43.7",
236
+ "react-hook-form": "^7.43.9",
225
237
  "reflect-metadata": "^0.1.13",
226
238
  "superstruct": "^1.0.3",
227
239
  "typanion": "^3.12.1",
228
- "typescript": "^5.0.2",
240
+ "typescript": "^5.0.4",
229
241
  "vest": "^4.6.9",
230
242
  "vite": "^4.2.1",
231
- "vite-tsconfig-paths": "^4.0.7",
232
- "vitest": "^0.29.7",
233
- "yup": "^1.0.2",
243
+ "vite-tsconfig-paths": "^4.2.0",
244
+ "vitest": "^0.30.1",
245
+ "yup": "^1.1.0",
234
246
  "zod": "^3.21.4"
235
247
  },
236
248
  "peerDependencies": {
@@ -4,9 +4,9 @@ exports[`typeboxResolver > should return a single error from typeboxResolver whe
4
4
  {
5
5
  "errors": {
6
6
  "accessToken": {
7
- "message": "Expected string",
7
+ "message": "Expected value of union",
8
8
  "ref": undefined,
9
- "type": "43",
9
+ "type": "53",
10
10
  },
11
11
  "birthYear": {
12
12
  "message": "Expected number",
@@ -77,9 +77,9 @@ exports[`typeboxResolver > should return all the errors from typeboxResolver whe
77
77
  {
78
78
  "errors": {
79
79
  "accessToken": {
80
- "message": "Expected string",
80
+ "message": "Expected value of union",
81
81
  "ref": undefined,
82
- "type": "43",
82
+ "type": "53",
83
83
  "types": {
84
84
  "29": "Expected number",
85
85
  "39": "Expected required property",
@@ -1,2 +1 @@
1
1
  export * from './yup';
2
- export * from './types';
package/yup/dist/yup.d.ts CHANGED
@@ -1,2 +1,13 @@
1
- import { Resolver } from './types';
2
- export declare const yupResolver: Resolver;
1
+ import * as Yup from 'yup';
2
+ import { FieldValues, Resolver } from 'react-hook-form';
3
+ export declare function yupResolver<TFieldValues extends FieldValues>(schema: Yup.ObjectSchema<TFieldValues>, schemaOptions?: Parameters<(typeof schema)['validate']>[1], resolverOptions?: {
4
+ /**
5
+ * @default async
6
+ */
7
+ mode?: 'async' | 'sync';
8
+ /**
9
+ * Return the raw input values rather than the parsed values.
10
+ * @default false
11
+ */
12
+ raw?: boolean;
13
+ }): Resolver<TFieldValues>;
@@ -1 +1 @@
1
- {"version":3,"file":"yup.js","sources":["../src/yup.ts"],"sourcesContent":["import * as Yup from 'yup';\nimport { toNestError, validateFieldsNatively } from '@hookform/resolvers';\nimport { appendErrors, FieldError } from 'react-hook-form';\nimport { Resolver } from './types';\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 */\nconst 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 const yupResolver: Resolver =\n (schema, schemaOptions = {}, resolverOptions = {}) =>\n 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 ? values : result,\n errors: {},\n };\n } catch (e: any) {\n if (!e.inner) {\n throw e;\n }\n\n return {\n values: {},\n errors: toNestError(\n parseErrorSchema(\n e,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\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","toNestError","error","validateAllFieldCriteria","criteriaMode","reduce","previous","path","message","type","types","messages","appendErrors","concat","reject"],"mappings":"sFAyCE,SAACA,EAAQC,EAAoBC,GAAoB,YAAxCD,IAAAA,IAAAA,EAAgB,aAAIC,IAAAA,EAAkB,CAAA,GAAE,SAC1CC,EAAQC,EAASC,GAAO,WAAIC,QAAAC,iCAE3BN,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,yBAAuB,CAAA,EAAIf,GAEzD,CACLF,OAAQD,EAAgBmB,IAAMlB,EAASe,EACvCI,OAAQ,CAAA,EACR,6DArB6BC,CAC7B,EAqBKC,SAAAA,GACP,IAAKA,EAAEC,MACL,MAAMD,EAGR,MAAO,CACLrB,OAAQ,CAAE,EACVmB,OAAQI,EAAAA,aA7DdC,EA+DUH,EA9DVI,GA+DWvB,EAAQc,2BACkB,QAAzBd,EAAQwB,cA9DZF,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,QAEb,CAED,OAAOF,CACT,EACA,CAAA,IAyCM1B,IApEe,IACvBsB,EACAC,CAqEG,GACH,CAAC,MAAAJ,UAAAlB,QAAAiC,OAAAf,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"yup.js","sources":["../src/yup.ts"],"sourcesContent":["import * as Yup from 'yup';\nimport { toNestError, validateFieldsNatively } from '@hookform/resolvers';\nimport {\n appendErrors,\n FieldError,\n FieldValues,\n Resolver,\n} from 'react-hook-form';\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 */\nconst 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<TFieldValues extends FieldValues>(\n schema: Yup.ObjectSchema<TFieldValues>,\n schemaOptions: Parameters<(typeof schema)['validate']>[1] = {},\n resolverOptions: {\n /**\n * @default async\n */\n mode?: 'async' | 'sync';\n /**\n * Return the raw input values rather than the parsed values.\n * @default false\n */\n raw?: boolean;\n } = {},\n): Resolver<TFieldValues> {\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 ? values : result,\n errors: {},\n };\n } catch (e: any) {\n if (!e.inner) {\n throw e;\n }\n\n return {\n values: {},\n errors: toNestError(\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","toNestError","error","validateAllFieldCriteria","criteriaMode","reduce","previous","path","message","type","types","messages","appendErrors","concat","reject"],"mappings":"+FA6CEA,EACAC,EACAC,GAYA,gBAbAD,IAAAA,EAA4D,CAAE,YAC9DC,IAAAA,EAUI,aAEUC,EAAQC,EAASC,OAAWC,OAAAA,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,KAAA,SALKC,GASN,OAFAb,EAAQc,2BAA6BC,EAAAA,uBAAuB,CAAE,EAAEf,GAEzD,CACLF,OAAQD,EAAgBmB,IAAMlB,EAASe,EACvCI,OAAQ,CAAA,EACR,6DArBoCC,CACpC,EAqBH,SAAQC,GACP,IAAKA,EAAEC,MACL,MAAMD,EAGR,MAAO,CACLrB,OAAQ,CAAE,EACVmB,OAAQI,EAAAA,aA1EdC,EA4EUH,EA3EVI,GA4EWvB,EAAQc,2BACkB,QAAzBd,EAAQwB,cA3EZF,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,EAAAA,aACtBV,EAAMK,KACNJ,EACAG,EACAJ,EAAMO,KACNE,EACK,GAAgBE,OAAOF,EAAsBT,EAAMM,SACpDN,EAAMM,QAEb,CAED,OAAOF,CACT,EACA,KAsDM1B,IAjFe,IACvBsB,EACAC,CAkFG,GACH,CAAC,MAAAJ,GAAA,OAAAlB,QAAAiC,OAAAf,EACH,CAAA,CAAA"}
package/yup/dist/yup.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{validateFieldsNatively as e,toNestError as t}from"@hookform/resolvers";import{appendErrors as r}from"react-hook-form";var o=function(o,n,a){return void 0===n&&(n={}),void 0===a&&(a={}),function(s,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"===a.mode?"validateSync":"validate"](s,Object.assign({abortEarly:!1},n,{context:i}))).then(function(t){return c.shouldUseNativeValidation&&e({},c),{values:a.raw?s: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,a=o&&o[t.type];e[t.path]=r(t.path,n,e,t.type,a?[].concat(a,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,toNestError as t}from"@hookform/resolvers";import{appendErrors as r}from"react-hook-form";function o(o,n,a){return void 0===n&&(n={}),void 0===a&&(a={}),function(s,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"===a.mode?"validateSync":"validate"](s,Object.assign({abortEarly:!1},n,{context:i}))).then(function(t){return c.shouldUseNativeValidation&&e({},c),{values:a.raw?s: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,a=o&&o[t.type];e[t.path]=r(t.path,n,e,t.type,a?[].concat(a,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,toNestError as t}from"@hookform/resolvers";import{appendErrors as o}from"react-hook-form";const a=(a,r={},s={})=>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?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,toNestError as t}from"@hookform/resolvers";import{appendErrors as o}from"react-hook-form";function r(r,a={},s={}){return async(n,c,i)=>{try{a.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 r["sync"===s.mode?"validateSync":"validate"](n,Object.assign({abortEarly:!1},a,{context:c}));return i.shouldUseNativeValidation&&e({},i),{values:s.raw?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 r=e[t.path].types,a=r&&r[t.type];e[t.path]=o(t.path,l,e,t.type,a?[].concat(a,t.message):t.message)}return e},{})),i)}}var p,l}}export{r as yupResolver};
2
2
  //# sourceMappingURL=yup.modern.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"yup.modern.mjs","sources":["../src/yup.ts"],"sourcesContent":["import * as Yup from 'yup';\nimport { toNestError, validateFieldsNatively } from '@hookform/resolvers';\nimport { appendErrors, FieldError } from 'react-hook-form';\nimport { Resolver } from './types';\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 */\nconst 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 const yupResolver: Resolver =\n (schema, schemaOptions = {}, resolverOptions = {}) =>\n 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 ? values : result,\n errors: {},\n };\n } catch (e: any) {\n if (!e.inner) {\n throw e;\n }\n\n return {\n values: {},\n errors: toNestError(\n parseErrorSchema(\n e,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n };\n"],"names":["yupResolver","schema","schemaOptions","resolverOptions","async","values","context","options","process","env","NODE_ENV","console","warn","result","mode","Object","assign","abortEarly","shouldUseNativeValidation","validateFieldsNatively","raw","errors","e","inner","toNestError","error","validateAllFieldCriteria","criteriaMode","reduce","previous","path","message","type","types","messages","appendErrors","concat","parseErrorSchema"],"mappings":"6HASA,MA+BaA,EACXA,CAACC,EAAQC,EAAgB,GAAIC,EAAkB,CAAA,IAC/CC,MAAOC,EAAQC,EAASC,KACtB,IACML,EAAcI,SAAoC,gBAAzBE,QAAQC,IAAIC,UAEvCC,QAAQC,KACN,iGAIJ,MAAMC,QAAeZ,EACM,SAAzBE,EAAgBW,KAAkB,eAAiB,YAEnDT,EACAU,OAAOC,OAAO,CAAEC,YAAY,GAASf,EAAe,CAAEI,aAKxD,OAFAC,EAAQW,2BAA6BC,EAAuB,CAAA,EAAIZ,GAEzD,CACLF,OAAQF,EAAgBiB,IAAMf,EAASQ,EACvCQ,OAAQ,GAEX,CAAC,MAAOC,GACP,IAAKA,EAAEC,MACL,MAAMD,EAGR,MAAO,CACLjB,OAAQ,CAAE,EACVgB,OAAQG,GA7DdC,EA+DUH,EA9DVI,GA+DWnB,EAAQW,2BACkB,QAAzBX,EAAQoB,cA9DZF,EAAMF,OAAS,IAAIK,OACzB,CAACC,EAAUJ,KAKT,GAJKI,EAASJ,EAAMK,QAClBD,EAASJ,EAAMK,MAAS,CAAEC,QAASN,EAAMM,QAASC,KAAMP,EAAMO,OAG5DN,EAA0B,CAC5B,MAAMO,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,QAEb,CAED,OAAOF,GAET,CAAA,IAyCMtB,GAGL,CAvEoB8B,IACvBZ,EACAC,CAqEG"}
1
+ {"version":3,"file":"yup.modern.mjs","sources":["../src/yup.ts"],"sourcesContent":["import * as Yup from 'yup';\nimport { toNestError, validateFieldsNatively } from '@hookform/resolvers';\nimport {\n appendErrors,\n FieldError,\n FieldValues,\n Resolver,\n} from 'react-hook-form';\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 */\nconst 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<TFieldValues extends FieldValues>(\n schema: Yup.ObjectSchema<TFieldValues>,\n schemaOptions: Parameters<(typeof schema)['validate']>[1] = {},\n resolverOptions: {\n /**\n * @default async\n */\n mode?: 'async' | 'sync';\n /**\n * Return the raw input values rather than the parsed values.\n * @default false\n */\n raw?: boolean;\n } = {},\n): Resolver<TFieldValues> {\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 ? values : result,\n errors: {},\n };\n } catch (e: any) {\n if (!e.inner) {\n throw e;\n }\n\n return {\n values: {},\n errors: toNestError(\n parseErrorSchema(\n e,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n };\n}\n"],"names":["yupResolver","schema","schemaOptions","resolverOptions","async","values","context","options","process","env","NODE_ENV","console","warn","result","mode","Object","assign","abortEarly","shouldUseNativeValidation","validateFieldsNatively","raw","errors","e","inner","toNestError","error","validateAllFieldCriteria","criteriaMode","reduce","previous","path","message","type","types","messages","appendErrors","concat","parseErrorSchema"],"mappings":"sIA4CgBA,EACdC,EACAC,EAA4D,CAAE,EAC9DC,EAUI,CAAA,GAEJ,OAAOC,MAAOC,EAAQC,EAASC,KAC7B,IACML,EAAcI,SAAoC,gBAAzBE,QAAQC,IAAIC,UAEvCC,QAAQC,KACN,iGAIJ,MAAMC,QAAeZ,EACM,SAAzBE,EAAgBW,KAAkB,eAAiB,YAEnDT,EACAU,OAAOC,OAAO,CAAEC,YAAY,GAASf,EAAe,CAAEI,aAKxD,OAFAC,EAAQW,2BAA6BC,EAAuB,CAAA,EAAIZ,GAEzD,CACLF,OAAQF,EAAgBiB,IAAMf,EAASQ,EACvCQ,OAAQ,GAEX,CAAC,MAAOC,GACP,IAAKA,EAAEC,MACL,MAAMD,EAGR,MAAO,CACLjB,OAAQ,CAAE,EACVgB,OAAQG,GA1EdC,EA4EUH,EA3EVI,GA4EWnB,EAAQW,2BACkB,QAAzBX,EAAQoB,cA3EZF,EAAMF,OAAS,IAAIK,OACzB,CAACC,EAAUJ,KAKT,GAJKI,EAASJ,EAAMK,QAClBD,EAASJ,EAAMK,MAAS,CAAEC,QAASN,EAAMM,QAASC,KAAMP,EAAMO,OAG5DN,EAA0B,CAC5B,MAAMO,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,QAEb,CAED,OAAOF,GAET,CAAE,IAsDItB,GAGL,CApFoB8B,IACvBZ,EACAC,CAkFG,CAEL"}
@@ -1,2 +1,2 @@
1
- import{validateFieldsNatively as e,toNestError as t}from"@hookform/resolvers";import{appendErrors as r}from"react-hook-form";var o=function(o,n,a){return void 0===n&&(n={}),void 0===a&&(a={}),function(s,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"===a.mode?"validateSync":"validate"](s,Object.assign({abortEarly:!1},n,{context:i}))).then(function(t){return c.shouldUseNativeValidation&&e({},c),{values:a.raw?s: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,a=o&&o[t.type];e[t.path]=r(t.path,n,e,t.type,a?[].concat(a,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,toNestError as t}from"@hookform/resolvers";import{appendErrors as r}from"react-hook-form";function o(o,n,a){return void 0===n&&(n={}),void 0===a&&(a={}),function(s,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"===a.mode?"validateSync":"validate"](s,Object.assign({abortEarly:!1},n,{context:i}))).then(function(t){return c.shouldUseNativeValidation&&e({},c),{values:a.raw?s: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,a=o&&o[t.type];e[t.path]=r(t.path,n,e,t.type,a?[].concat(a,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 +1 @@
1
- {"version":3,"file":"yup.module.js","sources":["../src/yup.ts"],"sourcesContent":["import * as Yup from 'yup';\nimport { toNestError, validateFieldsNatively } from '@hookform/resolvers';\nimport { appendErrors, FieldError } from 'react-hook-form';\nimport { Resolver } from './types';\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 */\nconst 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 const yupResolver: Resolver =\n (schema, schemaOptions = {}, resolverOptions = {}) =>\n 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 ? values : result,\n errors: {},\n };\n } catch (e: any) {\n if (!e.inner) {\n throw e;\n }\n\n return {\n values: {},\n errors: toNestError(\n parseErrorSchema(\n e,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n };\n"],"names":["yupResolver","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","toNestError","error","validateAllFieldCriteria","criteriaMode","reduce","previous","path","message","type","types","messages","appendErrors","concat","reject"],"mappings":"6HASA,IA+BaA,EACX,SAACC,EAAQC,EAAoBC,GAAoB,YAAxCD,IAAAA,IAAAA,EAAgB,aAAIC,IAAAA,EAAkB,CAAA,GAAE,SAC1CC,EAAQC,EAASC,GAAO,WAAIC,QAAAC,iCAE3BN,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,EAAuB,CAAA,EAAIf,GAEzD,CACLF,OAAQD,EAAgBmB,IAAMlB,EAASe,EACvCI,OAAQ,CAAA,EACR,6DArB6BC,CAC7B,EAqBKC,SAAAA,GACP,IAAKA,EAAEC,MACL,MAAMD,EAGR,MAAO,CACLrB,OAAQ,CAAE,EACVmB,OAAQI,GA7DdC,EA+DUH,EA9DVI,GA+DWvB,EAAQc,2BACkB,QAAzBd,EAAQwB,cA9DZF,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,QAEb,CAED,OAAOF,CACT,EACA,CAAA,IAyCM1B,IApEe,IACvBsB,EACAC,CAqEG,GACH,CAAC,MAAAJ,UAAAlB,QAAAiC,OAAAf,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"yup.module.js","sources":["../src/yup.ts"],"sourcesContent":["import * as Yup from 'yup';\nimport { toNestError, validateFieldsNatively } from '@hookform/resolvers';\nimport {\n appendErrors,\n FieldError,\n FieldValues,\n Resolver,\n} from 'react-hook-form';\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 */\nconst 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<TFieldValues extends FieldValues>(\n schema: Yup.ObjectSchema<TFieldValues>,\n schemaOptions: Parameters<(typeof schema)['validate']>[1] = {},\n resolverOptions: {\n /**\n * @default async\n */\n mode?: 'async' | 'sync';\n /**\n * Return the raw input values rather than the parsed values.\n * @default false\n */\n raw?: boolean;\n } = {},\n): Resolver<TFieldValues> {\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 ? values : result,\n errors: {},\n };\n } catch (e: any) {\n if (!e.inner) {\n throw e;\n }\n\n return {\n values: {},\n errors: toNestError(\n parseErrorSchema(\n e,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n };\n}\n"],"names":["yupResolver","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","toNestError","error","validateAllFieldCriteria","criteriaMode","reduce","previous","path","message","type","types","messages","appendErrors","concat","reject"],"mappings":"sIA4CgBA,EACdC,EACAC,EACAC,GAYA,gBAbAD,IAAAA,EAA4D,CAAE,YAC9DC,IAAAA,EAUI,aAEUC,EAAQC,EAASC,OAAWC,OAAAA,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,KAAA,SALKC,GASN,OAFAb,EAAQc,2BAA6BC,EAAuB,CAAE,EAAEf,GAEzD,CACLF,OAAQD,EAAgBmB,IAAMlB,EAASe,EACvCI,OAAQ,CAAA,EACR,6DArBoCC,CACpC,EAqBH,SAAQC,GACP,IAAKA,EAAEC,MACL,MAAMD,EAGR,MAAO,CACLrB,OAAQ,CAAE,EACVmB,OAAQI,GA1EdC,EA4EUH,EA3EVI,GA4EWvB,EAAQc,2BACkB,QAAzBd,EAAQwB,cA3EZF,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,QAEb,CAED,OAAOF,CACT,EACA,KAsDM1B,IAjFe,IACvBsB,EACAC,CAkFG,GACH,CAAC,MAAAJ,GAAA,OAAAlB,QAAAiC,OAAAf,EACH,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"yup.umd.js","sources":["../src/yup.ts"],"sourcesContent":["import * as Yup from 'yup';\nimport { toNestError, validateFieldsNatively } from '@hookform/resolvers';\nimport { appendErrors, FieldError } from 'react-hook-form';\nimport { Resolver } from './types';\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 */\nconst 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 const yupResolver: Resolver =\n (schema, schemaOptions = {}, resolverOptions = {}) =>\n 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 ? values : result,\n errors: {},\n };\n } catch (e: any) {\n if (!e.inner) {\n throw e;\n }\n\n return {\n values: {},\n errors: toNestError(\n parseErrorSchema(\n e,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\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","toNestError","error","validateAllFieldCriteria","criteriaMode","reduce","previous","path","message","type","types","messages","appendErrors","concat","reject"],"mappings":"sYAyCE,SAACA,EAAQC,EAAoBC,GAAoB,YAAxCD,IAAAA,IAAAA,EAAgB,aAAIC,IAAAA,EAAkB,CAAA,GAAE,SAC1CC,EAAQC,EAASC,GAAO,WAAIC,QAAAC,iCAE3BN,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,yBAAuB,CAAA,EAAIf,GAEzD,CACLF,OAAQD,EAAgBmB,IAAMlB,EAASe,EACvCI,OAAQ,CAAA,EACR,6DArB6BC,CAC7B,EAqBKC,SAAAA,GACP,IAAKA,EAAEC,MACL,MAAMD,EAGR,MAAO,CACLrB,OAAQ,CAAE,EACVmB,OAAQI,EAAAA,aA7DdC,EA+DUH,EA9DVI,GA+DWvB,EAAQc,2BACkB,QAAzBd,EAAQwB,cA9DZF,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,QAEb,CAED,OAAOF,CACT,EACA,CAAA,IAyCM1B,IApEe,IACvBsB,EACAC,CAqEG,GACH,CAAC,MAAAJ,UAAAlB,QAAAiC,OAAAf,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"yup.umd.js","sources":["../src/yup.ts"],"sourcesContent":["import * as Yup from 'yup';\nimport { toNestError, validateFieldsNatively } from '@hookform/resolvers';\nimport {\n appendErrors,\n FieldError,\n FieldValues,\n Resolver,\n} from 'react-hook-form';\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 */\nconst 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<TFieldValues extends FieldValues>(\n schema: Yup.ObjectSchema<TFieldValues>,\n schemaOptions: Parameters<(typeof schema)['validate']>[1] = {},\n resolverOptions: {\n /**\n * @default async\n */\n mode?: 'async' | 'sync';\n /**\n * Return the raw input values rather than the parsed values.\n * @default false\n */\n raw?: boolean;\n } = {},\n): Resolver<TFieldValues> {\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 ? values : result,\n errors: {},\n };\n } catch (e: any) {\n if (!e.inner) {\n throw e;\n }\n\n return {\n values: {},\n errors: toNestError(\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","toNestError","error","validateAllFieldCriteria","criteriaMode","reduce","previous","path","message","type","types","messages","appendErrors","concat","reject"],"mappings":"+YA6CEA,EACAC,EACAC,GAYA,gBAbAD,IAAAA,EAA4D,CAAE,YAC9DC,IAAAA,EAUI,aAEUC,EAAQC,EAASC,OAAWC,OAAAA,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,KAAA,SALKC,GASN,OAFAb,EAAQc,2BAA6BC,EAAAA,uBAAuB,CAAE,EAAEf,GAEzD,CACLF,OAAQD,EAAgBmB,IAAMlB,EAASe,EACvCI,OAAQ,CAAA,EACR,6DArBoCC,CACpC,EAqBH,SAAQC,GACP,IAAKA,EAAEC,MACL,MAAMD,EAGR,MAAO,CACLrB,OAAQ,CAAE,EACVmB,OAAQI,EAAAA,aA1EdC,EA4EUH,EA3EVI,GA4EWvB,EAAQc,2BACkB,QAAzBd,EAAQwB,cA3EZF,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,EAAAA,aACtBV,EAAMK,KACNJ,EACAG,EACAJ,EAAMO,KACNE,EACK,GAAgBE,OAAOF,EAAsBT,EAAMM,SACpDN,EAAMM,QAEb,CAED,OAAOF,CACT,EACA,KAsDM1B,IAjFe,IACvBsB,EACAC,CAkFG,GACH,CAAC,MAAAJ,GAAA,OAAAlB,QAAAiC,OAAAf,EACH,CAAA,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { render, screen } from '@testing-library/react';
3
3
  import user from '@testing-library/user-event';
4
- import { useForm } from 'react-hook-form';
4
+ import { SubmitHandler, useForm } from 'react-hook-form';
5
5
  import * as Yup from 'yup';
6
6
  import { yupResolver } from '..';
7
7
 
@@ -10,10 +10,10 @@ const schema = Yup.object({
10
10
  password: Yup.string().required(),
11
11
  });
12
12
 
13
- type FormData = Yup.InferType<typeof schema> & { unusedProperty: string };
13
+ type FormData = Yup.InferType<typeof schema>;
14
14
 
15
15
  interface Props {
16
- onSubmit: (data: FormData) => void;
16
+ onSubmit: SubmitHandler<FormData>;
17
17
  }
18
18
 
19
19
  function TestComponent({ onSubmit }: Props) {
@@ -21,7 +21,7 @@ function TestComponent({ onSubmit }: Props) {
21
21
  register,
22
22
  formState: { errors },
23
23
  handleSubmit,
24
- } = useForm<FormData>({
24
+ } = useForm({
25
25
  resolver: yupResolver(schema), // Useful to check TypeScript regressions
26
26
  });
27
27
 
@@ -35,7 +35,7 @@ export const schemaWithWhen = yup.object({
35
35
  }),
36
36
  });
37
37
 
38
- export const validData: yup.InferType<typeof schema> = {
38
+ export const validData = {
39
39
  username: 'Doe',
40
40
  password: 'Password123_',
41
41
  repeatPassword: 'Password123_',
@@ -50,14 +50,15 @@ export const validData: yup.InferType<typeof schema> = {
50
50
  name: 'name',
51
51
  },
52
52
  ],
53
- };
53
+ } satisfies yup.InferType<typeof schema>;
54
54
 
55
55
  export const invalidData = {
56
56
  password: '___',
57
57
  email: '',
58
58
  birthYear: 'birthYear',
59
59
  like: [{ id: 'z' }],
60
- };
60
+ // Must be set to "unknown", otherwise typescript knows that it is invalid
61
+ } as unknown as Required<yup.InferType<typeof schema>>;
61
62
 
62
63
  export const fields: Record<InternalFieldName, Field['_f']> = {
63
64
  username: {
package/yup/src/index.ts CHANGED
@@ -1,2 +1 @@
1
1
  export * from './yup';
2
- export * from './types';
package/yup/src/yup.ts CHANGED
@@ -1,7 +1,11 @@
1
1
  import * as Yup from 'yup';
2
2
  import { toNestError, validateFieldsNatively } from '@hookform/resolvers';
3
- import { appendErrors, FieldError } from 'react-hook-form';
4
- import { Resolver } from './types';
3
+ import {
4
+ appendErrors,
5
+ FieldError,
6
+ FieldValues,
7
+ Resolver,
8
+ } from 'react-hook-form';
5
9
 
6
10
  /**
7
11
  * Why `path!` ? because it could be `undefined` in some case
@@ -38,9 +42,22 @@ const parseErrorSchema = (
38
42
  );
39
43
  };
40
44
 
41
- export const yupResolver: Resolver =
42
- (schema, schemaOptions = {}, resolverOptions = {}) =>
43
- async (values, context, options) => {
45
+ export function yupResolver<TFieldValues extends FieldValues>(
46
+ schema: Yup.ObjectSchema<TFieldValues>,
47
+ schemaOptions: Parameters<(typeof schema)['validate']>[1] = {},
48
+ resolverOptions: {
49
+ /**
50
+ * @default async
51
+ */
52
+ mode?: 'async' | 'sync';
53
+ /**
54
+ * Return the raw input values rather than the parsed values.
55
+ * @default false
56
+ */
57
+ raw?: boolean;
58
+ } = {},
59
+ ): Resolver<TFieldValues> {
60
+ return async (values, context, options) => {
44
61
  try {
45
62
  if (schemaOptions.context && process.env.NODE_ENV === 'development') {
46
63
  // eslint-disable-next-line no-console
@@ -80,3 +97,4 @@ export const yupResolver: Resolver =
80
97
  };
81
98
  }
82
99
  };
100
+ }
@@ -1,15 +0,0 @@
1
- import { FieldValues, ResolverOptions, ResolverResult } from 'react-hook-form';
2
- import * as Yup from 'yup';
3
- type Options<T extends Yup.ObjectSchema<any>> = Parameters<T['validate']>[1];
4
- export type Resolver = <T extends Yup.ObjectSchema<any>>(schema: T, schemaOptions?: Options<T>, factoryOptions?: {
5
- /**
6
- * @default async
7
- */
8
- mode?: 'async' | 'sync';
9
- /**
10
- * Return the raw input values rather than the parsed values.
11
- * @default false
12
- */
13
- raw?: boolean;
14
- }) => <TFieldValues extends FieldValues, TContext>(values: TFieldValues, context: TContext | undefined, options: ResolverOptions<TFieldValues>) => Promise<ResolverResult<TFieldValues>>;
15
- export {};
package/yup/src/types.ts DELETED
@@ -1,24 +0,0 @@
1
- import { FieldValues, ResolverOptions, ResolverResult } from 'react-hook-form';
2
- import * as Yup from 'yup';
3
-
4
- type Options<T extends Yup.ObjectSchema<any>> = Parameters<T['validate']>[1];
5
-
6
- export type Resolver = <T extends Yup.ObjectSchema<any>>(
7
- schema: T,
8
- schemaOptions?: Options<T>,
9
- factoryOptions?: {
10
- /**
11
- * @default async
12
- */
13
- mode?: 'async' | 'sync';
14
- /**
15
- * Return the raw input values rather than the parsed values.
16
- * @default false
17
- */
18
- raw?: boolean;
19
- },
20
- ) => <TFieldValues extends FieldValues, TContext>(
21
- values: TFieldValues,
22
- context: TContext | undefined,
23
- options: ResolverOptions<TFieldValues>,
24
- ) => Promise<ResolverResult<TFieldValues>>;