@hookform/resolvers 2.0.0-beta.7 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/README.md +19 -10
  2. package/dist/index.d.ts +1 -1
  3. package/dist/resolvers.js +1 -1
  4. package/dist/resolvers.js.map +1 -1
  5. package/dist/resolvers.mjs +1 -1
  6. package/dist/resolvers.modern.js +1 -1
  7. package/dist/resolvers.modern.js.map +1 -1
  8. package/dist/resolvers.module.js +1 -1
  9. package/dist/resolvers.module.js.map +1 -1
  10. package/dist/resolvers.umd.js +1 -1
  11. package/dist/resolvers.umd.js.map +1 -1
  12. package/dist/toNestError.d.ts +2 -0
  13. package/joi/dist/joi.js +1 -1
  14. package/joi/dist/joi.js.map +1 -1
  15. package/joi/dist/joi.mjs +1 -1
  16. package/joi/dist/joi.modern.js +1 -1
  17. package/joi/dist/joi.modern.js.map +1 -1
  18. package/joi/dist/joi.module.js +1 -1
  19. package/joi/dist/joi.module.js.map +1 -1
  20. package/joi/dist/joi.umd.js +1 -1
  21. package/joi/dist/joi.umd.js.map +1 -1
  22. package/joi/dist/types.d.ts +1 -1
  23. package/joi/src/__tests__/__fixtures__/data.ts +76 -0
  24. package/joi/src/__tests__/__snapshots__/joi.ts.snap +118 -0
  25. package/joi/src/__tests__/joi.ts +35 -88
  26. package/joi/src/joi.ts +47 -64
  27. package/joi/src/types.ts +1 -1
  28. package/package.json +14 -15
  29. package/superstruct/dist/superstruct.js +1 -1
  30. package/superstruct/dist/superstruct.js.map +1 -1
  31. package/superstruct/dist/superstruct.mjs +1 -1
  32. package/superstruct/dist/superstruct.modern.js +1 -1
  33. package/superstruct/dist/superstruct.modern.js.map +1 -1
  34. package/superstruct/dist/superstruct.module.js +1 -1
  35. package/superstruct/dist/superstruct.module.js.map +1 -1
  36. package/superstruct/dist/superstruct.umd.js +1 -1
  37. package/superstruct/dist/superstruct.umd.js.map +1 -1
  38. package/superstruct/dist/types.d.ts +1 -1
  39. package/superstruct/package.json +2 -1
  40. package/superstruct/src/__tests__/__fixtures__/data.ts +73 -0
  41. package/superstruct/src/__tests__/__snapshots__/superstruct.ts.snap +26 -56
  42. package/superstruct/src/__tests__/superstruct.ts +6 -65
  43. package/superstruct/src/superstruct.ts +20 -53
  44. package/superstruct/src/types.ts +1 -1
  45. package/vest/dist/vest.js +1 -1
  46. package/vest/dist/vest.js.map +1 -1
  47. package/vest/dist/vest.mjs +1 -1
  48. package/vest/dist/vest.modern.js +1 -1
  49. package/vest/dist/vest.modern.js.map +1 -1
  50. package/vest/dist/vest.module.js +1 -1
  51. package/vest/dist/vest.module.js.map +1 -1
  52. package/vest/dist/vest.umd.js +1 -1
  53. package/vest/dist/vest.umd.js.map +1 -1
  54. package/vest/package.json +3 -1
  55. package/vest/src/__tests__/__fixtures__/data.ts +67 -0
  56. package/vest/src/__tests__/__snapshots__/vest.ts.snap +28 -0
  57. package/vest/src/__tests__/vest.ts +22 -95
  58. package/vest/src/types.ts +1 -1
  59. package/vest/src/vest.ts +31 -42
  60. package/yup/dist/types.d.ts +4 -3
  61. package/yup/dist/yup.js +1 -1
  62. package/yup/dist/yup.js.map +1 -1
  63. package/yup/dist/yup.mjs +1 -1
  64. package/yup/dist/yup.modern.js +1 -1
  65. package/yup/dist/yup.modern.js.map +1 -1
  66. package/yup/dist/yup.module.js +1 -1
  67. package/yup/dist/yup.module.js.map +1 -1
  68. package/yup/dist/yup.umd.js +1 -1
  69. package/yup/dist/yup.umd.js.map +1 -1
  70. package/yup/package.json +2 -1
  71. package/yup/src/__tests__/__fixtures__/data.ts +65 -0
  72. package/yup/src/__tests__/__snapshots__/yup.ts.snap +99 -13
  73. package/yup/src/__tests__/yup.ts +23 -97
  74. package/yup/src/types.ts +6 -3
  75. package/yup/src/yup.ts +30 -60
  76. package/zod/dist/types.d.ts +1 -1
  77. package/zod/dist/zod.js +1 -1
  78. package/zod/dist/zod.js.map +1 -1
  79. package/zod/dist/zod.mjs +1 -1
  80. package/zod/dist/zod.modern.js +1 -1
  81. package/zod/dist/zod.modern.js.map +1 -1
  82. package/zod/dist/zod.module.js +1 -1
  83. package/zod/dist/zod.module.js.map +1 -1
  84. package/zod/dist/zod.umd.js +1 -1
  85. package/zod/dist/zod.umd.js.map +1 -1
  86. package/zod/src/__tests__/__fixtures__/data.ts +68 -0
  87. package/zod/src/__tests__/__snapshots__/zod.ts.snap +146 -0
  88. package/zod/src/__tests__/zod.ts +19 -79
  89. package/zod/src/types.ts +1 -1
  90. package/zod/src/zod.ts +45 -50
  91. package/dist/convertArrayToPathName.d.ts +0 -1
package/README.md CHANGED
@@ -26,12 +26,13 @@ We are moving away from native support for Yup validation. We are now supporting
26
26
 
27
27
  ## API
28
28
 
29
- `resolver(schema: object, config?: object)`
29
+ `resolver(schema: object, schemaOptions?: object, resolverOptions: { mode: 'async' | 'sync' })`
30
30
 
31
- | | type | Required | Description |
32
- | ------ | -------- | -------- | -------------------------------------- |
33
- | schema | `object` | ✓ | validation schema |
34
- | config | `object` | | validation schema configuration object |
31
+ | | type | Required | Description |
32
+ | --------------- | -------- | -------- | --------------------------------------------- |
33
+ | schema | `object` | ✓ | validation schema |
34
+ | schemaOptions | `object` | | validation library schema options |
35
+ | resolverOptions | `object` | | resolver options, `async` is the default mode |
35
36
 
36
37
  ## Quickstart
37
38
 
@@ -65,6 +66,8 @@ const App = () => {
65
66
  </form>
66
67
  );
67
68
  };
69
+
70
+ export default App;
68
71
  ```
69
72
 
70
73
  ### [Zod](https://github.com/vriad/zod)
@@ -115,11 +118,11 @@ A simple and composable way to validate data in JavaScript (or TypeScript).
115
118
  import React from 'react';
116
119
  import { useForm } from 'react-hook-form';
117
120
  import { superstructResolver } from '@hookform/resolvers/superstruct';
118
- import { struct } from 'superstruct';
121
+ import { object, string, number } from 'superstruct';
119
122
 
120
- const schema = struct({
121
- name: 'string',
122
- age: 'number',
123
+ const schema = object({
124
+ name: string(),
125
+ age: number(),
123
126
  });
124
127
 
125
128
  const App = () => {
@@ -130,11 +133,13 @@ const App = () => {
130
133
  return (
131
134
  <form onSubmit={handleSubmit((d) => console.log(d))}>
132
135
  <input name="name" ref={register} />
133
- <input name="age" type="number" ref={register} />
136
+ <input name="age" type="number" ref={register({ valueAsNumber: true })} />
134
137
  <input type="submit" />
135
138
  </form>
136
139
  );
137
140
  };
141
+
142
+ export default App;
138
143
  ```
139
144
 
140
145
  ### [Joi](https://github.com/sideway/joi)
@@ -166,6 +171,8 @@ const App = () => {
166
171
  </form>
167
172
  );
168
173
  };
174
+
175
+ export default App;
169
176
  ```
170
177
 
171
178
  ### [Vest](https://github.com/ealush/vest)
@@ -219,6 +226,8 @@ const App = () => {
219
226
  </form>
220
227
  );
221
228
  };
229
+
230
+ export default App;
222
231
  ```
