@hookform/resolvers 5.9.1 → 6.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.
- package/README.md +5 -5
- package/ajv/dist/ajv.js +1 -1
- package/ajv/dist/ajv.js.map +1 -1
- package/ajv/dist/ajv.mjs +1 -1
- package/ajv/dist/ajv.modern.mjs +1 -1
- package/ajv/dist/ajv.modern.mjs.map +1 -1
- package/ajv/dist/ajv.module.js +1 -1
- package/ajv/dist/ajv.module.js.map +1 -1
- package/ajv/dist/ajv.umd.js +1 -1
- package/ajv/dist/ajv.umd.js.map +1 -1
- package/ajv/src/__tests__/ajv.ts +58 -0
- package/ajv/src/ajv.ts +7 -2
- package/effect-ts/dist/effect-ts.d.ts +3 -3
- package/effect-ts/dist/effect-ts.js +1 -1
- package/effect-ts/dist/effect-ts.js.map +1 -1
- package/effect-ts/dist/effect-ts.mjs +1 -1
- package/effect-ts/dist/effect-ts.modern.mjs +1 -1
- package/effect-ts/dist/effect-ts.modern.mjs.map +1 -1
- package/effect-ts/dist/effect-ts.module.js +1 -1
- package/effect-ts/dist/effect-ts.module.js.map +1 -1
- package/effect-ts/dist/effect-ts.umd.js +1 -1
- package/effect-ts/dist/effect-ts.umd.js.map +1 -1
- package/effect-ts/package.json +1 -1
- package/effect-ts/src/__tests__/Form-native-validation.tsx +4 -4
- package/effect-ts/src/__tests__/Form.tsx +4 -4
- package/effect-ts/src/__tests__/__fixtures__/data.ts +24 -24
- package/effect-ts/src/__tests__/__snapshots__/effect-ts.ts.snap +10 -11
- package/effect-ts/src/__tests__/effect-ts.ts +196 -15
- package/effect-ts/src/__tests__/special-path-names.ts +1 -1
- package/effect-ts/src/effect-ts.ts +82 -60
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -782,7 +782,7 @@ const App = () => {
|
|
|
782
782
|
|
|
783
783
|
### [effect-ts](https://github.com/Effect-TS/effect)
|
|
784
784
|
|
|
785
|
-
A powerful TypeScript framework that provides a fully-fledged functional effect system with a rich standard library.
|
|
785
|
+
A powerful TypeScript framework that provides a fully-fledged functional effect system with a rich standard library. Requires `effect` v4 (use `@hookform/resolvers` v5 for `effect` v3).
|
|
786
786
|
|
|
787
787
|
[](https://bundlephobia.com/result?p=effect)
|
|
788
788
|
|
|
@@ -793,11 +793,11 @@ import { effectTsResolver } from '@hookform/resolvers/effect-ts';
|
|
|
793
793
|
import { Schema } from 'effect';
|
|
794
794
|
|
|
795
795
|
const schema = Schema.Struct({
|
|
796
|
-
username: Schema.String.
|
|
797
|
-
Schema.
|
|
796
|
+
username: Schema.String.check(
|
|
797
|
+
Schema.isNonEmpty({ message: 'username required' }),
|
|
798
798
|
),
|
|
799
|
-
password: Schema.String.
|
|
800
|
-
Schema.
|
|
799
|
+
password: Schema.String.check(
|
|
800
|
+
Schema.isNonEmpty({ message: 'password required' }),
|
|
801
801
|
),
|
|
802
802
|
});
|
|
803
803
|
|
package/ajv/dist/ajv.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=require("@hookform/resolvers"),r=require("ajv"),a=require("ajv-errors"),s=require("ajv-formats"),
|
|
1
|
+
var e=require("@hookform/resolvers"),r=require("ajv"),a=require("ajv-errors"),s=require("ajv-formats"),o=require("react-hook-form");function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=/*#__PURE__*/t(r),n=/*#__PURE__*/t(a),u=/*#__PURE__*/t(s),l=function(e,r){for(var a=Object.create(null),s=function(e){var s=e.instancePath.split("/").slice(1).map(function(e){return e.replace(/~1/g,"/").replace(/~0/g,"~")});"required"===e.keyword&&s.push(e.params.missingProperty);var t=s.join(".");if(a[t]||(a[t]={message:e.message,type:e.keyword}),r){var i=a[t].types,n=i&&i[e.keyword];a[t]=o.appendErrors(t,r,a,e.keyword,n?[].concat(n,e.message||""):e.message)}},t=function(){var r=e[i];"errorMessage"===r.keyword?r.params.errors.forEach(function(e){e.message=r.message,s(e)}):s(r)},i=0;i<e.length;i+=1)t();return a};exports.ajvResolver=function(r,a,s){return void 0===s&&(s={}),function(o,t,c){try{var v=new i.default(Object.assign({},{allErrors:!0,validateSchema:!0},a));n.default(v),u.default(v);var d=v.compile(Object.assign({$async:s&&"async"===s.mode},r)),f=structuredClone(o),m=d(f);return c.shouldUseNativeValidation&&e.validateFieldsNatively({},c),Promise.resolve(m?{values:f,errors:{}}:{values:{},errors:e.toNestErrors(l(d.errors,!c.shouldUseNativeValidation&&"all"===c.criteriaMode),c)})}catch(e){return Promise.reject(e)}}};
|
|
2
2
|
//# sourceMappingURL=ajv.js.map
|
package/ajv/dist/ajv.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ajv.js","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport addFormats from 'ajv-formats';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n // A null-prototype object avoids false-positive hits from inherited\n // members (e.g. `toString`, `constructor`) when a field is named after\n // one of them — a plain `{}` would make `!parsedErrors[path]` truthy-skip\n // those paths and silently drop their errors.\n const parsedErrors: Record<string, FieldError> = Object.create(null);\n\n const reduceError = (error: AjvError) => {\n // Ajv will return empty instancePath when require error\n if (error.keyword === 'required') {\n
|
|
1
|
+
{"version":3,"file":"ajv.js","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport addFormats from 'ajv-formats';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n // A null-prototype object avoids false-positive hits from inherited\n // members (e.g. `toString`, `constructor`) when a field is named after\n // one of them — a plain `{}` would make `!parsedErrors[path]` truthy-skip\n // those paths and silently drop their errors.\n const parsedErrors: Record<string, FieldError> = Object.create(null);\n\n const reduceError = (error: AjvError) => {\n const pathSegments = error.instancePath\n .split('/')\n .slice(1)\n .map((segment) => segment.replace(/~1/g, '/').replace(/~0/g, '~'));\n\n // Ajv will return empty instancePath when require error\n if (error.keyword === 'required') {\n pathSegments.push(error.params.missingProperty);\n }\n\n // `/deepObject/data` -> `deepObject.data`\n const path = pathSegments.join('.');\n\n if (!parsedErrors[path]) {\n parsedErrors[path] = {\n message: error.message,\n type: error.keyword,\n };\n }\n\n if (validateAllFieldCriteria) {\n const types = parsedErrors[path].types;\n const messages = types && types[error.keyword];\n\n parsedErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n parsedErrors,\n error.keyword,\n messages\n ? ([] as string[]).concat(messages as string[], error.message || '')\n : error.message,\n ) as FieldError;\n }\n };\n\n for (let index = 0; index < ajvErrors.length; index += 1) {\n const error = ajvErrors[index];\n\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((originalError) => {\n originalError.message = error.message;\n reduceError(originalError);\n });\n } else {\n reduceError(error);\n }\n }\n\n return parsedErrors;\n};\n\n/**\n * Creates a resolver for react-hook-form using Ajv schema validation\n * @param {Schema} schema - The Ajv schema to validate against\n * @param {Object} schemaOptions - Additional schema validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {string} [resolverOptions.mode='async'] - Validation mode\n * @returns {Resolver<Schema>} A resolver function compatible with react-hook-form\n * @example\n * const schema = ajv.compile({\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * age: { type: 'number' }\n * }\n * });\n *\n * useForm({\n * resolver: ajvResolver(schema)\n * });\n */\nexport const ajvResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n const ajv = new Ajv(\n Object.assign(\n {},\n {\n allErrors: true,\n validateSchema: true,\n },\n schemaOptions,\n ),\n );\n\n ajvErrors(ajv);\n addFormats(ajv);\n\n const validate = ajv.compile(\n Object.assign(\n { $async: resolverOptions && resolverOptions.mode === 'async' },\n schema,\n ),\n );\n\n // Ajv mutates the object passed to `validate` in place (e.g. to apply\n // `useDefaults`, `removeAdditional`, or `coerceTypes`). Validating a\n // clone keeps those mutations from leaking into react-hook-form's\n // internal form values, which are passed in by reference.\n const parsedValues = structuredClone(values);\n const valid = validate(parsedValues);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return valid\n ? { values: parsedValues, errors: {} }\n : {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n validate.errors as DefinedError[],\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n };\n"],"names":["parseErrorSchema","ajvErrors","validateAllFieldCriteria","parsedErrors","Object","create","reduceError","error","pathSegments","instancePath","split","slice","map","segment","replace","keyword","push","params","missingProperty","path","join","message","type","types","messages","appendErrors","concat","_loop","index","errors","forEach","originalError","length","schema","schemaOptions","resolverOptions","values","_","options","ajv","Ajv","assign","allErrors","validateSchema","addFormats","validate","compile","$async","mode","parsedValues","structuredClone","valid","shouldUseNativeValidation","validateFieldsNatively","Promise","resolve","toNestErrors","criteriaMode","e","reject"],"mappings":"4QAOMA,EAAmB,SACvBC,EACAC,GA6CA,IAvCA,IAAMC,EAA2CC,OAAOC,OAAO,MAEzDC,EAAc,SAACC,GACnB,IAAMC,EAAeD,EAAME,aACxBC,MAAM,KACNC,MAAM,GACNC,IAAI,SAACC,GAAY,OAAAA,EAAQC,QAAQ,MAAO,KAAKA,QAAQ,MAAO,IAAI,GAG7C,aAAlBP,EAAMQ,SACRP,EAAaQ,KAAKT,EAAMU,OAAOC,iBAIjC,IAAMC,EAAOX,EAAaY,KAAK,KAS/B,GAPKjB,EAAagB,KAChBhB,EAAagB,GAAQ,CACnBE,QAASd,EAAMc,QACfC,KAAMf,EAAMQ,UAIZb,EAA0B,CAC5B,IAAMqB,EAAQpB,EAAagB,GAAMI,MAC3BC,EAAWD,GAASA,EAAMhB,EAAMQ,SAEtCZ,EAAagB,GAAQM,eACnBN,EACAjB,EACAC,EACAI,EAAMQ,QACNS,EACK,GAAgBE,OAAOF,EAAsBjB,EAAMc,SAAW,IAC/Dd,EAAMc,QAEd,CACF,EAAEM,EAAA,WAGA,IAAMpB,EAAQN,EAAU2B,GAEF,iBAAlBrB,EAAMQ,QACRR,EAAMU,OAAOY,OAAOC,QAAQ,SAACC,GAC3BA,EAAcV,QAAUd,EAAMc,QAC9Bf,EAAYyB,EACd,GAEAzB,EAAYC,EAEhB,EAXSqB,EAAQ,EAAGA,EAAQ3B,EAAU+B,OAAQJ,GAAS,EAACD,IAaxD,OAAOxB,CACT,sBAuBE,SAAC8B,EAAQC,EAAeC,GACjBC,YADgC,IAAfD,IAAAA,EAAkB,CAAA,GACnCC,SAAAA,EAAQC,EAAGC,GAAW,IAC3B,IAAMC,EAAM,IAAIC,EAAAA,QACdpC,OAAOqC,OACL,CAAE,EACF,CACEC,WAAW,EACXC,gBAAgB,GAElBT,IAIJjC,EAAAA,QAAUsC,GACVK,EAAU,QAACL,GAEX,IAAMM,EAAWN,EAAIO,QACnB1C,OAAOqC,OACL,CAAEM,OAAQZ,GAA4C,UAAzBA,EAAgBa,MAC7Cf,IAQEgB,EAAeC,gBAAgBd,GAC/Be,EAAQN,EAASI,GAIvB,OAFAX,EAAQc,2BAA6BC,EAAAA,uBAAuB,CAAA,EAAIf,GAEhEgB,QAAAC,QAAOJ,EACH,CAAEf,OAAQa,EAAcpB,OAAQ,CAAA,GAChC,CACEO,OAAQ,CAAE,EACVP,OAAQ2B,EAAYA,aAClBxD,EACE6C,EAAShB,QACRS,EAAQc,2BACkB,QAAzBd,EAAQmB,cAEZnB,IAGV,CAAC,MAAAoB,GAAA,OAAAJ,QAAAK,OAAAD,EAAA,CAAA,CAAA"}
|
package/ajv/dist/ajv.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import o from"ajv";import a from"ajv-errors";import s from"ajv-formats";import{appendErrors as t}from"react-hook-form";var i=function(r,e){for(var o=Object.create(null),a=function(r){"required"===r.keyword&&(r.
|
|
1
|
+
import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import o from"ajv";import a from"ajv-errors";import s from"ajv-formats";import{appendErrors as t}from"react-hook-form";var i=function(r,e){for(var o=Object.create(null),a=function(r){var a=r.instancePath.split("/").slice(1).map(function(r){return r.replace(/~1/g,"/").replace(/~0/g,"~")});"required"===r.keyword&&a.push(r.params.missingProperty);var s=a.join(".");if(o[s]||(o[s]={message:r.message,type:r.keyword}),e){var i=o[s].types,n=i&&i[r.keyword];o[s]=t(s,e,o,r.keyword,n?[].concat(n,r.message||""):r.message)}},s=function(){var e=r[i];"errorMessage"===e.keyword?e.params.errors.forEach(function(r){r.message=e.message,a(r)}):a(e)},i=0;i<r.length;i+=1)s();return o},n=function(t,n,c){return void 0===c&&(c={}),function(m,l,u){try{var v=new o(Object.assign({},{allErrors:!0,validateSchema:!0},n));a(v),s(v);var f=v.compile(Object.assign({$async:c&&"async"===c.mode},t)),p=structuredClone(m),d=f(p);return u.shouldUseNativeValidation&&r({},u),Promise.resolve(d?{values:p,errors:{}}:{values:{},errors:e(i(f.errors,!u.shouldUseNativeValidation&&"all"===u.criteriaMode),u)})}catch(r){return Promise.reject(r)}}};export{n as ajvResolver};
|
|
2
2
|
//# sourceMappingURL=ajv.module.js.map
|
package/ajv/dist/ajv.modern.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{validateFieldsNatively as e,toNestErrors as r}from"@hookform/resolvers";import s from"ajv";import o from"ajv-errors";import a from"ajv-formats";import{appendErrors as t}from"react-hook-form";const
|
|
1
|
+
import{validateFieldsNatively as e,toNestErrors as r}from"@hookform/resolvers";import s from"ajv";import o from"ajv-errors";import a from"ajv-formats";import{appendErrors as t}from"react-hook-form";const c=(e,r)=>{const s=Object.create(null),o=e=>{const o=e.instancePath.split("/").slice(1).map(e=>e.replace(/~1/g,"/").replace(/~0/g,"~"));"required"===e.keyword&&o.push(e.params.missingProperty);const a=o.join(".");if(s[a]||(s[a]={message:e.message,type:e.keyword}),r){const o=s[a].types,c=o&&o[e.keyword];s[a]=t(a,r,s,e.keyword,c?[].concat(c,e.message||""):e.message)}};for(let r=0;r<e.length;r+=1){const s=e[r];"errorMessage"===s.keyword?s.params.errors.forEach(e=>{e.message=s.message,o(e)}):o(s)}return s},m=(t,m,n={})=>async(i,l,p)=>{const d=new s(Object.assign({},{allErrors:!0,validateSchema:!0},m));o(d),a(d);const g=d.compile(Object.assign({$async:n&&"async"===n.mode},t)),f=structuredClone(i),u=g(f);return p.shouldUseNativeValidation&&e({},p),u?{values:f,errors:{}}:{values:{},errors:r(c(g.errors,!p.shouldUseNativeValidation&&"all"===p.criteriaMode),p)}};export{m as ajvResolver};
|
|
2
2
|
//# sourceMappingURL=ajv.modern.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ajv.modern.mjs","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport addFormats from 'ajv-formats';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n // A null-prototype object avoids false-positive hits from inherited\n // members (e.g. `toString`, `constructor`) when a field is named after\n // one of them — a plain `{}` would make `!parsedErrors[path]` truthy-skip\n // those paths and silently drop their errors.\n const parsedErrors: Record<string, FieldError> = Object.create(null);\n\n const reduceError = (error: AjvError) => {\n // Ajv will return empty instancePath when require error\n if (error.keyword === 'required') {\n
|
|
1
|
+
{"version":3,"file":"ajv.modern.mjs","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport addFormats from 'ajv-formats';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n // A null-prototype object avoids false-positive hits from inherited\n // members (e.g. `toString`, `constructor`) when a field is named after\n // one of them — a plain `{}` would make `!parsedErrors[path]` truthy-skip\n // those paths and silently drop their errors.\n const parsedErrors: Record<string, FieldError> = Object.create(null);\n\n const reduceError = (error: AjvError) => {\n const pathSegments = error.instancePath\n .split('/')\n .slice(1)\n .map((segment) => segment.replace(/~1/g, '/').replace(/~0/g, '~'));\n\n // Ajv will return empty instancePath when require error\n if (error.keyword === 'required') {\n pathSegments.push(error.params.missingProperty);\n }\n\n // `/deepObject/data` -> `deepObject.data`\n const path = pathSegments.join('.');\n\n if (!parsedErrors[path]) {\n parsedErrors[path] = {\n message: error.message,\n type: error.keyword,\n };\n }\n\n if (validateAllFieldCriteria) {\n const types = parsedErrors[path].types;\n const messages = types && types[error.keyword];\n\n parsedErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n parsedErrors,\n error.keyword,\n messages\n ? ([] as string[]).concat(messages as string[], error.message || '')\n : error.message,\n ) as FieldError;\n }\n };\n\n for (let index = 0; index < ajvErrors.length; index += 1) {\n const error = ajvErrors[index];\n\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((originalError) => {\n originalError.message = error.message;\n reduceError(originalError);\n });\n } else {\n reduceError(error);\n }\n }\n\n return parsedErrors;\n};\n\n/**\n * Creates a resolver for react-hook-form using Ajv schema validation\n * @param {Schema} schema - The Ajv schema to validate against\n * @param {Object} schemaOptions - Additional schema validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {string} [resolverOptions.mode='async'] - Validation mode\n * @returns {Resolver<Schema>} A resolver function compatible with react-hook-form\n * @example\n * const schema = ajv.compile({\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * age: { type: 'number' }\n * }\n * });\n *\n * useForm({\n * resolver: ajvResolver(schema)\n * });\n */\nexport const ajvResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n const ajv = new Ajv(\n Object.assign(\n {},\n {\n allErrors: true,\n validateSchema: true,\n },\n schemaOptions,\n ),\n );\n\n ajvErrors(ajv);\n addFormats(ajv);\n\n const validate = ajv.compile(\n Object.assign(\n { $async: resolverOptions && resolverOptions.mode === 'async' },\n schema,\n ),\n );\n\n // Ajv mutates the object passed to `validate` in place (e.g. to apply\n // `useDefaults`, `removeAdditional`, or `coerceTypes`). Validating a\n // clone keeps those mutations from leaking into react-hook-form's\n // internal form values, which are passed in by reference.\n const parsedValues = structuredClone(values);\n const valid = validate(parsedValues);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return valid\n ? { values: parsedValues, errors: {} }\n : {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n validate.errors as DefinedError[],\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n };\n"],"names":["parseErrorSchema","ajvErrors","validateAllFieldCriteria","parsedErrors","Object","create","reduceError","error","pathSegments","instancePath","split","slice","map","segment","replace","keyword","push","params","missingProperty","path","join","message","type","types","messages","appendErrors","concat","index","length","errors","forEach","originalError","ajvResolver","schema","schemaOptions","resolverOptions","async","values","_","options","ajv","Ajv","assign","allErrors","validateSchema","addFormats","validate","compile","$async","mode","parsedValues","structuredClone","valid","shouldUseNativeValidation","validateFieldsNatively","toNestErrors","criteriaMode"],"mappings":"sMAOA,MAAMA,EAAmBA,CACvBC,EACAC,KAMA,MAAMC,EAA2CC,OAAOC,OAAO,MAEzDC,EAAeC,IACnB,MAAMC,EAAeD,EAAME,aACxBC,MAAM,KACNC,MAAM,GACNC,IAAKC,GAAYA,EAAQC,QAAQ,MAAO,KAAKA,QAAQ,MAAO,MAGzC,aAAlBP,EAAMQ,SACRP,EAAaQ,KAAKT,EAAMU,OAAOC,iBAIjC,MAAMC,EAAOX,EAAaY,KAAK,KAS/B,GAPKjB,EAAagB,KAChBhB,EAAagB,GAAQ,CACnBE,QAASd,EAAMc,QACfC,KAAMf,EAAMQ,UAIZb,EAA0B,CAC5B,MAAMqB,EAAQpB,EAAagB,GAAMI,MAC3BC,EAAWD,GAASA,EAAMhB,EAAMQ,SAEtCZ,EAAagB,GAAQM,EACnBN,EACAjB,EACAC,EACAI,EAAMQ,QACNS,EACK,GAAgBE,OAAOF,EAAsBjB,EAAMc,SAAW,IAC/Dd,EAAMc,QAEd,GAGF,IAAK,IAAIM,EAAQ,EAAGA,EAAQ1B,EAAU2B,OAAQD,GAAS,EAAG,CACxD,MAAMpB,EAAQN,EAAU0B,GAEF,iBAAlBpB,EAAMQ,QACRR,EAAMU,OAAOY,OAAOC,QAASC,IAC3BA,EAAcV,QAAUd,EAAMc,QAC9Bf,EAAYyB,EAAc,GAG5BzB,EAAYC,EAEhB,CAEA,OAAOJ,CAAY,EAuBR6B,EACXA,CAACC,EAAQC,EAAeC,EAAkB,CAAA,IAC1CC,MAAOC,EAAQC,EAAGC,KAChB,MAAMC,EAAM,IAAIC,EACdrC,OAAOsC,OACL,GACA,CACEC,WAAW,EACXC,gBAAgB,GAElBV,IAIJjC,EAAUuC,GACVK,EAAWL,GAEX,MAAMM,EAAWN,EAAIO,QACnB3C,OAAOsC,OACL,CAAEM,OAAQb,GAA4C,UAAzBA,EAAgBc,MAC7ChB,IAQEiB,EAAeC,gBAAgBd,GAC/Be,EAAQN,EAASI,GAIvB,OAFAX,EAAQc,2BAA6BC,EAAuB,GAAIf,GAEzDa,EACH,CAAEf,OAAQa,EAAcrB,OAAQ,CAAA,GAChC,CACEQ,OAAQ,CAAE,EACVR,OAAQ0B,EACNvD,EACE8C,EAASjB,QACRU,EAAQc,2BACkB,QAAzBd,EAAQiB,cAEZjB,GAEH"}
|
package/ajv/dist/ajv.module.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import o from"ajv";import a from"ajv-errors";import s from"ajv-formats";import{appendErrors as t}from"react-hook-form";var i=function(r,e){for(var o=Object.create(null),a=function(r){"required"===r.keyword&&(r.
|
|
1
|
+
import{validateFieldsNatively as r,toNestErrors as e}from"@hookform/resolvers";import o from"ajv";import a from"ajv-errors";import s from"ajv-formats";import{appendErrors as t}from"react-hook-form";var i=function(r,e){for(var o=Object.create(null),a=function(r){var a=r.instancePath.split("/").slice(1).map(function(r){return r.replace(/~1/g,"/").replace(/~0/g,"~")});"required"===r.keyword&&a.push(r.params.missingProperty);var s=a.join(".");if(o[s]||(o[s]={message:r.message,type:r.keyword}),e){var i=o[s].types,n=i&&i[r.keyword];o[s]=t(s,e,o,r.keyword,n?[].concat(n,r.message||""):r.message)}},s=function(){var e=r[i];"errorMessage"===e.keyword?e.params.errors.forEach(function(r){r.message=e.message,a(r)}):a(e)},i=0;i<r.length;i+=1)s();return o},n=function(t,n,c){return void 0===c&&(c={}),function(m,l,u){try{var v=new o(Object.assign({},{allErrors:!0,validateSchema:!0},n));a(v),s(v);var f=v.compile(Object.assign({$async:c&&"async"===c.mode},t)),p=structuredClone(m),d=f(p);return u.shouldUseNativeValidation&&r({},u),Promise.resolve(d?{values:p,errors:{}}:{values:{},errors:e(i(f.errors,!u.shouldUseNativeValidation&&"all"===u.criteriaMode),u)})}catch(r){return Promise.reject(r)}}};export{n as ajvResolver};
|
|
2
2
|
//# sourceMappingURL=ajv.module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ajv.module.js","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport addFormats from 'ajv-formats';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n // A null-prototype object avoids false-positive hits from inherited\n // members (e.g. `toString`, `constructor`) when a field is named after\n // one of them — a plain `{}` would make `!parsedErrors[path]` truthy-skip\n // those paths and silently drop their errors.\n const parsedErrors: Record<string, FieldError> = Object.create(null);\n\n const reduceError = (error: AjvError) => {\n // Ajv will return empty instancePath when require error\n if (error.keyword === 'required') {\n
|
|
1
|
+
{"version":3,"file":"ajv.module.js","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport addFormats from 'ajv-formats';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n // A null-prototype object avoids false-positive hits from inherited\n // members (e.g. `toString`, `constructor`) when a field is named after\n // one of them — a plain `{}` would make `!parsedErrors[path]` truthy-skip\n // those paths and silently drop their errors.\n const parsedErrors: Record<string, FieldError> = Object.create(null);\n\n const reduceError = (error: AjvError) => {\n const pathSegments = error.instancePath\n .split('/')\n .slice(1)\n .map((segment) => segment.replace(/~1/g, '/').replace(/~0/g, '~'));\n\n // Ajv will return empty instancePath when require error\n if (error.keyword === 'required') {\n pathSegments.push(error.params.missingProperty);\n }\n\n // `/deepObject/data` -> `deepObject.data`\n const path = pathSegments.join('.');\n\n if (!parsedErrors[path]) {\n parsedErrors[path] = {\n message: error.message,\n type: error.keyword,\n };\n }\n\n if (validateAllFieldCriteria) {\n const types = parsedErrors[path].types;\n const messages = types && types[error.keyword];\n\n parsedErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n parsedErrors,\n error.keyword,\n messages\n ? ([] as string[]).concat(messages as string[], error.message || '')\n : error.message,\n ) as FieldError;\n }\n };\n\n for (let index = 0; index < ajvErrors.length; index += 1) {\n const error = ajvErrors[index];\n\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((originalError) => {\n originalError.message = error.message;\n reduceError(originalError);\n });\n } else {\n reduceError(error);\n }\n }\n\n return parsedErrors;\n};\n\n/**\n * Creates a resolver for react-hook-form using Ajv schema validation\n * @param {Schema} schema - The Ajv schema to validate against\n * @param {Object} schemaOptions - Additional schema validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {string} [resolverOptions.mode='async'] - Validation mode\n * @returns {Resolver<Schema>} A resolver function compatible with react-hook-form\n * @example\n * const schema = ajv.compile({\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * age: { type: 'number' }\n * }\n * });\n *\n * useForm({\n * resolver: ajvResolver(schema)\n * });\n */\nexport const ajvResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n const ajv = new Ajv(\n Object.assign(\n {},\n {\n allErrors: true,\n validateSchema: true,\n },\n schemaOptions,\n ),\n );\n\n ajvErrors(ajv);\n addFormats(ajv);\n\n const validate = ajv.compile(\n Object.assign(\n { $async: resolverOptions && resolverOptions.mode === 'async' },\n schema,\n ),\n );\n\n // Ajv mutates the object passed to `validate` in place (e.g. to apply\n // `useDefaults`, `removeAdditional`, or `coerceTypes`). Validating a\n // clone keeps those mutations from leaking into react-hook-form's\n // internal form values, which are passed in by reference.\n const parsedValues = structuredClone(values);\n const valid = validate(parsedValues);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return valid\n ? { values: parsedValues, errors: {} }\n : {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n validate.errors as DefinedError[],\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n };\n"],"names":["parseErrorSchema","ajvErrors","validateAllFieldCriteria","parsedErrors","Object","create","reduceError","error","pathSegments","instancePath","split","slice","map","segment","replace","keyword","push","params","missingProperty","path","join","message","type","types","messages","appendErrors","concat","_loop","index","errors","forEach","originalError","length","ajvResolver","schema","schemaOptions","resolverOptions","values","_","options","ajv","Ajv","assign","allErrors","validateSchema","addFormats","validate","compile","$async","mode","parsedValues","structuredClone","valid","shouldUseNativeValidation","validateFieldsNatively","Promise","resolve","toNestErrors","criteriaMode","e","reject"],"mappings":"sMAOA,IAAMA,EAAmB,SACvBC,EACAC,GA6CA,IAvCA,IAAMC,EAA2CC,OAAOC,OAAO,MAEzDC,EAAc,SAACC,GACnB,IAAMC,EAAeD,EAAME,aACxBC,MAAM,KACNC,MAAM,GACNC,IAAI,SAACC,GAAY,OAAAA,EAAQC,QAAQ,MAAO,KAAKA,QAAQ,MAAO,IAAI,GAG7C,aAAlBP,EAAMQ,SACRP,EAAaQ,KAAKT,EAAMU,OAAOC,iBAIjC,IAAMC,EAAOX,EAAaY,KAAK,KAS/B,GAPKjB,EAAagB,KAChBhB,EAAagB,GAAQ,CACnBE,QAASd,EAAMc,QACfC,KAAMf,EAAMQ,UAIZb,EAA0B,CAC5B,IAAMqB,EAAQpB,EAAagB,GAAMI,MAC3BC,EAAWD,GAASA,EAAMhB,EAAMQ,SAEtCZ,EAAagB,GAAQM,EACnBN,EACAjB,EACAC,EACAI,EAAMQ,QACNS,EACK,GAAgBE,OAAOF,EAAsBjB,EAAMc,SAAW,IAC/Dd,EAAMc,QAEd,CACF,EAAEM,EAAA,WAGA,IAAMpB,EAAQN,EAAU2B,GAEF,iBAAlBrB,EAAMQ,QACRR,EAAMU,OAAOY,OAAOC,QAAQ,SAACC,GAC3BA,EAAcV,QAAUd,EAAMc,QAC9Bf,EAAYyB,EACd,GAEAzB,EAAYC,EAEhB,EAXSqB,EAAQ,EAAGA,EAAQ3B,EAAU+B,OAAQJ,GAAS,EAACD,IAaxD,OAAOxB,CACT,EAsBa8B,EACX,SAACC,EAAQC,EAAeC,GACjBC,YADgC,IAAfD,IAAAA,EAAkB,CAAA,GACnCC,SAAAA,EAAQC,EAAGC,GAAW,IAC3B,IAAMC,EAAM,IAAIC,EACdrC,OAAOsC,OACL,CAAE,EACF,CACEC,WAAW,EACXC,gBAAgB,GAElBT,IAIJlC,EAAUuC,GACVK,EAAWL,GAEX,IAAMM,EAAWN,EAAIO,QACnB3C,OAAOsC,OACL,CAAEM,OAAQZ,GAA4C,UAAzBA,EAAgBa,MAC7Cf,IAQEgB,EAAeC,gBAAgBd,GAC/Be,EAAQN,EAASI,GAIvB,OAFAX,EAAQc,2BAA6BC,EAAuB,CAAA,EAAIf,GAEhEgB,QAAAC,QAAOJ,EACH,CAAEf,OAAQa,EAAcrB,OAAQ,CAAA,GAChC,CACEQ,OAAQ,CAAE,EACVR,OAAQ4B,EACNzD,EACE8C,EAASjB,QACRU,EAAQc,2BACkB,QAAzBd,EAAQmB,cAEZnB,IAGV,CAAC,MAAAoB,GAAA,OAAAJ,QAAAK,OAAAD,EAAA,CAAA,CAAA"}
|
package/ajv/dist/ajv.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@hookform/resolvers"),require("ajv"),require("ajv-errors"),require("ajv-formats"),require("react-hook-form")):"function"==typeof define&&define.amd?define(["exports","@hookform/resolvers","ajv","ajv-errors","ajv-formats","react-hook-form"],r):r((e||self).hookformResolversAjv={},e.hookformResolvers,e.ajv,e.ajvErrors,e.ajvFormats,e.ReactHookForm)}(this,function(e,r,o,a,s,t){function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=/*#__PURE__*/n(o),
|
|
1
|
+
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@hookform/resolvers"),require("ajv"),require("ajv-errors"),require("ajv-formats"),require("react-hook-form")):"function"==typeof define&&define.amd?define(["exports","@hookform/resolvers","ajv","ajv-errors","ajv-formats","react-hook-form"],r):r((e||self).hookformResolversAjv={},e.hookformResolvers,e.ajv,e.ajvErrors,e.ajvFormats,e.ReactHookForm)}(this,function(e,r,o,a,s,t){function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=/*#__PURE__*/n(o),l=/*#__PURE__*/n(a),u=/*#__PURE__*/n(s),f=function(e,r){for(var o=Object.create(null),a=function(e){var a=e.instancePath.split("/").slice(1).map(function(e){return e.replace(/~1/g,"/").replace(/~0/g,"~")});"required"===e.keyword&&a.push(e.params.missingProperty);var s=a.join(".");if(o[s]||(o[s]={message:e.message,type:e.keyword}),r){var n=o[s].types,i=n&&n[e.keyword];o[s]=t.appendErrors(s,r,o,e.keyword,i?[].concat(i,e.message||""):e.message)}},s=function(){var r=e[n];"errorMessage"===r.keyword?r.params.errors.forEach(function(e){e.message=r.message,a(e)}):a(r)},n=0;n<e.length;n+=1)s();return o};e.ajvResolver=function(e,o,a){return void 0===a&&(a={}),function(s,t,n){try{var c=new i.default(Object.assign({},{allErrors:!0,validateSchema:!0},o));l.default(c),u.default(c);var v=c.compile(Object.assign({$async:a&&"async"===a.mode},e)),d=structuredClone(s),m=v(d);return n.shouldUseNativeValidation&&r.validateFieldsNatively({},n),Promise.resolve(m?{values:d,errors:{}}:{values:{},errors:r.toNestErrors(f(v.errors,!n.shouldUseNativeValidation&&"all"===n.criteriaMode),n)})}catch(e){return Promise.reject(e)}}}});
|
|
2
2
|
//# sourceMappingURL=ajv.umd.js.map
|
package/ajv/dist/ajv.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ajv.umd.js","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport addFormats from 'ajv-formats';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n // A null-prototype object avoids false-positive hits from inherited\n // members (e.g. `toString`, `constructor`) when a field is named after\n // one of them — a plain `{}` would make `!parsedErrors[path]` truthy-skip\n // those paths and silently drop their errors.\n const parsedErrors: Record<string, FieldError> = Object.create(null);\n\n const reduceError = (error: AjvError) => {\n // Ajv will return empty instancePath when require error\n if (error.keyword === 'required') {\n
|
|
1
|
+
{"version":3,"file":"ajv.umd.js","sources":["../src/ajv.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport Ajv, { DefinedError } from 'ajv';\nimport ajvErrors from 'ajv-errors';\nimport addFormats from 'ajv-formats';\nimport { FieldError, appendErrors } from 'react-hook-form';\nimport { AjvError, Resolver } from './types';\n\nconst parseErrorSchema = (\n ajvErrors: AjvError[],\n validateAllFieldCriteria: boolean,\n) => {\n // A null-prototype object avoids false-positive hits from inherited\n // members (e.g. `toString`, `constructor`) when a field is named after\n // one of them — a plain `{}` would make `!parsedErrors[path]` truthy-skip\n // those paths and silently drop their errors.\n const parsedErrors: Record<string, FieldError> = Object.create(null);\n\n const reduceError = (error: AjvError) => {\n const pathSegments = error.instancePath\n .split('/')\n .slice(1)\n .map((segment) => segment.replace(/~1/g, '/').replace(/~0/g, '~'));\n\n // Ajv will return empty instancePath when require error\n if (error.keyword === 'required') {\n pathSegments.push(error.params.missingProperty);\n }\n\n // `/deepObject/data` -> `deepObject.data`\n const path = pathSegments.join('.');\n\n if (!parsedErrors[path]) {\n parsedErrors[path] = {\n message: error.message,\n type: error.keyword,\n };\n }\n\n if (validateAllFieldCriteria) {\n const types = parsedErrors[path].types;\n const messages = types && types[error.keyword];\n\n parsedErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n parsedErrors,\n error.keyword,\n messages\n ? ([] as string[]).concat(messages as string[], error.message || '')\n : error.message,\n ) as FieldError;\n }\n };\n\n for (let index = 0; index < ajvErrors.length; index += 1) {\n const error = ajvErrors[index];\n\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((originalError) => {\n originalError.message = error.message;\n reduceError(originalError);\n });\n } else {\n reduceError(error);\n }\n }\n\n return parsedErrors;\n};\n\n/**\n * Creates a resolver for react-hook-form using Ajv schema validation\n * @param {Schema} schema - The Ajv schema to validate against\n * @param {Object} schemaOptions - Additional schema validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {string} [resolverOptions.mode='async'] - Validation mode\n * @returns {Resolver<Schema>} A resolver function compatible with react-hook-form\n * @example\n * const schema = ajv.compile({\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * age: { type: 'number' }\n * }\n * });\n *\n * useForm({\n * resolver: ajvResolver(schema)\n * });\n */\nexport const ajvResolver: Resolver =\n (schema, schemaOptions, resolverOptions = {}) =>\n async (values, _, options) => {\n const ajv = new Ajv(\n Object.assign(\n {},\n {\n allErrors: true,\n validateSchema: true,\n },\n schemaOptions,\n ),\n );\n\n ajvErrors(ajv);\n addFormats(ajv);\n\n const validate = ajv.compile(\n Object.assign(\n { $async: resolverOptions && resolverOptions.mode === 'async' },\n schema,\n ),\n );\n\n // Ajv mutates the object passed to `validate` in place (e.g. to apply\n // `useDefaults`, `removeAdditional`, or `coerceTypes`). Validating a\n // clone keeps those mutations from leaking into react-hook-form's\n // internal form values, which are passed in by reference.\n const parsedValues = structuredClone(values);\n const valid = validate(parsedValues);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return valid\n ? { values: parsedValues, errors: {} }\n : {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n validate.errors as DefinedError[],\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n };\n"],"names":["parseErrorSchema","ajvErrors","validateAllFieldCriteria","parsedErrors","Object","create","reduceError","error","pathSegments","instancePath","split","slice","map","segment","replace","keyword","push","params","missingProperty","path","join","message","type","types","messages","appendErrors","concat","_loop","index","errors","forEach","originalError","length","schema","schemaOptions","resolverOptions","values","_","options","ajv","Ajv","assign","allErrors","validateSchema","addFormats","validate","compile","$async","mode","parsedValues","structuredClone","valid","shouldUseNativeValidation","validateFieldsNatively","Promise","resolve","toNestErrors","criteriaMode","e","reject"],"mappings":"koBAOMA,EAAmB,SACvBC,EACAC,GA6CA,IAvCA,IAAMC,EAA2CC,OAAOC,OAAO,MAEzDC,EAAc,SAACC,GACnB,IAAMC,EAAeD,EAAME,aACxBC,MAAM,KACNC,MAAM,GACNC,IAAI,SAACC,GAAY,OAAAA,EAAQC,QAAQ,MAAO,KAAKA,QAAQ,MAAO,IAAI,GAG7C,aAAlBP,EAAMQ,SACRP,EAAaQ,KAAKT,EAAMU,OAAOC,iBAIjC,IAAMC,EAAOX,EAAaY,KAAK,KAS/B,GAPKjB,EAAagB,KAChBhB,EAAagB,GAAQ,CACnBE,QAASd,EAAMc,QACfC,KAAMf,EAAMQ,UAIZb,EAA0B,CAC5B,IAAMqB,EAAQpB,EAAagB,GAAMI,MAC3BC,EAAWD,GAASA,EAAMhB,EAAMQ,SAEtCZ,EAAagB,GAAQM,eACnBN,EACAjB,EACAC,EACAI,EAAMQ,QACNS,EACK,GAAgBE,OAAOF,EAAsBjB,EAAMc,SAAW,IAC/Dd,EAAMc,QAEd,CACF,EAAEM,EAAA,WAGA,IAAMpB,EAAQN,EAAU2B,GAEF,iBAAlBrB,EAAMQ,QACRR,EAAMU,OAAOY,OAAOC,QAAQ,SAACC,GAC3BA,EAAcV,QAAUd,EAAMc,QAC9Bf,EAAYyB,EACd,GAEAzB,EAAYC,EAEhB,EAXSqB,EAAQ,EAAGA,EAAQ3B,EAAU+B,OAAQJ,GAAS,EAACD,IAaxD,OAAOxB,CACT,gBAuBE,SAAC8B,EAAQC,EAAeC,GACjBC,YADgC,IAAfD,IAAAA,EAAkB,CAAA,GACnCC,SAAAA,EAAQC,EAAGC,GAAW,IAC3B,IAAMC,EAAM,IAAIC,EAAAA,QACdpC,OAAOqC,OACL,CAAE,EACF,CACEC,WAAW,EACXC,gBAAgB,GAElBT,IAIJjC,EAAAA,QAAUsC,GACVK,EAAU,QAACL,GAEX,IAAMM,EAAWN,EAAIO,QACnB1C,OAAOqC,OACL,CAAEM,OAAQZ,GAA4C,UAAzBA,EAAgBa,MAC7Cf,IAQEgB,EAAeC,gBAAgBd,GAC/Be,EAAQN,EAASI,GAIvB,OAFAX,EAAQc,2BAA6BC,EAAAA,uBAAuB,CAAA,EAAIf,GAEhEgB,QAAAC,QAAOJ,EACH,CAAEf,OAAQa,EAAcpB,OAAQ,CAAA,GAChC,CACEO,OAAQ,CAAE,EACVP,OAAQ2B,EAAYA,aAClBxD,EACE6C,EAAShB,QACRS,EAAQc,2BACkB,QAAzBd,EAAQmB,cAEZnB,IAGV,CAAC,MAAAoB,GAAA,OAAAJ,QAAAK,OAAAD,EAAA,CAAA,CAAA"}
|
package/ajv/src/__tests__/ajv.ts
CHANGED
|
@@ -102,6 +102,64 @@ describe('ajvResolver', () => {
|
|
|
102
102
|
).toMatchSnapshot();
|
|
103
103
|
});
|
|
104
104
|
|
|
105
|
+
it.each(
|
|
106
|
+
['a/b', 'a~b', 'a~1b'].flatMap((name) =>
|
|
107
|
+
[false, true].map((required) => ({ name, required })),
|
|
108
|
+
),
|
|
109
|
+
)(
|
|
110
|
+
'should preserve $name with required=$required',
|
|
111
|
+
async ({ name, required }) => {
|
|
112
|
+
const result = await ajvResolver<Record<string, string>>({
|
|
113
|
+
type: 'object',
|
|
114
|
+
properties: { [name]: { type: 'string' } },
|
|
115
|
+
required: [name],
|
|
116
|
+
})(required ? {} : { [name]: 1 }, undefined, {
|
|
117
|
+
fields: {},
|
|
118
|
+
shouldUseNativeValidation,
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
expect(Object.keys(result.errors)).toEqual([name]);
|
|
122
|
+
expect(result.errors[name]?.type).toBe(required ? 'required' : 'type');
|
|
123
|
+
},
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
it.each([false, true])(
|
|
127
|
+
'should preserve nested paths, messages and refs with required=%s',
|
|
128
|
+
async (required) => {
|
|
129
|
+
const name = 'parent/~1.a~1/b';
|
|
130
|
+
const ref = { name };
|
|
131
|
+
const type = required ? 'required' : 'type';
|
|
132
|
+
const result = await ajvResolver<{ 'parent/~1': { 'a~1/b': string } }>({
|
|
133
|
+
type: 'object',
|
|
134
|
+
properties: {
|
|
135
|
+
'parent/~1': {
|
|
136
|
+
type: 'object',
|
|
137
|
+
properties: { 'a~1/b': { type: 'string' } },
|
|
138
|
+
required: ['a~1/b'],
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
required: ['parent/~1'],
|
|
142
|
+
errorMessage: 'Invalid value',
|
|
143
|
+
})({ 'parent/~1': required ? {} : { 'a~1/b': 1 } }, undefined, {
|
|
144
|
+
fields: { [name]: { name, ref } },
|
|
145
|
+
criteriaMode: 'all',
|
|
146
|
+
shouldUseNativeValidation,
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
expect(result.errors).toEqual({
|
|
150
|
+
'parent/~1': {
|
|
151
|
+
'a~1/b': {
|
|
152
|
+
type,
|
|
153
|
+
message: 'Invalid value',
|
|
154
|
+
types: { [type]: 'Invalid value' },
|
|
155
|
+
ref,
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
expect(result.errors['parent/~1']?.['a~1/b']?.ref).toBe(ref);
|
|
160
|
+
},
|
|
161
|
+
);
|
|
162
|
+
|
|
105
163
|
it('should not mutate the input values object when `useDefaults` fills in missing properties (#647)', async () => {
|
|
106
164
|
interface DataWithDefaults {
|
|
107
165
|
user: { name: string; lastName: string };
|
package/ajv/src/ajv.ts
CHANGED
|
@@ -16,13 +16,18 @@ const parseErrorSchema = (
|
|
|
16
16
|
const parsedErrors: Record<string, FieldError> = Object.create(null);
|
|
17
17
|
|
|
18
18
|
const reduceError = (error: AjvError) => {
|
|
19
|
+
const pathSegments = error.instancePath
|
|
20
|
+
.split('/')
|
|
21
|
+
.slice(1)
|
|
22
|
+
.map((segment) => segment.replace(/~1/g, '/').replace(/~0/g, '~'));
|
|
23
|
+
|
|
19
24
|
// Ajv will return empty instancePath when require error
|
|
20
25
|
if (error.keyword === 'required') {
|
|
21
|
-
|
|
26
|
+
pathSegments.push(error.params.missingProperty);
|
|
22
27
|
}
|
|
23
28
|
|
|
24
29
|
// `/deepObject/data` -> `deepObject.data`
|
|
25
|
-
const path =
|
|
30
|
+
const path = pathSegments.join('.');
|
|
26
31
|
|
|
27
32
|
if (!parsedErrors[path]) {
|
|
28
33
|
parsedErrors[path] = {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { Schema } from 'effect';
|
|
2
|
-
import { ParseOptions } from 'effect/SchemaAST';
|
|
2
|
+
import type { ParseOptions } from 'effect/SchemaAST';
|
|
3
3
|
import { FieldValues, Resolver } from 'react-hook-form';
|
|
4
|
-
export declare function effectTsResolver<Input extends FieldValues, Context, Output>(schema: Schema.
|
|
4
|
+
export declare function effectTsResolver<Input extends FieldValues, Context, Output>(schema: Schema.Codec<Output, Input, never, unknown>, schemaOptions?: ParseOptions, resolverOptions?: {
|
|
5
5
|
mode?: 'async' | 'sync';
|
|
6
6
|
raw?: false;
|
|
7
7
|
}): Resolver<Input, Context, Output>;
|
|
8
|
-
export declare function effectTsResolver<Input extends FieldValues, Context, Output>(schema: Schema.
|
|
8
|
+
export declare function effectTsResolver<Input extends FieldValues, Context, Output>(schema: Schema.Codec<Output, Input, never, unknown>, schemaOptions: ParseOptions | undefined, resolverOptions: {
|
|
9
9
|
mode?: 'async' | 'sync';
|
|
10
10
|
raw: true;
|
|
11
11
|
}): Resolver<Input, Context, Input>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=require("@hookform/resolvers"),r=require("effect"),t=require("
|
|
1
|
+
var e=require("@hookform/resolvers"),r=require("effect"),t=require("react-hook-form"),s=r.SchemaIssue.makeFormatterStandardSchemaV1(),a=function(e,r){switch(e._tag){case"Pointer":return a(e.issue,[].concat(r,e.path));case"Encoding":return a(e.issue,r);case"Composite":case"AnyOf":if(e.issues.length)return e.issues.flatMap(function(e){return a(e,r)})}return s(e).issues.map(function(t){return{path:[].concat(r,t.path||[]),message:t.message,type:e._tag}})};exports.effectTsResolver=function(s,n){return void 0===n&&(n={errors:"all",onExcessProperty:"ignore"}),function(o,i,c){return r.Schema.decodeUnknownEffect(s)(o,n).pipe(r.Effect.match({onFailure:function(r){var s=!c.shouldUseNativeValidation&&"all"===c.criteriaMode,n=a(r.issue,[]).reduce(function(e,r){var a=r.path.join(".");if(e[a]||(e[a]={message:r.message,type:r.type}),s){var n=e[a].types,o=n&&n[r.type];e[a]=t.appendErrors(a,s,e,r.type,o?[].concat(o,r.message):r.message)}return e},Object.create(null));return{errors:e.toNestErrors(n,c),values:{}}},onSuccess:function(r){return c.shouldUseNativeValidation&&e.validateFieldsNatively({},c),{errors:{},values:r}}}),r.Effect.runPromise)}};
|
|
2
2
|
//# sourceMappingURL=effect-ts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effect-ts.js","sources":["../src/effect-ts.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { Effect, Schema
|
|
1
|
+
{"version":3,"file":"effect-ts.js","sources":["../src/effect-ts.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { Effect, Schema, SchemaIssue } from 'effect';\nimport type { ParseOptions } from 'effect/SchemaAST';\nimport {\n type FieldError,\n FieldValues,\n Resolver,\n appendErrors,\n} from 'react-hook-form';\n\ntype Issue = { path: PropertyKey[]; message: string; type: string };\n\nconst formatIssue = SchemaIssue.makeFormatterStandardSchemaV1();\n\n// Flattens the issue tree like `makeFormatterStandardSchemaV1` does, but keeps\n// the `_tag` of the failing node so it can be reported as the error `type`.\nconst flattenIssue = (\n issue: SchemaIssue.Issue,\n path: PropertyKey[],\n): Issue[] => {\n switch (issue._tag) {\n case 'Pointer':\n return flattenIssue(issue.issue, [...path, ...issue.path]);\n case 'Encoding':\n return flattenIssue(issue.issue, path);\n case 'Composite':\n case 'AnyOf':\n if (issue.issues.length) {\n return issue.issues.flatMap((issue) => flattenIssue(issue, path));\n }\n }\n\n return formatIssue(issue).issues.map((error) => ({\n path: [...path, ...(error.path || [])] as PropertyKey[],\n message: error.message,\n type: issue._tag,\n }));\n};\n\nexport function effectTsResolver<Input extends FieldValues, Context, Output>(\n schema: Schema.Codec<Output, Input, never, unknown>,\n schemaOptions?: ParseOptions,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function effectTsResolver<Input extends FieldValues, Context, Output>(\n schema: Schema.Codec<Output, Input, never, unknown>,\n schemaOptions: ParseOptions | undefined,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using Effect Schema validation\n * @param {Schema.Codec<Output, Input>} schema - The Effect schema to validate against\n * @param {ParseOptions} [schemaOptions] - Optional Effect Schema parse options\n * @returns {Resolver<Schema.Schema.Type<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = Schema.Struct({\n * name: Schema.String,\n * age: Schema.Number\n * });\n *\n * useForm({\n * resolver: effectTsResolver(schema)\n * });\n */\nexport function effectTsResolver<Input extends FieldValues, Context, Output>(\n schema: Schema.Codec<Output, Input, never, unknown>,\n schemaOptions: ParseOptions = { errors: 'all', onExcessProperty: 'ignore' },\n): Resolver<Input, Context, Output | Input> {\n return (values, _, options) =>\n Schema.decodeUnknownEffect(schema)(values, schemaOptions).pipe(\n Effect.match({\n onFailure: ({ issue }) => {\n const validateAllFieldCriteria =\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all';\n\n // A null-prototype accumulator avoids false-positive hits from\n // inherited members (e.g. `toString`, `constructor`) when a field\n // is named after one of them — a plain `{}` would make `!acc[key]`\n // truthy-skip those paths and silently drop their errors.\n const errors = flattenIssue(issue, []).reduce(\n (acc, error) => {\n const key = error.path.join('.');\n\n if (!acc[key]) {\n acc[key] = { message: error.message, type: error.type };\n }\n\n if (validateAllFieldCriteria) {\n const types = acc[key].types;\n const messages = types && types[error.type];\n\n acc[key] = appendErrors(\n key,\n validateAllFieldCriteria,\n acc,\n error.type,\n messages\n ? ([] as string[]).concat(\n messages as string[],\n error.message,\n )\n : error.message,\n ) as FieldError;\n }\n\n return acc;\n },\n Object.create(null) as Record<string, FieldError>,\n );\n\n return { errors: toNestErrors(errors, options), values: {} };\n },\n onSuccess: (result) => {\n options.shouldUseNativeValidation &&\n validateFieldsNatively({}, options);\n\n return { errors: {}, values: result };\n },\n }),\n Effect.runPromise,\n );\n}\n"],"names":["formatIssue","SchemaIssue","makeFormatterStandardSchemaV1","flattenIssue","issue","path","_tag","concat","issues","length","flatMap","map","error","message","type","schema","schemaOptions","errors","onExcessProperty","values","_","options","Schema","decodeUnknownEffect","pipe","Effect","match","onFailure","_ref","validateAllFieldCriteria","shouldUseNativeValidation","criteriaMode","reduce","acc","key","join","types","messages","appendErrors","Object","create","toNestErrors","onSuccess","result","validateFieldsNatively","runPromise"],"mappings":"sFAYMA,EAAcC,EAAWA,YAACC,gCAI1BC,EAAe,SACnBC,EACAC,GAEA,OAAQD,EAAME,MACZ,IAAK,UACH,OAAOH,EAAaC,EAAMA,MAAK,GAAAG,OAAMF,EAASD,EAAMC,OACtD,IAAK,WACH,OAAOF,EAAaC,EAAMA,MAAOC,GACnC,IAAK,YACL,IAAK,QACH,GAAID,EAAMI,OAAOC,OACf,OAAOL,EAAMI,OAAOE,QAAQ,SAACN,GAAK,OAAKD,EAAaC,EAAOC,EAAK,GAItE,OAAOL,EAAYI,GAAOI,OAAOG,IAAI,SAACC,GAAW,MAAA,CAC/CP,KAAI,GAAAE,OAAMF,EAAUO,EAAMP,MAAQ,IAClCQ,QAASD,EAAMC,QACfC,KAAMV,EAAME,KACb,EACH,2BAmCgB,SACdS,EACAC,GAEA,YAF8B,IAA9BA,IAAAA,EAA8B,CAAEC,OAAQ,MAAOC,iBAAkB,WAE1D,SAACC,EAAQC,EAAGC,GACjB,OAAAC,EAAMA,OAACC,oBAAoBR,EAA3BO,CAAmCH,EAAQH,GAAeQ,KACxDC,EAAAA,OAAOC,MAAM,CACXC,UAAW,SAAFC,GAAgB,IACjBC,GACHR,EAAQS,2BACgB,QAAzBT,EAAQU,aAMJd,EAASd,EATEyB,EAALxB,MASuB,IAAI4B,OACrC,SAACC,EAAKrB,GACJ,IAAMsB,EAAMtB,EAAMP,KAAK8B,KAAK,KAM5B,GAJKF,EAAIC,KACPD,EAAIC,GAAO,CAAErB,QAASD,EAAMC,QAASC,KAAMF,EAAME,OAG/Ce,EAA0B,CAC5B,IAAMO,EAAQH,EAAIC,GAAKE,MACjBC,EAAWD,GAASA,EAAMxB,EAAME,MAEtCmB,EAAIC,GAAOI,eACTJ,EACAL,EACAI,EACArB,EAAME,KACNuB,EACK,GAAgB9B,OACf8B,EACAzB,EAAMC,SAERD,EAAMC,QAEd,CAEA,OAAOoB,CACT,EACAM,OAAOC,OAAO,OAGhB,MAAO,CAAEvB,OAAQwB,EAAYA,aAACxB,EAAQI,GAAUF,OAAQ,GAC1D,EACAuB,UAAW,SAACC,GAIV,OAHAtB,EAAQS,2BACNc,EAAsBA,uBAAC,GAAIvB,GAEtB,CAAEJ,OAAQ,CAAE,EAAEE,OAAQwB,EAC/B,IAEFlB,SAAOoB,WACR,CACL"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{toNestErrors as
|
|
1
|
+
import{toNestErrors as e,validateFieldsNatively as r}from"@hookform/resolvers";import{SchemaIssue as t,Schema as s,Effect as n}from"effect";import{appendErrors as o}from"react-hook-form";var a=t.makeFormatterStandardSchemaV1(),i=function(e,r){switch(e._tag){case"Pointer":return i(e.issue,[].concat(r,e.path));case"Encoding":return i(e.issue,r);case"Composite":case"AnyOf":if(e.issues.length)return e.issues.flatMap(function(e){return i(e,r)})}return a(e).issues.map(function(t){return{path:[].concat(r,t.path||[]),message:t.message,type:e._tag}})};function u(t,a){return void 0===a&&(a={errors:"all",onExcessProperty:"ignore"}),function(u,c,f){return s.decodeUnknownEffect(t)(u,a).pipe(n.match({onFailure:function(r){var t=!f.shouldUseNativeValidation&&"all"===f.criteriaMode,s=i(r.issue,[]).reduce(function(e,r){var s=r.path.join(".");if(e[s]||(e[s]={message:r.message,type:r.type}),t){var n=e[s].types,a=n&&n[r.type];e[s]=o(s,t,e,r.type,a?[].concat(a,r.message):r.message)}return e},Object.create(null));return{errors:e(s,f),values:{}}},onSuccess:function(e){return f.shouldUseNativeValidation&&r({},f),{errors:{},values:e}}}),n.runPromise)}}export{u as effectTsResolver};
|
|
2
2
|
//# sourceMappingURL=effect-ts.module.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{toNestErrors as e,validateFieldsNatively as
|
|
1
|
+
import{toNestErrors as e,validateFieldsNatively as s}from"@hookform/resolvers";import{SchemaIssue as r,Schema as t,Effect as o}from"effect";import{appendErrors as a}from"react-hook-form";const n=r.makeFormatterStandardSchemaV1(),i=(e,s)=>{switch(e._tag){case"Pointer":return i(e.issue,[...s,...e.path]);case"Encoding":return i(e.issue,s);case"Composite":case"AnyOf":if(e.issues.length)return e.issues.flatMap(e=>i(e,s))}return n(e).issues.map(r=>({path:[...s,...r.path||[]],message:r.message,type:e._tag}))};function c(r,n={errors:"all",onExcessProperty:"ignore"}){return(c,u,m)=>t.decodeUnknownEffect(r)(c,n).pipe(o.match({onFailure:({issue:s})=>{const r=!m.shouldUseNativeValidation&&"all"===m.criteriaMode,t=i(s,[]).reduce((e,s)=>{const t=s.path.join(".");if(e[t]||(e[t]={message:s.message,type:s.type}),r){const o=e[t].types,n=o&&o[s.type];e[t]=a(t,r,e,s.type,n?[].concat(n,s.message):s.message)}return e},Object.create(null));return{errors:e(t,m),values:{}}},onSuccess:e=>(m.shouldUseNativeValidation&&s({},m),{errors:{},values:e})}),o.runPromise)}export{c as effectTsResolver};
|
|
2
2
|
//# sourceMappingURL=effect-ts.modern.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effect-ts.modern.mjs","sources":["../src/effect-ts.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { Effect, Schema
|
|
1
|
+
{"version":3,"file":"effect-ts.modern.mjs","sources":["../src/effect-ts.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { Effect, Schema, SchemaIssue } from 'effect';\nimport type { ParseOptions } from 'effect/SchemaAST';\nimport {\n type FieldError,\n FieldValues,\n Resolver,\n appendErrors,\n} from 'react-hook-form';\n\ntype Issue = { path: PropertyKey[]; message: string; type: string };\n\nconst formatIssue = SchemaIssue.makeFormatterStandardSchemaV1();\n\n// Flattens the issue tree like `makeFormatterStandardSchemaV1` does, but keeps\n// the `_tag` of the failing node so it can be reported as the error `type`.\nconst flattenIssue = (\n issue: SchemaIssue.Issue,\n path: PropertyKey[],\n): Issue[] => {\n switch (issue._tag) {\n case 'Pointer':\n return flattenIssue(issue.issue, [...path, ...issue.path]);\n case 'Encoding':\n return flattenIssue(issue.issue, path);\n case 'Composite':\n case 'AnyOf':\n if (issue.issues.length) {\n return issue.issues.flatMap((issue) => flattenIssue(issue, path));\n }\n }\n\n return formatIssue(issue).issues.map((error) => ({\n path: [...path, ...(error.path || [])] as PropertyKey[],\n message: error.message,\n type: issue._tag,\n }));\n};\n\nexport function effectTsResolver<Input extends FieldValues, Context, Output>(\n schema: Schema.Codec<Output, Input, never, unknown>,\n schemaOptions?: ParseOptions,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function effectTsResolver<Input extends FieldValues, Context, Output>(\n schema: Schema.Codec<Output, Input, never, unknown>,\n schemaOptions: ParseOptions | undefined,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using Effect Schema validation\n * @param {Schema.Codec<Output, Input>} schema - The Effect schema to validate against\n * @param {ParseOptions} [schemaOptions] - Optional Effect Schema parse options\n * @returns {Resolver<Schema.Schema.Type<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = Schema.Struct({\n * name: Schema.String,\n * age: Schema.Number\n * });\n *\n * useForm({\n * resolver: effectTsResolver(schema)\n * });\n */\nexport function effectTsResolver<Input extends FieldValues, Context, Output>(\n schema: Schema.Codec<Output, Input, never, unknown>,\n schemaOptions: ParseOptions = { errors: 'all', onExcessProperty: 'ignore' },\n): Resolver<Input, Context, Output | Input> {\n return (values, _, options) =>\n Schema.decodeUnknownEffect(schema)(values, schemaOptions).pipe(\n Effect.match({\n onFailure: ({ issue }) => {\n const validateAllFieldCriteria =\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all';\n\n // A null-prototype accumulator avoids false-positive hits from\n // inherited members (e.g. `toString`, `constructor`) when a field\n // is named after one of them — a plain `{}` would make `!acc[key]`\n // truthy-skip those paths and silently drop their errors.\n const errors = flattenIssue(issue, []).reduce(\n (acc, error) => {\n const key = error.path.join('.');\n\n if (!acc[key]) {\n acc[key] = { message: error.message, type: error.type };\n }\n\n if (validateAllFieldCriteria) {\n const types = acc[key].types;\n const messages = types && types[error.type];\n\n acc[key] = appendErrors(\n key,\n validateAllFieldCriteria,\n acc,\n error.type,\n messages\n ? ([] as string[]).concat(\n messages as string[],\n error.message,\n )\n : error.message,\n ) as FieldError;\n }\n\n return acc;\n },\n Object.create(null) as Record<string, FieldError>,\n );\n\n return { errors: toNestErrors(errors, options), values: {} };\n },\n onSuccess: (result) => {\n options.shouldUseNativeValidation &&\n validateFieldsNatively({}, options);\n\n return { errors: {}, values: result };\n },\n }),\n Effect.runPromise,\n );\n}\n"],"names":["formatIssue","SchemaIssue","makeFormatterStandardSchemaV1","flattenIssue","issue","path","_tag","issues","length","flatMap","map","error","message","type","effectTsResolver","schema","schemaOptions","errors","onExcessProperty","values","_","options","Schema","decodeUnknownEffect","pipe","Effect","match","onFailure","validateAllFieldCriteria","shouldUseNativeValidation","criteriaMode","reduce","acc","key","join","types","messages","appendErrors","concat","Object","create","toNestErrors","onSuccess","result","validateFieldsNatively","runPromise"],"mappings":"2LAYA,MAAMA,EAAcC,EAAYC,gCAI1BC,EAAeA,CACnBC,EACAC,KAEA,OAAQD,EAAME,MACZ,IAAK,UACH,OAAOH,EAAaC,EAAMA,MAAO,IAAIC,KAASD,EAAMC,OACtD,IAAK,WACH,OAAOF,EAAaC,EAAMA,MAAOC,GACnC,IAAK,YACL,IAAK,QACH,GAAID,EAAMG,OAAOC,OACf,OAAOJ,EAAMG,OAAOE,QAASL,GAAUD,EAAaC,EAAOC,IAIjE,OAAOL,EAAYI,GAAOG,OAAOG,IAAKC,IAAW,CAC/CN,KAAM,IAAIA,KAAUM,EAAMN,MAAQ,IAClCO,QAASD,EAAMC,QACfC,KAAMT,EAAME,OACX,EAoCW,SAAAQ,EACdC,EACAC,EAA8B,CAAEC,OAAQ,MAAOC,iBAAkB,WAEjE,MAAO,CAACC,EAAQC,EAAGC,IACjBC,EAAOC,oBAAoBR,EAA3BO,CAAmCH,EAAQH,GAAeQ,KACxDC,EAAOC,MAAM,CACXC,UAAWA,EAAGvB,YACZ,MAAMwB,GACHP,EAAQQ,2BACgB,QAAzBR,EAAQS,aAMJb,EAASd,EAAaC,EAAO,IAAI2B,OACrC,CAACC,EAAKrB,KACJ,MAAMsB,EAAMtB,EAAMN,KAAK6B,KAAK,KAM5B,GAJKF,EAAIC,KACPD,EAAIC,GAAO,CAAErB,QAASD,EAAMC,QAASC,KAAMF,EAAME,OAG/Ce,EAA0B,CAC5B,MAAMO,EAAQH,EAAIC,GAAKE,MACjBC,EAAWD,GAASA,EAAMxB,EAAME,MAEtCmB,EAAIC,GAAOI,EACTJ,EACAL,EACAI,EACArB,EAAME,KACNuB,EACK,GAAgBE,OACfF,EACAzB,EAAMC,SAERD,EAAMC,QAEd,CAEA,OAAOoB,CAAG,EAEZO,OAAOC,OAAO,OAGhB,MAAO,CAAEvB,OAAQwB,EAAaxB,EAAQI,GAAUF,OAAQ,GAAI,EAE9DuB,UAAYC,IACVtB,EAAQQ,2BACNe,EAAuB,CAAA,EAAIvB,GAEtB,CAAEJ,OAAQ,CAAA,EAAIE,OAAQwB,MAGjClB,EAAOoB,WAEb"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{toNestErrors as
|
|
1
|
+
import{toNestErrors as e,validateFieldsNatively as r}from"@hookform/resolvers";import{SchemaIssue as t,Schema as s,Effect as n}from"effect";import{appendErrors as o}from"react-hook-form";var a=t.makeFormatterStandardSchemaV1(),i=function(e,r){switch(e._tag){case"Pointer":return i(e.issue,[].concat(r,e.path));case"Encoding":return i(e.issue,r);case"Composite":case"AnyOf":if(e.issues.length)return e.issues.flatMap(function(e){return i(e,r)})}return a(e).issues.map(function(t){return{path:[].concat(r,t.path||[]),message:t.message,type:e._tag}})};function u(t,a){return void 0===a&&(a={errors:"all",onExcessProperty:"ignore"}),function(u,c,f){return s.decodeUnknownEffect(t)(u,a).pipe(n.match({onFailure:function(r){var t=!f.shouldUseNativeValidation&&"all"===f.criteriaMode,s=i(r.issue,[]).reduce(function(e,r){var s=r.path.join(".");if(e[s]||(e[s]={message:r.message,type:r.type}),t){var n=e[s].types,a=n&&n[r.type];e[s]=o(s,t,e,r.type,a?[].concat(a,r.message):r.message)}return e},Object.create(null));return{errors:e(s,f),values:{}}},onSuccess:function(e){return f.shouldUseNativeValidation&&r({},f),{errors:{},values:e}}}),n.runPromise)}}export{u as effectTsResolver};
|
|
2
2
|
//# sourceMappingURL=effect-ts.module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effect-ts.module.js","sources":["../src/effect-ts.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { Effect, Schema
|
|
1
|
+
{"version":3,"file":"effect-ts.module.js","sources":["../src/effect-ts.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { Effect, Schema, SchemaIssue } from 'effect';\nimport type { ParseOptions } from 'effect/SchemaAST';\nimport {\n type FieldError,\n FieldValues,\n Resolver,\n appendErrors,\n} from 'react-hook-form';\n\ntype Issue = { path: PropertyKey[]; message: string; type: string };\n\nconst formatIssue = SchemaIssue.makeFormatterStandardSchemaV1();\n\n// Flattens the issue tree like `makeFormatterStandardSchemaV1` does, but keeps\n// the `_tag` of the failing node so it can be reported as the error `type`.\nconst flattenIssue = (\n issue: SchemaIssue.Issue,\n path: PropertyKey[],\n): Issue[] => {\n switch (issue._tag) {\n case 'Pointer':\n return flattenIssue(issue.issue, [...path, ...issue.path]);\n case 'Encoding':\n return flattenIssue(issue.issue, path);\n case 'Composite':\n case 'AnyOf':\n if (issue.issues.length) {\n return issue.issues.flatMap((issue) => flattenIssue(issue, path));\n }\n }\n\n return formatIssue(issue).issues.map((error) => ({\n path: [...path, ...(error.path || [])] as PropertyKey[],\n message: error.message,\n type: issue._tag,\n }));\n};\n\nexport function effectTsResolver<Input extends FieldValues, Context, Output>(\n schema: Schema.Codec<Output, Input, never, unknown>,\n schemaOptions?: ParseOptions,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function effectTsResolver<Input extends FieldValues, Context, Output>(\n schema: Schema.Codec<Output, Input, never, unknown>,\n schemaOptions: ParseOptions | undefined,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using Effect Schema validation\n * @param {Schema.Codec<Output, Input>} schema - The Effect schema to validate against\n * @param {ParseOptions} [schemaOptions] - Optional Effect Schema parse options\n * @returns {Resolver<Schema.Schema.Type<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = Schema.Struct({\n * name: Schema.String,\n * age: Schema.Number\n * });\n *\n * useForm({\n * resolver: effectTsResolver(schema)\n * });\n */\nexport function effectTsResolver<Input extends FieldValues, Context, Output>(\n schema: Schema.Codec<Output, Input, never, unknown>,\n schemaOptions: ParseOptions = { errors: 'all', onExcessProperty: 'ignore' },\n): Resolver<Input, Context, Output | Input> {\n return (values, _, options) =>\n Schema.decodeUnknownEffect(schema)(values, schemaOptions).pipe(\n Effect.match({\n onFailure: ({ issue }) => {\n const validateAllFieldCriteria =\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all';\n\n // A null-prototype accumulator avoids false-positive hits from\n // inherited members (e.g. `toString`, `constructor`) when a field\n // is named after one of them — a plain `{}` would make `!acc[key]`\n // truthy-skip those paths and silently drop their errors.\n const errors = flattenIssue(issue, []).reduce(\n (acc, error) => {\n const key = error.path.join('.');\n\n if (!acc[key]) {\n acc[key] = { message: error.message, type: error.type };\n }\n\n if (validateAllFieldCriteria) {\n const types = acc[key].types;\n const messages = types && types[error.type];\n\n acc[key] = appendErrors(\n key,\n validateAllFieldCriteria,\n acc,\n error.type,\n messages\n ? ([] as string[]).concat(\n messages as string[],\n error.message,\n )\n : error.message,\n ) as FieldError;\n }\n\n return acc;\n },\n Object.create(null) as Record<string, FieldError>,\n );\n\n return { errors: toNestErrors(errors, options), values: {} };\n },\n onSuccess: (result) => {\n options.shouldUseNativeValidation &&\n validateFieldsNatively({}, options);\n\n return { errors: {}, values: result };\n },\n }),\n Effect.runPromise,\n );\n}\n"],"names":["formatIssue","SchemaIssue","makeFormatterStandardSchemaV1","flattenIssue","issue","path","_tag","concat","issues","length","flatMap","map","error","message","type","effectTsResolver","schema","schemaOptions","errors","onExcessProperty","values","_","options","Schema","decodeUnknownEffect","pipe","Effect","match","onFailure","_ref","validateAllFieldCriteria","shouldUseNativeValidation","criteriaMode","reduce","acc","key","join","types","messages","appendErrors","Object","create","toNestErrors","onSuccess","result","validateFieldsNatively","runPromise"],"mappings":"2LAYA,IAAMA,EAAcC,EAAYC,gCAI1BC,EAAe,SACnBC,EACAC,GAEA,OAAQD,EAAME,MACZ,IAAK,UACH,OAAOH,EAAaC,EAAMA,MAAK,GAAAG,OAAMF,EAASD,EAAMC,OACtD,IAAK,WACH,OAAOF,EAAaC,EAAMA,MAAOC,GACnC,IAAK,YACL,IAAK,QACH,GAAID,EAAMI,OAAOC,OACf,OAAOL,EAAMI,OAAOE,QAAQ,SAACN,GAAK,OAAKD,EAAaC,EAAOC,EAAK,GAItE,OAAOL,EAAYI,GAAOI,OAAOG,IAAI,SAACC,GAAW,MAAA,CAC/CP,KAAI,GAAAE,OAAMF,EAAUO,EAAMP,MAAQ,IAClCQ,QAASD,EAAMC,QACfC,KAAMV,EAAME,KACb,EACH,EAmCgB,SAAAS,EACdC,EACAC,GAEA,YAF8B,IAA9BA,IAAAA,EAA8B,CAAEC,OAAQ,MAAOC,iBAAkB,WAE1D,SAACC,EAAQC,EAAGC,GACjB,OAAAC,EAAOC,oBAAoBR,EAA3BO,CAAmCH,EAAQH,GAAeQ,KACxDC,EAAOC,MAAM,CACXC,UAAW,SAAFC,GAAgB,IACjBC,GACHR,EAAQS,2BACgB,QAAzBT,EAAQU,aAMJd,EAASf,EATE0B,EAALzB,MASuB,IAAI6B,OACrC,SAACC,EAAKtB,GACJ,IAAMuB,EAAMvB,EAAMP,KAAK+B,KAAK,KAM5B,GAJKF,EAAIC,KACPD,EAAIC,GAAO,CAAEtB,QAASD,EAAMC,QAASC,KAAMF,EAAME,OAG/CgB,EAA0B,CAC5B,IAAMO,EAAQH,EAAIC,GAAKE,MACjBC,EAAWD,GAASA,EAAMzB,EAAME,MAEtCoB,EAAIC,GAAOI,EACTJ,EACAL,EACAI,EACAtB,EAAME,KACNwB,EACK,GAAgB/B,OACf+B,EACA1B,EAAMC,SAERD,EAAMC,QAEd,CAEA,OAAOqB,CACT,EACAM,OAAOC,OAAO,OAGhB,MAAO,CAAEvB,OAAQwB,EAAaxB,EAAQI,GAAUF,OAAQ,GAC1D,EACAuB,UAAW,SAACC,GAIV,OAHAtB,EAAQS,2BACNc,EAAuB,GAAIvB,GAEtB,CAAEJ,OAAQ,CAAE,EAAEE,OAAQwB,EAC/B,IAEFlB,EAAOoB,WACR,CACL"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@hookform/resolvers"),require("effect"),require("
|
|
1
|
+
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@hookform/resolvers"),require("effect"),require("react-hook-form")):"function"==typeof define&&define.amd?define(["exports","@hookform/resolvers","effect","react-hook-form"],r):r((e||self).hookformResolversEffectTs={},e.hookformResolvers,e.Effect,e.ReactHookForm)}(this,function(e,r,t,o){var s=t.SchemaIssue.makeFormatterStandardSchemaV1(),n=function(e,r){switch(e._tag){case"Pointer":return n(e.issue,[].concat(r,e.path));case"Encoding":return n(e.issue,r);case"Composite":case"AnyOf":if(e.issues.length)return e.issues.flatMap(function(e){return n(e,r)})}return s(e).issues.map(function(t){return{path:[].concat(r,t.path||[]),message:t.message,type:e._tag}})};e.effectTsResolver=function(e,s){return void 0===s&&(s={errors:"all",onExcessProperty:"ignore"}),function(a,i,c){return t.Schema.decodeUnknownEffect(e)(a,s).pipe(t.Effect.match({onFailure:function(e){var t=!c.shouldUseNativeValidation&&"all"===c.criteriaMode,s=n(e.issue,[]).reduce(function(e,r){var s=r.path.join(".");if(e[s]||(e[s]={message:r.message,type:r.type}),t){var n=e[s].types,a=n&&n[r.type];e[s]=o.appendErrors(s,t,e,r.type,a?[].concat(a,r.message):r.message)}return e},Object.create(null));return{errors:r.toNestErrors(s,c),values:{}}},onSuccess:function(e){return c.shouldUseNativeValidation&&r.validateFieldsNatively({},c),{errors:{},values:e}}}),t.Effect.runPromise)}}});
|
|
2
2
|
//# sourceMappingURL=effect-ts.umd.js.map
|