223
232
 
224
233
  ## Backers
package/dist/index.d.ts CHANGED
@@ -1 +1 @@
1
- export * from './convertArrayToPathName';
1
+ export * from './toNestError';
package/dist/resolvers.js CHANGED
@@ -1,2 +1,2 @@
1
- exports.convertArrayToPathName=function(r){return r.reduce(function(r,t,n){return r+("string"==typeof t?(n>0?".":"")+t:"["+t+"]")},"").toString()};
1
+ var r=require("react-hook-form");exports.toNestError=function(e,t){var o={};for(var a in e){var f=r.get(t,a);r.set(o,a,Object.assign(e[a],{ref:f&&f.ref}))}return o};
2
2
  //# sourceMappingURL=resolvers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolvers.js","sources":["../src/convertArrayToPathName.ts"],"sourcesContent":["export const convertArrayToPathName = (paths: (string | number)[]): string =>\n paths\n .reduce(\n (previous, path: string | number, index): string =>\n `${previous}${\n typeof path === 'string'\n ? `${index > 0 ? '.' : ''}${path}`\n : `[${path}]`\n }`,\n '',\n )\n .toString();\n"],"names":["paths","reduce","previous","path","index","toString"],"mappings":"+BAAsC,SAACA,UACrCA,EACGC,OACC,SAACC,EAAUC,EAAuBC,UAC7BF,GACe,iBAATC,GACAC,EAAQ,EAAI,IAAM,IAAKD,MACtBA,QAEZ,IAEDE"}
1
+ {"version":3,"file":"resolvers.js","sources":["../src/toNestError.ts"],"sourcesContent":["import {\n set,\n get,\n FieldError,\n FieldErrors,\n Field,\n InternalFieldName,\n} from 'react-hook-form';\n\nexport const toNestError = <TFieldValues>(\n errors: Record<string, FieldError>,\n fields: Record<InternalFieldName, Field['_f']>,\n): FieldErrors<TFieldValues> => {\n const fieldErrors: FieldErrors<TFieldValues> = {};\n for (const path in errors) {\n const field = get(fields, path) as Field['_f'] | undefined;\n set(\n fieldErrors,\n path,\n Object.assign(errors[path], { ref: field && field.ref }),\n );\n }\n\n return fieldErrors;\n};\n"],"names":["errors","fields","fieldErrors","path","field","get","set","Object","assign","ref"],"mappings":"qDAS2B,SACzBA,EACAC,GAEA,IAAMC,EAAyC,GAC/C,IAAK,IAAMC,KAAQH,EAAQ,CACzB,IAAMI,EAAQC,MAAIJ,EAAQE,GAC1BG,MACEJ,EACAC,EACAI,OAAOC,OAAOR,EAAOG,GAAO,CAAEM,IAAKL,GAASA,EAAMK,OAItD,OAAOP"}
@@ -1,2 +1,2 @@
1
- var r=function(r){return r.reduce(function(r,t,n){return r+("string"==typeof t?(n>0?".":"")+t:"["+t+"]")},"").toString()};export{r as convertArrayToPathName};
1
+ import{get as r,set as o}from"react-hook-form";var a=function(a,e){var f={};for(var t in a){var n=r(e,t);o(f,t,Object.assign(a[t],{ref:n&&n.ref}))}return f};export{a as toNestError};
2
2
  //# sourceMappingURL=resolvers.module.js.map
@@ -1,2 +1,2 @@
1
- const t=t=>t.reduce((t,$,e)=>`${t}${"string"==typeof $?`${e>0?".":""}${$}`:`[${$}]`}`,"").toString();export{t as convertArrayToPathName};
1
+ import{get as o,set as r}from"react-hook-form";const t=(t,n)=>{const c={};for(const e in t){const s=o(n,e);r(c,e,Object.assign(t[e],{ref:s&&s.ref}))}return c};export{t as toNestError};
2
2
  //# sourceMappingURL=resolvers.modern.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolvers.modern.js","sources":["../src/convertArrayToPathName.ts"],"sourcesContent":["export const convertArrayToPathName = (paths: (string | number)[]): string =>\n paths\n .reduce(\n (previous, path: string | number, index): string =>\n `${previous}${\n typeof path === 'string'\n ? `${index > 0 ? '.' : ''}${path}`\n : `[${path}]`\n }`,\n '',\n )\n .toString();\n"],"names":["convertArrayToPathName","paths","reduce","previous","path","index","toString"],"mappings":"AAAaA,MAAAA,EAA0BC,GACrCA,EACGC,OACC,CAACC,EAAUC,EAAuBC,OAC7BF,IACe,iBAATC,KACAC,EAAQ,EAAI,IAAM,KAAKD,QACtBA,OAEZ,IAEDE"}
1
+ {"version":3,"file":"resolvers.modern.js","sources":["../src/toNestError.ts"],"sourcesContent":["import {\n set,\n get,\n FieldError,\n FieldErrors,\n Field,\n InternalFieldName,\n} from 'react-hook-form';\n\nexport const toNestError = <TFieldValues>(\n errors: Record<string, FieldError>,\n fields: Record<InternalFieldName, Field['_f']>,\n): FieldErrors<TFieldValues> => {\n const fieldErrors: FieldErrors<TFieldValues> = {};\n for (const path in errors) {\n const field = get(fields, path) as Field['_f'] | undefined;\n set(\n fieldErrors,\n path,\n Object.assign(errors[path], { ref: field && field.ref }),\n );\n }\n\n return fieldErrors;\n};\n"],"names":["toNestError","errors","fields","fieldErrors","path","field","get","set","Object","assign","ref"],"mappings":"+CASaA,MAAAA,EAAc,CACzBC,EACAC,KAEA,MAAMC,EAAyC,GAC/C,IAAK,MAAMC,KAAQH,EAAQ,CACzB,MAAMI,EAAQC,EAAIJ,EAAQE,GAC1BG,EACEJ,EACAC,EACAI,OAAOC,OAAOR,EAAOG,GAAO,CAAEM,IAAKL,GAASA,EAAMK,OAItD,OAAOP"}
@@ -1,2 +1,2 @@
1
- var r=function(r){return r.reduce(function(r,t,n){return r+("string"==typeof t?(n>0?".":"")+t:"["+t+"]")},"").toString()};export{r as convertArrayToPathName};
1
+ import{get as r,set as o}from"react-hook-form";var a=function(a,e){var f={};for(var t in a){var n=r(e,t);o(f,t,Object.assign(a[t],{ref:n&&n.ref}))}return f};export{a as toNestError};
2
2
  //# sourceMappingURL=resolvers.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolvers.module.js","sources":["../src/convertArrayToPathName.ts"],"sourcesContent":["export const convertArrayToPathName = (paths: (string | number)[]): string =>\n paths\n .reduce(\n (previous, path: string | number, index): string =>\n `${previous}${\n typeof path === 'string'\n ? `${index > 0 ? '.' : ''}${path}`\n : `[${path}]`\n }`,\n '',\n )\n .toString();\n"],"names":["convertArrayToPathName","paths","reduce","previous","path","index","toString"],"mappings":"AAAaA,IAAAA,EAAyB,SAACC,UACrCA,EACGC,OACC,SAACC,EAAUC,EAAuBC,UAC7BF,GACe,iBAATC,GACAC,EAAQ,EAAI,IAAM,IAAKD,MACtBA,QAEZ,IAEDE"}
1
+ {"version":3,"file":"resolvers.module.js","sources":["../src/toNestError.ts"],"sourcesContent":["import {\n set,\n get,\n FieldError,\n FieldErrors,\n Field,\n InternalFieldName,\n} from 'react-hook-form';\n\nexport const toNestError = <TFieldValues>(\n errors: Record<string, FieldError>,\n fields: Record<InternalFieldName, Field['_f']>,\n): FieldErrors<TFieldValues> => {\n const fieldErrors: FieldErrors<TFieldValues> = {};\n for (const path in errors) {\n const field = get(fields, path) as Field['_f'] | undefined;\n set(\n fieldErrors,\n path,\n Object.assign(errors[path], { ref: field && field.ref }),\n );\n }\n\n return fieldErrors;\n};\n"],"names":["toNestError","errors","fields","fieldErrors","path","field","get","set","Object","assign","ref"],"mappings":"+CASaA,IAAAA,EAAc,SACzBC,EACAC,GAEA,IAAMC,EAAyC,GAC/C,IAAK,IAAMC,KAAQH,EAAQ,CACzB,IAAMI,EAAQC,EAAIJ,EAAQE,GAC1BG,EACEJ,EACAC,EACAI,OAAOC,OAAOR,EAAOG,GAAO,CAAEM,IAAKL,GAASA,EAAMK,OAItD,OAAOP"}
@@ -1,2 +1,2 @@
1
- !function(e,o){"object"==typeof exports&&"undefined"!=typeof module?o(exports):"function"==typeof define&&define.amd?define(["exports"],o):o((e||self).hookformResolvers={})}(this,function(e){e.convertArrayToPathName=function(e){return e.reduce(function(e,o,n){return e+("string"==typeof o?(n>0?".":"")+o:"["+o+"]")},"").toString()}});
1
+ !function(e,o){"object"==typeof exports&&"undefined"!=typeof module?o(exports,require("react-hook-form")):"function"==typeof define&&define.amd?define(["exports","react-hook-form"],o):o((e||self).hookformResolvers={},e.reactHookForm)}(this,function(e,o){e.toNestError=function(e,r){var t={};for(var f in e){var n=o.get(r,f);o.set(t,f,Object.assign(e[f],{ref:n&&n.ref}))}return t}});
2
2
  //# sourceMappingURL=resolvers.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolvers.umd.js","sources":["../src/convertArrayToPathName.ts"],"sourcesContent":["export const convertArrayToPathName = (paths: (string | number)[]): string =>\n paths\n .reduce(\n (previous, path: string | number, index): string =>\n `${previous}${\n typeof path === 'string'\n ? `${index > 0 ? '.' : ''}${path}`\n : `[${path}]`\n }`,\n '',\n )\n .toString();\n"],"names":["paths","reduce","previous","path","index","toString"],"mappings":"oQAAsC,SAACA,UACrCA,EACGC,OACC,SAACC,EAAUC,EAAuBC,UAC7BF,GACe,iBAATC,GACAC,EAAQ,EAAI,IAAM,IAAKD,MACtBA,QAEZ,IAEDE"}
1
+ {"version":3,"file":"resolvers.umd.js","sources":["../src/toNestError.ts"],"sourcesContent":["import {\n set,\n get,\n FieldError,\n FieldErrors,\n Field,\n InternalFieldName,\n} from 'react-hook-form';\n\nexport const toNestError = <TFieldValues>(\n errors: Record<string, FieldError>,\n fields: Record<InternalFieldName, Field['_f']>,\n): FieldErrors<TFieldValues> => {\n const fieldErrors: FieldErrors<TFieldValues> = {};\n for (const path in errors) {\n const field = get(fields, path) as Field['_f'] | undefined;\n set(\n fieldErrors,\n path,\n Object.assign(errors[path], { ref: field && field.ref }),\n );\n }\n\n return fieldErrors;\n};\n"],"names":["errors","fields","fieldErrors","path","field","get","set","Object","assign","ref"],"mappings":"wTAS2B,SACzBA,EACAC,GAEA,IAAMC,EAAyC,GAC/C,IAAK,IAAMC,KAAQH,EAAQ,CACzB,IAAMI,EAAQC,MAAIJ,EAAQE,GAC1BG,MACEJ,EACAC,EACAI,OAAOC,OAAOR,EAAOG,GAAO,CAAEM,IAAKL,GAASA,EAAMK,OAItD,OAAOP"}
@@ -0,0 +1,2 @@
1
+ import { FieldError, FieldErrors, Field, InternalFieldName } from 'react-hook-form';
2
+ export declare const toNestError: <TFieldValues>(errors: Record<string, FieldError>, fields: Record<InternalFieldName, Field['_f']>) => import("react-hook-form").DeepMap<TFieldValues, FieldError>;
package/joi/dist/joi.js CHANGED
@@ -1,2 +1,2 @@
1
- var r=require("react-hook-form"),e=require("@hookform/resolvers");function t(){return(t=Object.assign||function(r){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(r[n]=t[n])}return r}).apply(this,arguments)}exports.joiResolver=function(n,o,a){void 0===o&&(o={abortEarly:!1});var i=(void 0===a?{mode:"async"}:a).mode;return function(a,s,u){var c=u.criteriaMode;try{return Promise.resolve(function(r,e){try{var t=function(){function r(r){return{values:e,errors:{}}}var e,t=function(){if("async"===i)return Promise.resolve(n.validateAsync(a,o)).then(function(r){e=r});var r=n.validate(a,o),t=r.error;if(t)throw t;e=r.value}();return t&&t.then?t.then(r):r()}()}catch(r){return e(r)}return t&&t.then?t.then(void 0,e):t}(0,function(n){return{values:{},errors:r.transformToNestObject((o=n,a="all"===c,Array.isArray(o.details)?o.details.reduce(function(n,o){var i,s,u,c=o.path,v=o.message,f=void 0===v?"":v,l=o.type,h=e.convertArrayToPathName(c);return t({},n,c?n[h]&&a?((i={})[h]=r.appendErrors(h,a,n,l,f),i):((u={})[h]=n[h]||t({message:f,type:l},a?{types:(s={},s[l]=f||!0,s)}:{}),u):{})},{}):[]))};var o,a}))}catch(r){return Promise.reject(r)}}};
1
+ var e=require("react-hook-form"),r=require("@hookform/resolvers");exports.joiResolver=function(t,n,o){return void 0===n&&(n={abortEarly:!1}),void 0===o&&(o={}),function(i,a,s){try{var u=function(){return{values:v.error?{}:v.value,errors:v.error?r.toNestError((t=v.error,n="all"===s.criteriaMode,t.details.length?t.details.reduce(function(r,t){var o=t.path.join(".");return r[o]||(r[o]={message:t.message,type:t.type}),n&&(r[o]=e.appendErrors(o,n,r,t.type,t.message)),r},{}):{}),s.fields):{}};var t,n},c=Object.assign({},n,{context:a}),v={},l=function(){if("sync"===o.mode)v=t.validate(i,c);else{var e=function(e,r){try{var t=e()}catch(e){return r(e)}return t&&t.then?t.then(void 0,r):t}(function(){return Promise.resolve(t.validateAsync(i,c)).then(function(e){v.value=e})},function(e){v.error=e});if(e&&e.then)return e.then(function(){})}}();return Promise.resolve(l&&l.then?l.then(u):u())}catch(e){return Promise.reject(e)}}};
2
2
  //# sourceMappingURL=joi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"joi.js","sources":["../src/joi.ts"],"sourcesContent":["import { appendErrors, transformToNestObject } from 'react-hook-form';\nimport * as Joi from 'joi';\n// @ts-expect-error maybe fixed after the first publish ?\nimport { convertArrayToPathName } from '@hookform/resolvers';\nimport { Resolver } from './types';\n\nconst parseErrorSchema = (\n error: Joi.ValidationError,\n validateAllFieldCriteria: boolean,\n) =>\n Array.isArray(error.details)\n ? error.details.reduce(\n (previous: Record<string, any>, { path, message = '', type }) => {\n const currentPath = convertArrayToPathName(path);\n\n return {\n ...previous,\n ...(path\n ? previous[currentPath] && validateAllFieldCriteria\n ? {\n [currentPath]: appendErrors(\n currentPath,\n validateAllFieldCriteria,\n previous,\n type,\n message,\n ),\n }\n : {\n [currentPath]: previous[currentPath] || {\n message,\n type,\n ...(validateAllFieldCriteria\n ? {\n types: { [type]: message || true },\n }\n : {}),\n },\n }\n : {}),\n };\n },\n {},\n )\n : [];\n\nexport const joiResolver: Resolver = (\n schema,\n schemaOptions = {\n abortEarly: false,\n },\n { mode } = { mode: 'async' },\n) => async (values, _, { criteriaMode }) => {\n try {\n let result;\n if (mode === 'async') {\n result = await schema.validateAsync(values, schemaOptions);\n } else {\n const { value, error } = schema.validate(values, schemaOptions);\n\n if (error) {\n throw error;\n }\n\n result = value;\n }\n\n return {\n values: result,\n errors: {},\n };\n } catch (e) {\n return {\n values: {},\n errors: transformToNestObject(\n parseErrorSchema(e, criteriaMode === 'all'),\n ),\n };\n }\n};\n"],"names":["schema","schemaOptions","abortEarly","mode","values","_","criteriaMode","result","errors","validateAsync","validate","error","value","e","transformToNestObject","validateAllFieldCriteria","Array","isArray","details","reduce","previous","path","message","type","currentPath","convertArrayToPathName","appendErrors","types"],"mappings":"qSA8CqC,SACnCA,EACAC,cAAAA,IAAAA,EAAgB,CACdC,YAAY,QAEZC,cAAS,CAAEA,KAAM,YAAjBA,qBACQC,EAAQC,SAAKC,IAAAA,+FAed,CACLF,OAAQG,EACRC,OAAQ,IAfV,IAAID,kBACS,UAATJ,yBACaH,EAAOS,cAAcL,EAAQH,qBAA5CM,YAEyBP,EAAOU,SAASN,EAAQH,GAAlCU,IAAAA,MAEf,GAAIA,EACF,MAAMA,EAGRJ,IANQK,gHAaHC,GACP,MAAO,CACLT,OAAQ,GACRI,OAAQM,yBAnEZH,EAoEuBE,EAnEvBE,EAmE2C,QAAjBT,EAjE1BU,MAAMC,QAAQN,EAAMO,SAChBP,EAAMO,QAAQC,OACZ,SAACC,eAAiCC,IAAAA,SAAMC,QAAAA,aAAU,KAAIC,IAAAA,KAC9CC,EAAcC,yBAAuBJ,GAE3C,YACKD,EACCC,EACAD,EAASI,IAAgBT,UAEpBS,GAAcE,eACbF,EACAT,EACAK,EACAG,EACAD,cAIDE,GAAcJ,EAASI,OACtBF,QAAAA,EACAC,KAAAA,GACIR,EACA,CACEY,cAAUJ,GAAOD,IAAW,MAE9B,OAGV,KAGR,IAEF,MAtCmB,IACvBX,EACAI,KAsCmC"}
1
+ {"version":3,"file":"joi.js","sources":["../src/joi.ts"],"sourcesContent":["import { appendErrors, FieldError } from 'react-hook-form';\nimport { toNestError } from '@hookform/resolvers';\nimport type { ValidationError } from 'joi';\nimport { Resolver } from './types';\n\nconst parseErrorSchema = (\n error: ValidationError,\n validateAllFieldCriteria: boolean,\n) =>\n error.details.length\n ? error.details.reduce<Record<string, FieldError>>((previous, error) => {\n const _path = error.path.join('.');\n\n if (!previous[_path]) {\n previous[_path] = { message: error.message, type: error.type };\n }\n\n if (validateAllFieldCriteria) {\n previous[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n previous,\n error.type,\n error.message,\n ) as FieldError;\n }\n\n return previous;\n }, {})\n : {};\n\nexport const joiResolver: Resolver = (\n schema,\n schemaOptions = {\n abortEarly: false,\n },\n resolverOptions = {},\n) => async (values, context, options) => {\n const _schemaOptions = Object.assign({}, schemaOptions, {\n context,\n });\n\n let result: Record<string, any> = {};\n if (resolverOptions.mode === 'sync') {\n result = schema.validate(values, _schemaOptions);\n } else {\n try {\n result.value = await schema.validateAsync(values, _schemaOptions);\n } catch (e) {\n result.error = e;\n }\n }\n\n return {\n values: result.error ? {} : result.value,\n errors: result.error\n ? toNestError(\n parseErrorSchema(result.error, options.criteriaMode === 'all'),\n options.fields,\n )\n : {},\n };\n};\n"],"names":["schema","schemaOptions","resolverOptions","abortEarly","values","context","options","result","error","value","errors","toNestError","validateAllFieldCriteria","criteriaMode","details","length","reduce","previous","_path","path","join","message","type","appendErrors","fields","_schemaOptions","Object","assign","mode","validate","validateAsync","e"],"mappings":"sFA+BqC,SACnCA,EACAC,EAGAC,mBAHAD,IAAAA,EAAgB,CACdE,YAAY,aAEdD,IAAAA,EAAkB,aACRE,EAAQC,EAASC,wBAgB3B,MAAO,CACLF,OAAQG,EAAOC,MAAQ,GAAKD,EAAOE,MACnCC,OAAQH,EAAOC,MACXG,eAlDNH,EAmDyBD,EAAOC,MAlDhCI,EAkDgE,QAAzBN,EAAQO,aAhD/CL,EAAMM,QAAQC,OACVP,EAAMM,QAAQE,OAAmC,SAACC,EAAUT,GAC1D,IAAMU,EAAQV,EAAMW,KAAKC,KAAK,KAgB9B,OAdKH,EAASC,KACZD,EAASC,GAAS,CAAEG,QAASb,EAAMa,QAASC,KAAMd,EAAMc,OAGtDV,IACFK,EAASC,GAASK,eAChBL,EACAN,EACAK,EACAT,EAAMc,KACNd,EAAMa,UAIHJ,GACN,IACH,IA6BIX,EAAQkB,QAEV,IAvDiB,IACvBhB,EACAI,GA+BMa,EAAiBC,OAAOC,OAAO,GAAI1B,EAAe,CACtDI,QAAAA,IAGEE,EAA8B,mBACL,SAAzBL,EAAgB0B,KAClBrB,EAASP,EAAO6B,SAASzB,EAAQqB,sIAGVzB,EAAO8B,cAAc1B,EAAQqB,qBAAlDlB,EAAOE,oBACAsB,GACPxB,EAAOC,MAAQuB,iGAlBgB"}
package/joi/dist/joi.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{transformToNestObject as r,appendErrors as e}from"react-hook-form";import{convertArrayToPathName as t}from"@hookform/resolvers";function n(){return(n=Object.assign||function(r){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(r[n]=t[n])}return r}).apply(this,arguments)}var o=function(o,a,i){void 0===a&&(a={abortEarly:!1});var u=(void 0===i?{mode:"async"}:i).mode;return function(i,s,c){var v=c.criteriaMode;try{return Promise.resolve(function(r,e){try{var t=function(){function r(r){return{values:e,errors:{}}}var e,t=function(){if("async"===u)return Promise.resolve(o.validateAsync(i,a)).then(function(r){e=r});var r=o.validate(i,a),t=r.error;if(t)throw t;e=r.value}();return t&&t.then?t.then(r):r()}()}catch(r){return e(r)}return t&&t.then?t.then(void 0,e):t}(0,function(o){return{values:{},errors:r((a=o,i="all"===v,Array.isArray(a.details)?a.details.reduce(function(r,o){var a,u,s,c=o.path,v=o.message,f=void 0===v?"":v,l=o.type,h=t(c);return n({},r,c?r[h]&&i?((a={})[h]=e(h,i,r,l,f),a):((s={})[h]=r[h]||n({message:f,type:l},i?{types:(u={},u[l]=f||!0,u)}:{}),s):{})},{}):[]))};var a,i}))}catch(r){return Promise.reject(r)}}};export{o as joiResolver};
1
+ import{appendErrors as r}from"react-hook-form";import{toNestError as e}from"@hookform/resolvers";var t=function(t,n,o){return void 0===n&&(n={abortEarly:!1}),void 0===o&&(o={}),function(i,a,s){try{var u=function(){return{values:f.error?{}:f.value,errors:f.error?e((t=f.error,n="all"===s.criteriaMode,t.details.length?t.details.reduce(function(e,t){var o=t.path.join(".");return e[o]||(e[o]={message:t.message,type:t.type}),n&&(e[o]=r(o,n,e,t.type,t.message)),e},{}):{}),s.fields):{}};var t,n},c=Object.assign({},n,{context:a}),f={},v=function(){if("sync"===o.mode)f=t.validate(i,c);else{var r=function(r,e){try{var t=r()}catch(r){return e(r)}return t&&t.then?t.then(void 0,e):t}(function(){return Promise.resolve(t.validateAsync(i,c)).then(function(r){f.value=r})},function(r){f.error=r});if(r&&r.then)return r.then(function(){})}}();return Promise.resolve(v&&v.then?v.then(u):u())}catch(r){return Promise.reject(r)}}};export{t as joiResolver};
2
2
  //# sourceMappingURL=joi.module.js.map
@@ -1,2 +1,2 @@
1
- import{transformToNestObject as r,appendErrors as e}from"react-hook-form";import{convertArrayToPathName as t}from"@hookform/resolvers";function a(){return(a=Object.assign||function(r){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var a in t)Object.prototype.hasOwnProperty.call(t,a)&&(r[a]=t[a])}return r}).apply(this,arguments)}const o=(o,s={abortEarly:!1},{mode:n}={mode:"async"})=>async(c,i,{criteriaMode:l})=>{try{let r;if("async"===n)r=await o.validateAsync(c,s);else{const{value:e,error:t}=o.validate(c,s);if(t)throw t;r=e}return{values:r,errors:{}}}catch(o){return{values:{},errors:r((y=o,p="all"===l,Array.isArray(y.details)?y.details.reduce((r,{path:o,message:s="",type:n})=>{const c=t(o);return a({},r,o?r[c]&&p?{[c]:e(c,p,r,n,s)}:{[c]:r[c]||a({message:s,type:n},p?{types:{[n]:s||!0}}:{})}:{})},{}):[]))}}var y,p};export{o as joiResolver};
1
+ import{appendErrors as e}from"react-hook-form";import{toNestError as r}from"@hookform/resolvers";const t=(t,o={abortEarly:!1},a={})=>async(s,l,c)=>{const i=Object.assign({},o,{context:l});let n={};if("sync"===a.mode)n=t.validate(s,i);else try{n.value=await t.validateAsync(s,i)}catch(e){n.error=e}return{values:n.error?{}:n.value,errors:n.error?r((m=n.error,d="all"===c.criteriaMode,m.details.length?m.details.reduce((r,t)=>{const o=t.path.join(".");return r[o]||(r[o]={message:t.message,type:t.type}),d&&(r[o]=e(o,d,r,t.type,t.message)),r},{}):{}),c.fields):{}};var m,d};export{t as joiResolver};
2
2
  //# sourceMappingURL=joi.modern.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"joi.modern.js","sources":["../src/joi.ts"],"sourcesContent":["import { appendErrors, transformToNestObject } from 'react-hook-form';\nimport * as Joi from 'joi';\n// @ts-expect-error maybe fixed after the first publish ?\nimport { convertArrayToPathName } from '@hookform/resolvers';\nimport { Resolver } from './types';\n\nconst parseErrorSchema = (\n error: Joi.ValidationError,\n validateAllFieldCriteria: boolean,\n) =>\n Array.isArray(error.details)\n ? error.details.reduce(\n (previous: Record<string, any>, { path, message = '', type }) => {\n const currentPath = convertArrayToPathName(path);\n\n return {\n ...previous,\n ...(path\n ? previous[currentPath] && validateAllFieldCriteria\n ? {\n [currentPath]: appendErrors(\n currentPath,\n validateAllFieldCriteria,\n previous,\n type,\n message,\n ),\n }\n : {\n [currentPath]: previous[currentPath] || {\n message,\n type,\n ...(validateAllFieldCriteria\n ? {\n types: { [type]: message || true },\n }\n : {}),\n },\n }\n : {}),\n };\n },\n {},\n )\n : [];\n\nexport const joiResolver: Resolver = (\n schema,\n schemaOptions = {\n abortEarly: false,\n },\n { mode } = { mode: 'async' },\n) => async (values, _, { criteriaMode }) => {\n try {\n let result;\n if (mode === 'async') {\n result = await schema.validateAsync(values, schemaOptions);\n } else {\n const { value, error } = schema.validate(values, schemaOptions);\n\n if (error) {\n throw error;\n }\n\n result = value;\n }\n\n return {\n values: result,\n errors: {},\n };\n } catch (e) {\n return {\n values: {},\n errors: transformToNestObject(\n parseErrorSchema(e, criteriaMode === 'all'),\n ),\n };\n }\n};\n"],"names":["joiResolver","schema","schemaOptions","abortEarly","mode","async","values","_","criteriaMode","result","validateAsync","value","error","validate","errors","e","transformToNestObject","validateAllFieldCriteria","Array","isArray","details","reduce","previous","path","message","type","currentPath","convertArrayToPathName","[object Object]","appendErrors","types"],"mappings":"sVAMA,MAwCaA,EAAwB,CACnCC,EACAC,EAAgB,CACdC,YAAY,IAEZC,KAAAA,GAAS,CAAEA,KAAM,WAChBC,MAAOC,EAAQC,GAAKC,aAAAA,MACvB,IACE,IAAIC,EACJ,GAAa,UAATL,EACFK,QAAeR,EAAOS,cAAcJ,EAAQJ,OACvC,CACL,MAAMS,MAAEA,EAAFC,MAASA,GAAUX,EAAOY,SAASP,EAAQJ,GAEjD,GAAIU,EACF,MAAMA,EAGRH,EAASE,EAGX,MAAO,CACLL,OAAQG,EACRK,OAAQ,IAEV,MAAOC,GACP,MAAO,CACLT,OAAQ,GACRQ,OAAQE,GAnEZJ,EAoEuBG,EAnEvBE,EAmE2C,QAAjBT,EAjE1BU,MAAMC,QAAQP,EAAMQ,SAChBR,EAAMQ,QAAQC,OACZ,CAACC,GAAiCC,KAAAA,EAAMC,QAAAA,EAAU,GAAIC,KAAAA,MACpD,MAAMC,EAAcC,EAAuBJ,GAE3C,YACKD,EACCC,EACAD,EAASI,IAAgBT,EACvB,CACEW,CAACF,GAAcG,EACbH,EACAT,EACAK,EACAG,EACAD,IAGJ,CACEI,CAACF,GAAcJ,EAASI,OACtBF,QAAAA,EACAC,KAAAA,GACIR,EACA,CACEa,MAAO,CAAEF,CAACH,GAAOD,IAAW,IAE9B,KAGV,KAGR,IAEF,MAtCmB,IACvBZ,EACAK"}
1
+ {"version":3,"file":"joi.modern.js","sources":["../src/joi.ts"],"sourcesContent":["import { appendErrors, FieldError } from 'react-hook-form';\nimport { toNestError } from '@hookform/resolvers';\nimport type { ValidationError } from 'joi';\nimport { Resolver } from './types';\n\nconst parseErrorSchema = (\n error: ValidationError,\n validateAllFieldCriteria: boolean,\n) =>\n error.details.length\n ? error.details.reduce<Record<string, FieldError>>((previous, error) => {\n const _path = error.path.join('.');\n\n if (!previous[_path]) {\n previous[_path] = { message: error.message, type: error.type };\n }\n\n if (validateAllFieldCriteria) {\n previous[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n previous,\n error.type,\n error.message,\n ) as FieldError;\n }\n\n return previous;\n }, {})\n : {};\n\nexport const joiResolver: Resolver = (\n schema,\n schemaOptions = {\n abortEarly: false,\n },\n resolverOptions = {},\n) => async (values, context, options) => {\n const _schemaOptions = Object.assign({}, schemaOptions, {\n context,\n });\n\n let result: Record<string, any> = {};\n if (resolverOptions.mode === 'sync') {\n result = schema.validate(values, _schemaOptions);\n } else {\n try {\n result.value = await schema.validateAsync(values, _schemaOptions);\n } catch (e) {\n result.error = e;\n }\n }\n\n return {\n values: result.error ? {} : result.value,\n errors: result.error\n ? toNestError(\n parseErrorSchema(result.error, options.criteriaMode === 'all'),\n options.fields,\n )\n : {},\n };\n};\n"],"names":["joiResolver","schema","schemaOptions","abortEarly","resolverOptions","async","values","context","options","_schemaOptions","Object","assign","result","mode","validate","value","validateAsync","e","error","errors","toNestError","validateAllFieldCriteria","criteriaMode","details","length","reduce","previous","_path","path","join","message","type","appendErrors","fields"],"mappings":"iGAKA,MA0BaA,EAAwB,CACnCC,EACAC,EAAgB,CACdC,YAAY,GAEdC,EAAkB,KACfC,MAAOC,EAAQC,EAASC,KAC3B,MAAMC,EAAiBC,OAAOC,OAAO,GAAIT,EAAe,CACtDK,QAAAA,IAGF,IAAIK,EAA8B,GAClC,GAA6B,SAAzBR,EAAgBS,KAClBD,EAASX,EAAOa,SAASR,EAAQG,QAEjC,IACEG,EAAOG,YAAcd,EAAOe,cAAcV,EAAQG,GAClD,MAAOQ,GACPL,EAAOM,MAAQD,EAInB,MAAO,CACLX,OAAQM,EAAOM,MAAQ,GAAKN,EAAOG,MACnCI,OAAQP,EAAOM,MACXE,GAlDNF,EAmDyBN,EAAOM,MAlDhCG,EAkDgE,QAAzBb,EAAQc,aAhD/CJ,EAAMK,QAAQC,OACVN,EAAMK,QAAQE,OAAmC,CAACC,EAAUR,KAC1D,MAAMS,EAAQT,EAAMU,KAAKC,KAAK,KAgB9B,OAdKH,EAASC,KACZD,EAASC,GAAS,CAAEG,QAASZ,EAAMY,QAASC,KAAMb,EAAMa,OAGtDV,IACFK,EAASC,GAASK,EAChBL,EACAN,EACAK,EACAR,EAAMa,KACNb,EAAMY,UAIHJ,GACN,IACH,IA6BIlB,EAAQyB,QAEV,IAvDiB,IACvBf,EACAG"}
@@ -1,2 +1,2 @@
1
- import{transformToNestObject as r,appendErrors as e}from"react-hook-form";import{convertArrayToPathName as t}from"@hookform/resolvers";function n(){return(n=Object.assign||function(r){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(r[n]=t[n])}return r}).apply(this,arguments)}var o=function(o,a,i){void 0===a&&(a={abortEarly:!1});var u=(void 0===i?{mode:"async"}:i).mode;return function(i,s,c){var v=c.criteriaMode;try{return Promise.resolve(function(r,e){try{var t=function(){function r(r){return{values:e,errors:{}}}var e,t=function(){if("async"===u)return Promise.resolve(o.validateAsync(i,a)).then(function(r){e=r});var r=o.validate(i,a),t=r.error;if(t)throw t;e=r.value}();return t&&t.then?t.then(r):r()}()}catch(r){return e(r)}return t&&t.then?t.then(void 0,e):t}(0,function(o){return{values:{},errors:r((a=o,i="all"===v,Array.isArray(a.details)?a.details.reduce(function(r,o){var a,u,s,c=o.path,v=o.message,f=void 0===v?"":v,l=o.type,h=t(c);return n({},r,c?r[h]&&i?((a={})[h]=e(h,i,r,l,f),a):((s={})[h]=r[h]||n({message:f,type:l},i?{types:(u={},u[l]=f||!0,u)}:{}),s):{})},{}):[]))};var a,i}))}catch(r){return Promise.reject(r)}}};export{o as joiResolver};
1
+ import{appendErrors as r}from"react-hook-form";import{toNestError as e}from"@hookform/resolvers";var t=function(t,n,o){return void 0===n&&(n={abortEarly:!1}),void 0===o&&(o={}),function(i,a,s){try{var u=function(){return{values:f.error?{}:f.value,errors:f.error?e((t=f.error,n="all"===s.criteriaMode,t.details.length?t.details.reduce(function(e,t){var o=t.path.join(".");return e[o]||(e[o]={message:t.message,type:t.type}),n&&(e[o]=r(o,n,e,t.type,t.message)),e},{}):{}),s.fields):{}};var t,n},c=Object.assign({},n,{context:a}),f={},v=function(){if("sync"===o.mode)f=t.validate(i,c);else{var r=function(r,e){try{var t=r()}catch(r){return e(r)}return t&&t.then?t.then(void 0,e):t}(function(){return Promise.resolve(t.validateAsync(i,c)).then(function(r){f.value=r})},function(r){f.error=r});if(r&&r.then)return r.then(function(){})}}();return Promise.resolve(v&&v.then?v.then(u):u())}catch(r){return Promise.reject(r)}}};export{t as joiResolver};
2
2
  //# sourceMappingURL=joi.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"joi.module.js","sources":["../src/joi.ts"],"sourcesContent":["import { appendErrors, transformToNestObject } from 'react-hook-form';\nimport * as Joi from 'joi';\n// @ts-expect-error maybe fixed after the first publish ?\nimport { convertArrayToPathName } from '@hookform/resolvers';\nimport { Resolver } from './types';\n\nconst parseErrorSchema = (\n error: Joi.ValidationError,\n validateAllFieldCriteria: boolean,\n) =>\n Array.isArray(error.details)\n ? error.details.reduce(\n (previous: Record<string, any>, { path, message = '', type }) => {\n const currentPath = convertArrayToPathName(path);\n\n return {\n ...previous,\n ...(path\n ? previous[currentPath] && validateAllFieldCriteria\n ? {\n [currentPath]: appendErrors(\n currentPath,\n validateAllFieldCriteria,\n previous,\n type,\n message,\n ),\n }\n : {\n [currentPath]: previous[currentPath] || {\n message,\n type,\n ...(validateAllFieldCriteria\n ? {\n types: { [type]: message || true },\n }\n : {}),\n },\n }\n : {}),\n };\n },\n {},\n )\n : [];\n\nexport const joiResolver: Resolver = (\n schema,\n schemaOptions = {\n abortEarly: false,\n },\n { mode } = { mode: 'async' },\n) => async (values, _, { criteriaMode }) => {\n try {\n let result;\n if (mode === 'async') {\n result = await schema.validateAsync(values, schemaOptions);\n } else {\n const { value, error } = schema.validate(values, schemaOptions);\n\n if (error) {\n throw error;\n }\n\n result = value;\n }\n\n return {\n values: result,\n errors: {},\n };\n } catch (e) {\n return {\n values: {},\n errors: transformToNestObject(\n parseErrorSchema(e, criteriaMode === 'all'),\n ),\n };\n }\n};\n"],"names":["joiResolver","schema","schemaOptions","abortEarly","mode","values","_","criteriaMode","result","errors","validateAsync","validate","error","value","e","transformToNestObject","validateAllFieldCriteria","Array","isArray","details","reduce","previous","path","message","type","currentPath","convertArrayToPathName","appendErrors","types"],"mappings":"sVAMA,IAwCaA,EAAwB,SACnCC,EACAC,cAAAA,IAAAA,EAAgB,CACdC,YAAY,QAEZC,cAAS,CAAEA,KAAM,YAAjBA,qBACQC,EAAQC,SAAKC,IAAAA,+FAed,CACLF,OAAQG,EACRC,OAAQ,IAfV,IAAID,kBACS,UAATJ,yBACaH,EAAOS,cAAcL,EAAQH,qBAA5CM,YAEyBP,EAAOU,SAASN,EAAQH,GAAlCU,IAAAA,MAEf,GAAIA,EACF,MAAMA,EAGRJ,IANQK,gHAaHC,GACP,MAAO,CACLT,OAAQ,GACRI,OAAQM,GAnEZH,EAoEuBE,EAnEvBE,EAmE2C,QAAjBT,EAjE1BU,MAAMC,QAAQN,EAAMO,SAChBP,EAAMO,QAAQC,OACZ,SAACC,eAAiCC,IAAAA,SAAMC,QAAAA,aAAU,KAAIC,IAAAA,KAC9CC,EAAcC,EAAuBJ,GAE3C,YACKD,EACCC,EACAD,EAASI,IAAgBT,UAEpBS,GAAcE,EACbF,EACAT,EACAK,EACAG,EACAD,cAIDE,GAAcJ,EAASI,OACtBF,QAAAA,EACAC,KAAAA,GACIR,EACA,CACEY,cAAUJ,GAAOD,IAAW,MAE9B,OAGV,KAGR,IAEF,MAtCmB,IACvBX,EACAI,KAsCmC"}
1
+ {"version":3,"file":"joi.module.js","sources":["../src/joi.ts"],"sourcesContent":["import { appendErrors, FieldError } from 'react-hook-form';\nimport { toNestError } from '@hookform/resolvers';\nimport type { ValidationError } from 'joi';\nimport { Resolver } from './types';\n\nconst parseErrorSchema = (\n error: ValidationError,\n validateAllFieldCriteria: boolean,\n) =>\n error.details.length\n ? error.details.reduce<Record<string, FieldError>>((previous, error) => {\n const _path = error.path.join('.');\n\n if (!previous[_path]) {\n previous[_path] = { message: error.message, type: error.type };\n }\n\n if (validateAllFieldCriteria) {\n previous[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n previous,\n error.type,\n error.message,\n ) as FieldError;\n }\n\n return previous;\n }, {})\n : {};\n\nexport const joiResolver: Resolver = (\n schema,\n schemaOptions = {\n abortEarly: false,\n },\n resolverOptions = {},\n) => async (values, context, options) => {\n const _schemaOptions = Object.assign({}, schemaOptions, {\n context,\n });\n\n let result: Record<string, any> = {};\n if (resolverOptions.mode === 'sync') {\n result = schema.validate(values, _schemaOptions);\n } else {\n try {\n result.value = await schema.validateAsync(values, _schemaOptions);\n } catch (e) {\n result.error = e;\n }\n }\n\n return {\n values: result.error ? {} : result.value,\n errors: result.error\n ? toNestError(\n parseErrorSchema(result.error, options.criteriaMode === 'all'),\n options.fields,\n )\n : {},\n };\n};\n"],"names":["joiResolver","schema","schemaOptions","resolverOptions","abortEarly","values","context","options","result","error","value","errors","toNestError","validateAllFieldCriteria","criteriaMode","details","length","reduce","previous","_path","path","join","message","type","appendErrors","fields","_schemaOptions","Object","assign","mode","validate","validateAsync","e"],"mappings":"iGAKA,IA0BaA,EAAwB,SACnCC,EACAC,EAGAC,mBAHAD,IAAAA,EAAgB,CACdE,YAAY,aAEdD,IAAAA,EAAkB,aACRE,EAAQC,EAASC,wBAgB3B,MAAO,CACLF,OAAQG,EAAOC,MAAQ,GAAKD,EAAOE,MACnCC,OAAQH,EAAOC,MACXG,GAlDNH,EAmDyBD,EAAOC,MAlDhCI,EAkDgE,QAAzBN,EAAQO,aAhD/CL,EAAMM,QAAQC,OACVP,EAAMM,QAAQE,OAAmC,SAACC,EAAUT,GAC1D,IAAMU,EAAQV,EAAMW,KAAKC,KAAK,KAgB9B,OAdKH,EAASC,KACZD,EAASC,GAAS,CAAEG,QAASb,EAAMa,QAASC,KAAMd,EAAMc,OAGtDV,IACFK,EAASC,GAASK,EAChBL,EACAN,EACAK,EACAT,EAAMc,KACNd,EAAMa,UAIHJ,GACN,IACH,IA6BIX,EAAQkB,QAEV,IAvDiB,IACvBhB,EACAI,GA+BMa,EAAiBC,OAAOC,OAAO,GAAI1B,EAAe,CACtDI,QAAAA,IAGEE,EAA8B,mBACL,SAAzBL,EAAgB0B,KAClBrB,EAASP,EAAO6B,SAASzB,EAAQqB,sIAGVzB,EAAO8B,cAAc1B,EAAQqB,qBAAlDlB,EAAOE,oBACAsB,GACPxB,EAAOC,MAAQuB,iGAlBgB"}
@@ -1,2 +1,2 @@
1
- !function(r,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("react-hook-form"),require("@hookform/resolvers")):"function"==typeof define&&define.amd?define(["exports","react-hook-form","@hookform/resolvers"],e):e((r||self).hookformResolversJoi={},r.reactHookForm,r.hookformResolvers)}(this,function(r,e,o){function t(){return(t=Object.assign||function(r){for(var e=1;e<arguments.length;e++){var o=arguments[e];for(var t in o)Object.prototype.hasOwnProperty.call(o,t)&&(r[t]=o[t])}return r}).apply(this,arguments)}r.joiResolver=function(r,n,a){void 0===n&&(n={abortEarly:!1});var i=(void 0===a?{mode:"async"}:a).mode;return function(a,s,f){var u=f.criteriaMode;try{return Promise.resolve(function(e,o){try{var t=function(){function e(r){return{values:o,errors:{}}}var o,t=function(){if("async"===i)return Promise.resolve(r.validateAsync(a,n)).then(function(r){o=r});var e=r.validate(a,n),t=e.error;if(t)throw t;o=e.value}();return t&&t.then?t.then(e):e()}()}catch(r){return o(r)}return t&&t.then?t.then(void 0,o):t}(0,function(r){return{values:{},errors:e.transformToNestObject((n=r,a="all"===u,Array.isArray(n.details)?n.details.reduce(function(r,n){var i,s,f,u=n.path,c=n.message,l=void 0===c?"":c,v=n.type,d=o.convertArrayToPathName(u);return t({},r,u?r[d]&&a?((i={})[d]=e.appendErrors(d,a,r,v,l),i):((f={})[d]=r[d]||t({message:l,type:v},a?{types:(s={},s[v]=l||!0,s)}:{}),f):{})},{}):[]))};var n,a}))}catch(r){return Promise.reject(r)}}}});
1
+ !function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("react-hook-form"),require("@hookform/resolvers")):"function"==typeof define&&define.amd?define(["exports","react-hook-form","@hookform/resolvers"],r):r((e||self).hookformResolversJoi={},e.reactHookForm,e.hookformResolvers)}(this,function(e,r,o){e.joiResolver=function(e,t,n){return void 0===t&&(t={abortEarly:!1}),void 0===n&&(n={}),function(i,s,a){try{var f=function(){return{values:c.error?{}:c.value,errors:c.error?o.toNestError((e=c.error,t="all"===a.criteriaMode,e.details.length?e.details.reduce(function(e,o){var n=o.path.join(".");return e[n]||(e[n]={message:o.message,type:o.type}),t&&(e[n]=r.appendErrors(n,t,e,o.type,o.message)),e},{}):{}),a.fields):{}};var e,t},u=Object.assign({},t,{context:s}),c={},l=function(){if("sync"===n.mode)c=e.validate(i,u);else{var r=function(e,r){try{var o=e()}catch(e){return r(e)}return o&&o.then?o.then(void 0,r):o}(function(){return Promise.resolve(e.validateAsync(i,u)).then(function(e){c.value=e})},function(e){c.error=e});if(r&&r.then)return r.then(function(){})}}();return Promise.resolve(l&&l.then?l.then(f):f())}catch(e){return Promise.reject(e)}}}});
2
2
  //# sourceMappingURL=joi.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"joi.umd.js","sources":["../src/joi.ts"],"sourcesContent":["import { appendErrors, transformToNestObject } from 'react-hook-form';\nimport * as Joi from 'joi';\n// @ts-expect-error maybe fixed after the first publish ?\nimport { convertArrayToPathName } from '@hookform/resolvers';\nimport { Resolver } from './types';\n\nconst parseErrorSchema = (\n error: Joi.ValidationError,\n validateAllFieldCriteria: boolean,\n) =>\n Array.isArray(error.details)\n ? error.details.reduce(\n (previous: Record<string, any>, { path, message = '', type }) => {\n const currentPath = convertArrayToPathName(path);\n\n return {\n ...previous,\n ...(path\n ? previous[currentPath] && validateAllFieldCriteria\n ? {\n [currentPath]: appendErrors(\n currentPath,\n validateAllFieldCriteria,\n previous,\n type,\n message,\n ),\n }\n : {\n [currentPath]: previous[currentPath] || {\n message,\n type,\n ...(validateAllFieldCriteria\n ? {\n types: { [type]: message || true },\n }\n : {}),\n },\n }\n : {}),\n };\n },\n {},\n )\n : [];\n\nexport const joiResolver: Resolver = (\n schema,\n schemaOptions = {\n abortEarly: false,\n },\n { mode } = { mode: 'async' },\n) => async (values, _, { criteriaMode }) => {\n try {\n let result;\n if (mode === 'async') {\n result = await schema.validateAsync(values, schemaOptions);\n } else {\n const { value, error } = schema.validate(values, schemaOptions);\n\n if (error) {\n throw error;\n }\n\n result = value;\n }\n\n return {\n values: result,\n errors: {},\n };\n } catch (e) {\n return {\n values: {},\n errors: transformToNestObject(\n parseErrorSchema(e, criteriaMode === 'all'),\n ),\n };\n }\n};\n"],"names":["schema","schemaOptions","abortEarly","mode","values","_","criteriaMode","result","errors","validateAsync","validate","error","value","e","transformToNestObject","validateAllFieldCriteria","Array","isArray","details","reduce","previous","path","message","type","currentPath","convertArrayToPathName","appendErrors","types"],"mappings":"qlBA8CqC,SACnCA,EACAC,cAAAA,IAAAA,EAAgB,CACdC,YAAY,QAEZC,cAAS,CAAEA,KAAM,YAAjBA,qBACQC,EAAQC,SAAKC,IAAAA,+FAed,CACLF,OAAQG,EACRC,OAAQ,IAfV,IAAID,kBACS,UAATJ,yBACaH,EAAOS,cAAcL,EAAQH,qBAA5CM,YAEyBP,EAAOU,SAASN,EAAQH,GAAlCU,IAAAA,MAEf,GAAIA,EACF,MAAMA,EAGRJ,IANQK,gHAaHC,GACP,MAAO,CACLT,OAAQ,GACRI,OAAQM,yBAnEZH,EAoEuBE,EAnEvBE,EAmE2C,QAAjBT,EAjE1BU,MAAMC,QAAQN,EAAMO,SAChBP,EAAMO,QAAQC,OACZ,SAACC,eAAiCC,IAAAA,SAAMC,QAAAA,aAAU,KAAIC,IAAAA,KAC9CC,EAAcC,yBAAuBJ,GAE3C,YACKD,EACCC,EACAD,EAASI,IAAgBT,UAEpBS,GAAcE,eACbF,EACAT,EACAK,EACAG,EACAD,cAIDE,GAAcJ,EAASI,OACtBF,QAAAA,EACAC,KAAAA,GACIR,EACA,CACEY,cAAUJ,GAAOD,IAAW,MAE9B,OAGV,KAGR,IAEF,MAtCmB,IACvBX,EACAI,KAsCmC"}
1
+ {"version":3,"file":"joi.umd.js","sources":["../src/joi.ts"],"sourcesContent":["import { appendErrors, FieldError } from 'react-hook-form';\nimport { toNestError } from '@hookform/resolvers';\nimport type { ValidationError } from 'joi';\nimport { Resolver } from './types';\n\nconst parseErrorSchema = (\n error: ValidationError,\n validateAllFieldCriteria: boolean,\n) =>\n error.details.length\n ? error.details.reduce<Record<string, FieldError>>((previous, error) => {\n const _path = error.path.join('.');\n\n if (!previous[_path]) {\n previous[_path] = { message: error.message, type: error.type };\n }\n\n if (validateAllFieldCriteria) {\n previous[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n previous,\n error.type,\n error.message,\n ) as FieldError;\n }\n\n return previous;\n }, {})\n : {};\n\nexport const joiResolver: Resolver = (\n schema,\n schemaOptions = {\n abortEarly: false,\n },\n resolverOptions = {},\n) => async (values, context, options) => {\n const _schemaOptions = Object.assign({}, schemaOptions, {\n context,\n });\n\n let result: Record<string, any> = {};\n if (resolverOptions.mode === 'sync') {\n result = schema.validate(values, _schemaOptions);\n } else {\n try {\n result.value = await schema.validateAsync(values, _schemaOptions);\n } catch (e) {\n result.error = e;\n }\n }\n\n return {\n values: result.error ? {} : result.value,\n errors: result.error\n ? toNestError(\n parseErrorSchema(result.error, options.criteriaMode === 'all'),\n options.fields,\n )\n : {},\n };\n};\n"],"names":["schema","schemaOptions","resolverOptions","abortEarly","values","context","options","result","error","value","errors","toNestError","validateAllFieldCriteria","criteriaMode","details","length","reduce","previous","_path","path","join","message","type","appendErrors","fields","_schemaOptions","Object","assign","mode","validate","validateAsync","e"],"mappings":"sYA+BqC,SACnCA,EACAC,EAGAC,mBAHAD,IAAAA,EAAgB,CACdE,YAAY,aAEdD,IAAAA,EAAkB,aACRE,EAAQC,EAASC,wBAgB3B,MAAO,CACLF,OAAQG,EAAOC,MAAQ,GAAKD,EAAOE,MACnCC,OAAQH,EAAOC,MACXG,eAlDNH,EAmDyBD,EAAOC,MAlDhCI,EAkDgE,QAAzBN,EAAQO,aAhD/CL,EAAMM,QAAQC,OACVP,EAAMM,QAAQE,OAAmC,SAACC,EAAUT,GAC1D,IAAMU,EAAQV,EAAMW,KAAKC,KAAK,KAgB9B,OAdKH,EAASC,KACZD,EAASC,GAAS,CAAEG,QAASb,EAAMa,QAASC,KAAMd,EAAMc,OAGtDV,IACFK,EAASC,GAASK,eAChBL,EACAN,EACAK,EACAT,EAAMc,KACNd,EAAMa,UAIHJ,GACN,IACH,IA6BIX,EAAQkB,QAEV,IAvDiB,IACvBhB,EACAI,GA+BMa,EAAiBC,OAAOC,OAAO,GAAI1B,EAAe,CACtDI,QAAAA,IAGEE,EAA8B,mBACL,SAAzBL,EAAgB0B,KAClBrB,EAASP,EAAO6B,SAASzB,EAAQqB,sIAGVzB,EAAO8B,cAAc1B,EAAQqB,qBAAlDlB,EAAOE,oBACAsB,GACPxB,EAAOC,MAAQuB,iGAlBgB"}
@@ -1,5 +1,5 @@
1
1
  import { FieldValues, ResolverOptions, ResolverResult, UnpackNestedValue } from 'react-hook-form';
2
2
  import type { AsyncValidationOptions, Schema } from 'joi';
3
3
  export declare type Resolver = <T extends Schema>(schema: T, schemaOptions?: AsyncValidationOptions, factoryOptions?: {
4
- mode: 'async' | 'sync';
4
+ mode?: 'async' | 'sync';
5
5
  }) => <TFieldValues extends FieldValues, TContext>(values: UnpackNestedValue<TFieldValues>, context: TContext | undefined, options: ResolverOptions<TFieldValues>) => Promise<ResolverResult<TFieldValues>>;
@@ -0,0 +1,76 @@
1
+ import * as Joi from 'joi';
2
+
3
+ import { Field, InternalFieldName } from 'react-hook-form';
4
+
5
+ export const schema = Joi.object({
6
+ username: Joi.string().alphanum().min(3).max(30).required(),
7
+ password: Joi.string().pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')).required(),
8
+ repeatPassword: Joi.ref('password'),
9
+ accessToken: [Joi.string(), Joi.number()],
10
+ birthYear: Joi.number().integer().min(1900).max(2013),
11
+ email: Joi.string().email({
12
+ minDomainSegments: 2,
13
+ tlds: { allow: ['com', 'net'] },
14
+ }),
15
+ tags: Joi.array().items(Joi.string()).required(),
16
+ enabled: Joi.boolean().required(),
17
+ like: Joi.array()
18
+ .items(
19
+ Joi.object({ id: Joi.number(), name: Joi.string().length(4).regex(/a/) }),
20
+ )
21
+ .optional(),
22
+ });
23
+
24
+ interface Data {
25
+ username: string;
26
+ password: string;
27
+ repeatPassword: string;
28
+ accessToken?: number | string;
29
+ birthYear?: number;
30
+ email?: string;
31
+ tags: string[];
32
+ enabled: boolean;
33
+ like: { id: number; name: string }[];
34
+ }
35
+
36
+ export const validData: Data = {
37
+ username: 'Doe',
38
+ password: 'Password123',
39
+ repeatPassword: 'Password123',
40
+ birthYear: 2000,
41
+ email: 'john@doe.com',
42
+ tags: ['tag1', 'tag2'],
43
+ enabled: true,
44
+ like: [
45
+ {
46
+ id: 1,
47
+ name: 'name',
48
+ },
49
+ ],
50
+ };
51
+
52
+ export const invalidData = {
53
+ password: '___',
54
+ email: '',
55
+ birthYear: 'birthYear',
56
+ like: [{ id: 'z', name: 'r' }],
57
+ };
58
+
59
+ export const fields: Record<InternalFieldName, Field['_f']> = {
60
+ username: {
61
+ ref: { name: 'username' },
62
+ name: 'username',
63
+ },
64
+ password: {
65
+ ref: { name: 'password' },
66
+ name: 'password',
67
+ },
68
+ email: {
69
+ ref: { name: 'email' },
70
+ name: 'email',
71
+ },
72
+ birthday: {
73
+ ref: { name: 'birthday' },
74
+ name: 'birthday',
75
+ },
76
+ };