@hookform/resolvers 5.6.0 → 5.7.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 +4 -10
- package/package.json +4 -4
- package/vine/dist/vine.js.map +1 -1
- package/vine/dist/vine.modern.mjs.map +1 -1
- package/vine/dist/vine.module.js.map +1 -1
- package/vine/dist/vine.umd.js.map +1 -1
- package/vine/package.json +1 -1
- package/vine/src/__tests__/Form-native-validation.tsx +4 -6
- package/vine/src/__tests__/Form.tsx +4 -6
- package/vine/src/__tests__/__fixtures__/data.ts +26 -28
- package/vine/src/__tests__/vine.ts +13 -19
- package/vine/src/vine.ts +4 -6
package/README.md
CHANGED
|
@@ -842,12 +842,10 @@ import { useForm } from 'react-hook-form';
|
|
|
842
842
|
import { vineResolver } from '@hookform/resolvers/vine';
|
|
843
843
|
import vine from '@vinejs/vine';
|
|
844
844
|
|
|
845
|
-
const schema = vine.
|
|
846
|
-
vine.
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
}),
|
|
850
|
-
);
|
|
845
|
+
const schema = vine.create({
|
|
846
|
+
username: vine.string().minLength(1),
|
|
847
|
+
password: vine.string().minLength(1),
|
|
848
|
+
});
|
|
851
849
|
|
|
852
850
|
const App = () => {
|
|
853
851
|
const {
|
|
@@ -1038,7 +1036,3 @@ Thanks go to all our backers! [[Become a backer](https://opencollective.com/reac
|
|
|
1038
1036
|
## Contributors
|
|
1039
1037
|
|
|
1040
1038
|
Thanks go to these wonderful people! [[Become a contributor](CONTRIBUTING.md)].
|
|
1041
|
-
|
|
1042
|
-
<a href="https://github.com/react-hook-form/react-hook-form/graphs/contributors">
|
|
1043
|
-
<img src="https://opencollective.com/react-hook-form/contributors.svg?width=950" alt="React Hook Form contributors" />
|
|
1044
|
-
</a>
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hookform/resolvers",
|
|
3
3
|
"amdName": "hookformResolvers",
|
|
4
|
-
"version": "5.
|
|
4
|
+
"version": "5.7.0",
|
|
5
5
|
"description": "React Hook Form validation resolvers: Yup, Joi, Superstruct, Zod, Vest, Class Validator, io-ts, Nope, computed-types, TypeBox, arktype, Typanion, Effect-TS and VineJS",
|
|
6
6
|
"main": "dist/resolvers.js",
|
|
7
7
|
"module": "dist/resolvers.module.js",
|
|
@@ -288,13 +288,13 @@
|
|
|
288
288
|
"@typeschema/core": "^0.14.0",
|
|
289
289
|
"@typeschema/main": "^0.14.1",
|
|
290
290
|
"@typeschema/zod": "^0.14.0",
|
|
291
|
-
"@vinejs/vine": "^
|
|
291
|
+
"@vinejs/vine": "^4.4.0",
|
|
292
292
|
"@vitejs/plugin-react": "^4.7.0",
|
|
293
293
|
"ajv": "^8.20.0",
|
|
294
|
-
"ata-validator": "^0.7.3",
|
|
295
294
|
"ajv-errors": "^3.0.0",
|
|
296
295
|
"ajv-formats": "^2.1.1",
|
|
297
296
|
"arktype": "2.0.4",
|
|
297
|
+
"ata-validator": "^0.7.3",
|
|
298
298
|
"check-export-map": "^1.3.1",
|
|
299
299
|
"class-transformer": "^0.5.1",
|
|
300
300
|
"class-validator": "^0.14.4",
|
|
@@ -332,7 +332,7 @@
|
|
|
332
332
|
"@sinclair/typebox": ">=0.25.24",
|
|
333
333
|
"@standard-schema/spec": "^1.0.0",
|
|
334
334
|
"@typeschema/main": ">=0.13.7",
|
|
335
|
-
"@vinejs/vine": "^2.0.0 || ^3.0.0",
|
|
335
|
+
"@vinejs/vine": "^2.0.0 || ^3.0.0 || ^4.0.0",
|
|
336
336
|
"ajv": "^8.12.0",
|
|
337
337
|
"ajv-errors": "^3.0.0",
|
|
338
338
|
"ajv-formats": "^2.1.1",
|
package/vine/dist/vine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vine.js","sources":["../src/vine.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { SimpleErrorReporter, VineValidator, errors } from '@vinejs/vine';\nimport {\n ConstructableSchema,\n ValidationOptions,\n} from '@vinejs/vine/build/src/types';\nimport {\n FieldError,\n FieldValues,\n Resolver,\n appendErrors,\n} from 'react-hook-form';\n\nfunction parseErrorSchema(\n vineErrors: SimpleErrorReporter['errors'],\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 `path in schemaErrors` true for\n // those paths and silently drop their errors.\n const schemaErrors: Record<string, FieldError> = Object.create(null);\n\n for (; vineErrors.length; ) {\n const error = vineErrors[0];\n const path = error.field;\n\n if (!(path in schemaErrors)) {\n schemaErrors[path] = { message: error.message, type: error.rule };\n }\n\n if (validateAllFieldCriteria) {\n const { types } = schemaErrors[path];\n const messages = types && types[error.rule];\n\n schemaErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n schemaErrors,\n error.rule,\n messages ? [...(messages as string[]), error.message] : error.message,\n ) as FieldError;\n }\n\n vineErrors.shift();\n }\n\n return schemaErrors;\n}\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions: ValidationOptions<any> | undefined,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using VineJS schema validation\n * @param {T} schema - The VineJS schema to validate against\n * @param {ValidationOptions<any>} [schemaOptions] - Optional VineJS validation options\n * @param {Object} [resolverOptions] - Optional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values instead of validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = vine.
|
|
1
|
+
{"version":3,"file":"vine.js","sources":["../src/vine.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { SimpleErrorReporter, VineValidator, errors } from '@vinejs/vine';\nimport {\n ConstructableSchema,\n ValidationOptions,\n} from '@vinejs/vine/build/src/types';\nimport {\n FieldError,\n FieldValues,\n Resolver,\n appendErrors,\n} from 'react-hook-form';\n\nfunction parseErrorSchema(\n vineErrors: SimpleErrorReporter['errors'],\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 `path in schemaErrors` true for\n // those paths and silently drop their errors.\n const schemaErrors: Record<string, FieldError> = Object.create(null);\n\n for (; vineErrors.length; ) {\n const error = vineErrors[0];\n const path = error.field;\n\n if (!(path in schemaErrors)) {\n schemaErrors[path] = { message: error.message, type: error.rule };\n }\n\n if (validateAllFieldCriteria) {\n const { types } = schemaErrors[path];\n const messages = types && types[error.rule];\n\n schemaErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n schemaErrors,\n error.rule,\n messages ? [...(messages as string[]), error.message] : error.message,\n ) as FieldError;\n }\n\n vineErrors.shift();\n }\n\n return schemaErrors;\n}\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions: ValidationOptions<any> | undefined,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using VineJS schema validation\n * @param {T} schema - The VineJS schema to validate against\n * @param {ValidationOptions<any>} [schemaOptions] - Optional VineJS validation options\n * @param {Object} [resolverOptions] - Optional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values instead of validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = vine.create({\n * name: vine.string().minLength(2),\n * age: vine.number().min(18)\n * });\n *\n * useForm({\n * resolver: vineResolver(schema)\n * });\n */\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions: { raw?: boolean } = {},\n): Resolver<Input, Context, Output | Input> {\n return async (values, _, options) => {\n try {\n const data = await schema.validate(values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {},\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n };\n } catch (error: any) {\n if (error instanceof errors.E_VALIDATION_ERROR) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.messages,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n}\n"],"names":["parseErrorSchema","vineErrors","validateAllFieldCriteria","schemaErrors","Object","create","length","error","path","field","message","type","rule","types","messages","appendErrors","concat","shift","schema","schemaOptions","resolverOptions","values","_","options","Promise","resolve","validate","then","data","shouldUseNativeValidation","validateFieldsNatively","errors","raw","assign","_catch","E_VALIDATION_ERROR","toNestErrors","criteriaMode","e","reject"],"mappings":"4FAaA,SAASA,EACPC,EACAC,GAQA,IAFA,IAAMC,EAA2CC,OAAOC,OAAO,MAExDJ,EAAWK,QAAU,CAC1B,IAAMC,EAAQN,EAAW,GACnBO,EAAOD,EAAME,MAMnB,GAJMD,KAAQL,IACZA,EAAaK,GAAQ,CAAEE,QAASH,EAAMG,QAASC,KAAMJ,EAAMK,OAGzDV,EAA0B,CAC5B,IAAQW,EAAUV,EAAaK,GAAvBK,MACFC,EAAWD,GAASA,EAAMN,EAAMK,MAEtCT,EAAaK,GAAQO,EAAAA,aACnBP,EACAN,EACAC,EACAI,EAAMK,KACNE,KAAQE,OAAQF,EAAuBP,CAAAA,EAAMG,UAAWH,EAAMG,QAElE,CAEAT,EAAWgB,OACb,CAEA,OAAOd,CACT,sBAqCM,SACJe,EACAC,EACAC,GAEA,gBAFAA,IAAAA,EAAqC,CAAA,YAEvBC,EAAQC,EAAGC,OAAWC,OAAAA,QAAAC,gCAC9BD,QAAAC,QACiBP,EAAOQ,SAASL,EAAQF,IAAcQ,KAAA,SAAnDC,GAIN,OAFAL,EAAQM,2BAA6BC,EAAsBA,uBAAC,GAAIP,GAEzD,CACLQ,OAAQ,CAAE,EACVV,OAAQD,EAAgBY,IAAM5B,OAAO6B,OAAO,CAAA,EAAIZ,GAAUO,EAC1D,4DAT8BM,CAC9B,EASK3B,SAAAA,GACP,GAAIA,aAAiBwB,EAAMA,OAACI,mBAC1B,MAAO,CACLd,OAAQ,CAAE,EACVU,OAAQK,EAAAA,aACNpC,EACEO,EAAMO,UACLS,EAAQM,2BACkB,QAAzBN,EAAQc,cAEZd,IAKN,MAAMhB,CACR,GACF,CAAC,MAAA+B,GAAAd,OAAAA,QAAAe,OAAAD,EACH,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vine.modern.mjs","sources":["../src/vine.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { SimpleErrorReporter, VineValidator, errors } from '@vinejs/vine';\nimport {\n ConstructableSchema,\n ValidationOptions,\n} from '@vinejs/vine/build/src/types';\nimport {\n FieldError,\n FieldValues,\n Resolver,\n appendErrors,\n} from 'react-hook-form';\n\nfunction parseErrorSchema(\n vineErrors: SimpleErrorReporter['errors'],\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 `path in schemaErrors` true for\n // those paths and silently drop their errors.\n const schemaErrors: Record<string, FieldError> = Object.create(null);\n\n for (; vineErrors.length; ) {\n const error = vineErrors[0];\n const path = error.field;\n\n if (!(path in schemaErrors)) {\n schemaErrors[path] = { message: error.message, type: error.rule };\n }\n\n if (validateAllFieldCriteria) {\n const { types } = schemaErrors[path];\n const messages = types && types[error.rule];\n\n schemaErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n schemaErrors,\n error.rule,\n messages ? [...(messages as string[]), error.message] : error.message,\n ) as FieldError;\n }\n\n vineErrors.shift();\n }\n\n return schemaErrors;\n}\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions: ValidationOptions<any> | undefined,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using VineJS schema validation\n * @param {T} schema - The VineJS schema to validate against\n * @param {ValidationOptions<any>} [schemaOptions] - Optional VineJS validation options\n * @param {Object} [resolverOptions] - Optional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values instead of validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = vine.
|
|
1
|
+
{"version":3,"file":"vine.modern.mjs","sources":["../src/vine.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { SimpleErrorReporter, VineValidator, errors } from '@vinejs/vine';\nimport {\n ConstructableSchema,\n ValidationOptions,\n} from '@vinejs/vine/build/src/types';\nimport {\n FieldError,\n FieldValues,\n Resolver,\n appendErrors,\n} from 'react-hook-form';\n\nfunction parseErrorSchema(\n vineErrors: SimpleErrorReporter['errors'],\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 `path in schemaErrors` true for\n // those paths and silently drop their errors.\n const schemaErrors: Record<string, FieldError> = Object.create(null);\n\n for (; vineErrors.length; ) {\n const error = vineErrors[0];\n const path = error.field;\n\n if (!(path in schemaErrors)) {\n schemaErrors[path] = { message: error.message, type: error.rule };\n }\n\n if (validateAllFieldCriteria) {\n const { types } = schemaErrors[path];\n const messages = types && types[error.rule];\n\n schemaErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n schemaErrors,\n error.rule,\n messages ? [...(messages as string[]), error.message] : error.message,\n ) as FieldError;\n }\n\n vineErrors.shift();\n }\n\n return schemaErrors;\n}\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions: ValidationOptions<any> | undefined,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using VineJS schema validation\n * @param {T} schema - The VineJS schema to validate against\n * @param {ValidationOptions<any>} [schemaOptions] - Optional VineJS validation options\n * @param {Object} [resolverOptions] - Optional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values instead of validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = vine.create({\n * name: vine.string().minLength(2),\n * age: vine.number().min(18)\n * });\n *\n * useForm({\n * resolver: vineResolver(schema)\n * });\n */\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions: { raw?: boolean } = {},\n): Resolver<Input, Context, Output | Input> {\n return async (values, _, options) => {\n try {\n const data = await schema.validate(values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {},\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n };\n } catch (error: any) {\n if (error instanceof errors.E_VALIDATION_ERROR) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.messages,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n}\n"],"names":["parseErrorSchema","vineErrors","validateAllFieldCriteria","schemaErrors","Object","create","length","error","path","field","message","type","rule","types","messages","appendErrors","shift","vineResolver","schema","schemaOptions","resolverOptions","values","_","options","data","validate","shouldUseNativeValidation","validateFieldsNatively","errors","raw","assign","E_VALIDATION_ERROR","toNestErrors","criteriaMode"],"mappings":"oKAaA,SAASA,EACPC,EACAC,GAMA,MAAMC,EAA2CC,OAAOC,OAAO,MAE/D,KAAOJ,EAAWK,QAAU,CAC1B,MAAMC,EAAQN,EAAW,GACnBO,EAAOD,EAAME,MAMnB,GAJMD,KAAQL,IACZA,EAAaK,GAAQ,CAAEE,QAASH,EAAMG,QAASC,KAAMJ,EAAMK,OAGzDV,EAA0B,CAC5B,MAAMW,MAAEA,GAAUV,EAAaK,GACzBM,EAAWD,GAASA,EAAMN,EAAMK,MAEtCT,EAAaK,GAAQO,EACnBP,EACAN,EACAC,EACAI,EAAMK,KACNE,EAAW,IAAKA,EAAuBP,EAAMG,SAAWH,EAAMG,QAElE,CAEAT,EAAWe,OACb,CAEA,OAAOb,CACT,UAqCgBc,EACdC,EACAC,EACAC,EAAqC,CAAE,GAEvC,OAAcC,MAAAA,EAAQC,EAAGC,KACvB,IACE,MAAMC,QAAaN,EAAOO,SAASJ,EAAQF,GAI3C,OAFAI,EAAQG,2BAA6BC,EAAuB,CAAA,EAAIJ,GAEzD,CACLK,OAAQ,CAAE,EACVP,OAAQD,EAAgBS,IAAMzB,OAAO0B,OAAO,CAAA,EAAIT,GAAUG,EAE9D,CAAE,MAAOjB,GACP,GAAIA,aAAiBqB,EAAOG,mBAC1B,MAAO,CACLV,OAAQ,GACRO,OAAQI,EACNhC,EACEO,EAAMO,UACLS,EAAQG,2BACkB,QAAzBH,EAAQU,cAEZV,IAKN,MAAMhB,CACR,EAEJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vine.module.js","sources":["../src/vine.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { SimpleErrorReporter, VineValidator, errors } from '@vinejs/vine';\nimport {\n ConstructableSchema,\n ValidationOptions,\n} from '@vinejs/vine/build/src/types';\nimport {\n FieldError,\n FieldValues,\n Resolver,\n appendErrors,\n} from 'react-hook-form';\n\nfunction parseErrorSchema(\n vineErrors: SimpleErrorReporter['errors'],\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 `path in schemaErrors` true for\n // those paths and silently drop their errors.\n const schemaErrors: Record<string, FieldError> = Object.create(null);\n\n for (; vineErrors.length; ) {\n const error = vineErrors[0];\n const path = error.field;\n\n if (!(path in schemaErrors)) {\n schemaErrors[path] = { message: error.message, type: error.rule };\n }\n\n if (validateAllFieldCriteria) {\n const { types } = schemaErrors[path];\n const messages = types && types[error.rule];\n\n schemaErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n schemaErrors,\n error.rule,\n messages ? [...(messages as string[]), error.message] : error.message,\n ) as FieldError;\n }\n\n vineErrors.shift();\n }\n\n return schemaErrors;\n}\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions: ValidationOptions<any> | undefined,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using VineJS schema validation\n * @param {T} schema - The VineJS schema to validate against\n * @param {ValidationOptions<any>} [schemaOptions] - Optional VineJS validation options\n * @param {Object} [resolverOptions] - Optional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values instead of validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = vine.
|
|
1
|
+
{"version":3,"file":"vine.module.js","sources":["../src/vine.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { SimpleErrorReporter, VineValidator, errors } from '@vinejs/vine';\nimport {\n ConstructableSchema,\n ValidationOptions,\n} from '@vinejs/vine/build/src/types';\nimport {\n FieldError,\n FieldValues,\n Resolver,\n appendErrors,\n} from 'react-hook-form';\n\nfunction parseErrorSchema(\n vineErrors: SimpleErrorReporter['errors'],\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 `path in schemaErrors` true for\n // those paths and silently drop their errors.\n const schemaErrors: Record<string, FieldError> = Object.create(null);\n\n for (; vineErrors.length; ) {\n const error = vineErrors[0];\n const path = error.field;\n\n if (!(path in schemaErrors)) {\n schemaErrors[path] = { message: error.message, type: error.rule };\n }\n\n if (validateAllFieldCriteria) {\n const { types } = schemaErrors[path];\n const messages = types && types[error.rule];\n\n schemaErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n schemaErrors,\n error.rule,\n messages ? [...(messages as string[]), error.message] : error.message,\n ) as FieldError;\n }\n\n vineErrors.shift();\n }\n\n return schemaErrors;\n}\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions: ValidationOptions<any> | undefined,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using VineJS schema validation\n * @param {T} schema - The VineJS schema to validate against\n * @param {ValidationOptions<any>} [schemaOptions] - Optional VineJS validation options\n * @param {Object} [resolverOptions] - Optional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values instead of validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = vine.create({\n * name: vine.string().minLength(2),\n * age: vine.number().min(18)\n * });\n *\n * useForm({\n * resolver: vineResolver(schema)\n * });\n */\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions: { raw?: boolean } = {},\n): Resolver<Input, Context, Output | Input> {\n return async (values, _, options) => {\n try {\n const data = await schema.validate(values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {},\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n };\n } catch (error: any) {\n if (error instanceof errors.E_VALIDATION_ERROR) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.messages,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n}\n"],"names":["parseErrorSchema","vineErrors","validateAllFieldCriteria","schemaErrors","Object","create","length","error","path","field","message","type","rule","types","messages","appendErrors","concat","shift","vineResolver","schema","schemaOptions","resolverOptions","values","_","options","Promise","resolve","validate","then","data","shouldUseNativeValidation","validateFieldsNatively","errors","raw","assign","_catch","E_VALIDATION_ERROR","toNestErrors","criteriaMode","e","reject"],"mappings":"oKAaA,SAASA,EACPC,EACAC,GAQA,IAFA,IAAMC,EAA2CC,OAAOC,OAAO,MAExDJ,EAAWK,QAAU,CAC1B,IAAMC,EAAQN,EAAW,GACnBO,EAAOD,EAAME,MAMnB,GAJMD,KAAQL,IACZA,EAAaK,GAAQ,CAAEE,QAASH,EAAMG,QAASC,KAAMJ,EAAMK,OAGzDV,EAA0B,CAC5B,IAAQW,EAAUV,EAAaK,GAAvBK,MACFC,EAAWD,GAASA,EAAMN,EAAMK,MAEtCT,EAAaK,GAAQO,EACnBP,EACAN,EACAC,EACAI,EAAMK,KACNE,KAAQE,OAAQF,EAAuBP,CAAAA,EAAMG,UAAWH,EAAMG,QAElE,CAEAT,EAAWgB,OACb,CAEA,OAAOd,CACT,CAqCM,SAAUe,EACdC,EACAC,EACAC,GAEA,gBAFAA,IAAAA,EAAqC,CAAA,YAEvBC,EAAQC,EAAGC,OAAWC,OAAAA,QAAAC,gCAC9BD,QAAAC,QACiBP,EAAOQ,SAASL,EAAQF,IAAcQ,KAAA,SAAnDC,GAIN,OAFAL,EAAQM,2BAA6BC,EAAuB,GAAIP,GAEzD,CACLQ,OAAQ,CAAE,EACVV,OAAQD,EAAgBY,IAAM7B,OAAO8B,OAAO,CAAA,EAAIZ,GAAUO,EAC1D,4DAT8BM,CAC9B,EASK5B,SAAAA,GACP,GAAIA,aAAiByB,EAAOI,mBAC1B,MAAO,CACLd,OAAQ,CAAE,EACVU,OAAQK,EACNrC,EACEO,EAAMO,UACLU,EAAQM,2BACkB,QAAzBN,EAAQc,cAEZd,IAKN,MAAMjB,CACR,GACF,CAAC,MAAAgC,GAAAd,OAAAA,QAAAe,OAAAD,EACH,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vine.umd.js","sources":["../src/vine.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { SimpleErrorReporter, VineValidator, errors } from '@vinejs/vine';\nimport {\n ConstructableSchema,\n ValidationOptions,\n} from '@vinejs/vine/build/src/types';\nimport {\n FieldError,\n FieldValues,\n Resolver,\n appendErrors,\n} from 'react-hook-form';\n\nfunction parseErrorSchema(\n vineErrors: SimpleErrorReporter['errors'],\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 `path in schemaErrors` true for\n // those paths and silently drop their errors.\n const schemaErrors: Record<string, FieldError> = Object.create(null);\n\n for (; vineErrors.length; ) {\n const error = vineErrors[0];\n const path = error.field;\n\n if (!(path in schemaErrors)) {\n schemaErrors[path] = { message: error.message, type: error.rule };\n }\n\n if (validateAllFieldCriteria) {\n const { types } = schemaErrors[path];\n const messages = types && types[error.rule];\n\n schemaErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n schemaErrors,\n error.rule,\n messages ? [...(messages as string[]), error.message] : error.message,\n ) as FieldError;\n }\n\n vineErrors.shift();\n }\n\n return schemaErrors;\n}\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions: ValidationOptions<any> | undefined,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using VineJS schema validation\n * @param {T} schema - The VineJS schema to validate against\n * @param {ValidationOptions<any>} [schemaOptions] - Optional VineJS validation options\n * @param {Object} [resolverOptions] - Optional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values instead of validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = vine.
|
|
1
|
+
{"version":3,"file":"vine.umd.js","sources":["../src/vine.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { SimpleErrorReporter, VineValidator, errors } from '@vinejs/vine';\nimport {\n ConstructableSchema,\n ValidationOptions,\n} from '@vinejs/vine/build/src/types';\nimport {\n FieldError,\n FieldValues,\n Resolver,\n appendErrors,\n} from 'react-hook-form';\n\nfunction parseErrorSchema(\n vineErrors: SimpleErrorReporter['errors'],\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 `path in schemaErrors` true for\n // those paths and silently drop their errors.\n const schemaErrors: Record<string, FieldError> = Object.create(null);\n\n for (; vineErrors.length; ) {\n const error = vineErrors[0];\n const path = error.field;\n\n if (!(path in schemaErrors)) {\n schemaErrors[path] = { message: error.message, type: error.rule };\n }\n\n if (validateAllFieldCriteria) {\n const { types } = schemaErrors[path];\n const messages = types && types[error.rule];\n\n schemaErrors[path] = appendErrors(\n path,\n validateAllFieldCriteria,\n schemaErrors,\n error.rule,\n messages ? [...(messages as string[]), error.message] : error.message,\n ) as FieldError;\n }\n\n vineErrors.shift();\n }\n\n return schemaErrors;\n}\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions: ValidationOptions<any> | undefined,\n resolverOptions: {\n mode?: 'async' | 'sync';\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using VineJS schema validation\n * @param {T} schema - The VineJS schema to validate against\n * @param {ValidationOptions<any>} [schemaOptions] - Optional VineJS validation options\n * @param {Object} [resolverOptions] - Optional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values instead of validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = vine.create({\n * name: vine.string().minLength(2),\n * age: vine.number().min(18)\n * });\n *\n * useForm({\n * resolver: vineResolver(schema)\n * });\n */\nexport function vineResolver<Input extends FieldValues, Context, Output>(\n schema: VineValidator<ConstructableSchema<Input, Output, Output>, any>,\n schemaOptions?: ValidationOptions<any>,\n resolverOptions: { raw?: boolean } = {},\n): Resolver<Input, Context, Output | Input> {\n return async (values, _, options) => {\n try {\n const data = await schema.validate(values, schemaOptions);\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n errors: {},\n values: resolverOptions.raw ? Object.assign({}, values) : data,\n };\n } catch (error: any) {\n if (error instanceof errors.E_VALIDATION_ERROR) {\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n error.messages,\n !options.shouldUseNativeValidation &&\n options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n }\n\n throw error;\n }\n };\n}\n"],"names":["parseErrorSchema","vineErrors","validateAllFieldCriteria","schemaErrors","Object","create","length","error","path","field","message","type","rule","types","messages","appendErrors","concat","shift","schema","schemaOptions","resolverOptions","values","_","options","Promise","resolve","validate","then","data","shouldUseNativeValidation","validateFieldsNatively","errors","raw","assign","_catch","E_VALIDATION_ERROR","toNestErrors","criteriaMode","e","reject"],"mappings":"yaAaA,SAASA,EACPC,EACAC,GAQA,IAFA,IAAMC,EAA2CC,OAAOC,OAAO,MAExDJ,EAAWK,QAAU,CAC1B,IAAMC,EAAQN,EAAW,GACnBO,EAAOD,EAAME,MAMnB,GAJMD,KAAQL,IACZA,EAAaK,GAAQ,CAAEE,QAASH,EAAMG,QAASC,KAAMJ,EAAMK,OAGzDV,EAA0B,CAC5B,IAAQW,EAAUV,EAAaK,GAAvBK,MACFC,EAAWD,GAASA,EAAMN,EAAMK,MAEtCT,EAAaK,GAAQO,EAAAA,aACnBP,EACAN,EACAC,EACAI,EAAMK,KACNE,KAAQE,OAAQF,EAAuBP,CAAAA,EAAMG,UAAWH,EAAMG,QAElE,CAEAT,EAAWgB,OACb,CAEA,OAAOd,CACT,gBAqCM,SACJe,EACAC,EACAC,GAEA,gBAFAA,IAAAA,EAAqC,CAAA,YAEvBC,EAAQC,EAAGC,OAAWC,OAAAA,QAAAC,gCAC9BD,QAAAC,QACiBP,EAAOQ,SAASL,EAAQF,IAAcQ,KAAA,SAAnDC,GAIN,OAFAL,EAAQM,2BAA6BC,EAAsBA,uBAAC,GAAIP,GAEzD,CACLQ,OAAQ,CAAE,EACVV,OAAQD,EAAgBY,IAAM5B,OAAO6B,OAAO,CAAA,EAAIZ,GAAUO,EAC1D,4DAT8BM,CAC9B,EASK3B,SAAAA,GACP,GAAIA,aAAiBwB,EAAMA,OAACI,mBAC1B,MAAO,CACLd,OAAQ,CAAE,EACVU,OAAQK,EAAAA,aACNpC,EACEO,EAAMO,UACLS,EAAQM,2BACkB,QAAzBN,EAAQc,cAEZd,IAKN,MAAMhB,CACR,GACF,CAAC,MAAA+B,GAAAd,OAAAA,QAAAe,OAAAD,EACH,CAAA,CAAA"}
|
package/vine/package.json
CHANGED
|
@@ -6,12 +6,10 @@ import React from 'react';
|
|
|
6
6
|
import { useForm } from 'react-hook-form';
|
|
7
7
|
import { vineResolver } from '..';
|
|
8
8
|
|
|
9
|
-
const schema = vine.
|
|
10
|
-
vine.
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}),
|
|
14
|
-
);
|
|
9
|
+
const schema = vine.create({
|
|
10
|
+
username: vine.string().minLength(1),
|
|
11
|
+
password: vine.string().minLength(1),
|
|
12
|
+
});
|
|
15
13
|
|
|
16
14
|
interface Props {
|
|
17
15
|
onSubmit: (data: Infer<typeof schema>) => void;
|
|
@@ -6,12 +6,10 @@ import React from 'react';
|
|
|
6
6
|
import { useForm } from 'react-hook-form';
|
|
7
7
|
import { vineResolver } from '..';
|
|
8
8
|
|
|
9
|
-
const schema = vine.
|
|
10
|
-
vine.
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}),
|
|
14
|
-
);
|
|
9
|
+
const schema = vine.create({
|
|
10
|
+
username: vine.string().minLength(1),
|
|
11
|
+
password: vine.string().minLength(1),
|
|
12
|
+
});
|
|
15
13
|
|
|
16
14
|
function TestComponent({
|
|
17
15
|
onSubmit,
|
|
@@ -2,34 +2,32 @@ import vine from '@vinejs/vine';
|
|
|
2
2
|
import { InferInput } from '@vinejs/vine/build/src/types';
|
|
3
3
|
import { Field, InternalFieldName } from 'react-hook-form';
|
|
4
4
|
|
|
5
|
-
export const schema = vine.
|
|
6
|
-
vine.
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
vine.
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}),
|
|
32
|
-
);
|
|
5
|
+
export const schema = vine.create({
|
|
6
|
+
username: vine.string().regex(/^\w+$/).minLength(3).maxLength(30),
|
|
7
|
+
password: vine
|
|
8
|
+
.string()
|
|
9
|
+
.regex(new RegExp('.*[A-Z].*'))
|
|
10
|
+
.regex(new RegExp('.*[a-z].*'))
|
|
11
|
+
.regex(new RegExp('.*\\d.*'))
|
|
12
|
+
.regex(new RegExp('.*[`~<>?,./!@#$%^&*()\\-_+="\'|{}\\[\\];:\\\\].*'))
|
|
13
|
+
.minLength(8)
|
|
14
|
+
.confirmed({ as: 'repeatPassword' }),
|
|
15
|
+
repeatPassword: vine.string().sameAs('password'),
|
|
16
|
+
accessToken: vine.unionOfTypes([vine.string(), vine.number()]),
|
|
17
|
+
birthYear: vine.number().min(1900).max(2013),
|
|
18
|
+
email: vine.string().email().optional(),
|
|
19
|
+
tags: vine.array(vine.string()),
|
|
20
|
+
enabled: vine.boolean(),
|
|
21
|
+
like: vine.array(
|
|
22
|
+
vine.object({
|
|
23
|
+
id: vine.number(),
|
|
24
|
+
name: vine.string().fixedLength(4),
|
|
25
|
+
}),
|
|
26
|
+
),
|
|
27
|
+
dateStr: vine
|
|
28
|
+
.string()
|
|
29
|
+
.transform((value: string) => new Date(value).toISOString()),
|
|
30
|
+
});
|
|
33
31
|
|
|
34
32
|
export const validData = {
|
|
35
33
|
username: 'Doe',
|
|
@@ -59,9 +59,8 @@ describe('vineResolver', () => {
|
|
|
59
59
|
* Type inference tests
|
|
60
60
|
*/
|
|
61
61
|
it('should correctly infer the output type from a vine schema', () => {
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
);
|
|
62
|
+
const schema = vine.create({ id: vine.number() });
|
|
63
|
+
const resolver = vineResolver(schema);
|
|
65
64
|
|
|
66
65
|
expectTypeOf(resolver).toEqualTypeOf<
|
|
67
66
|
Resolver<{ id: number | string }, unknown, { id: number }>
|
|
@@ -69,16 +68,13 @@ describe('vineResolver', () => {
|
|
|
69
68
|
});
|
|
70
69
|
|
|
71
70
|
it('should correctly infer the output type from a vine schema using a transform', () => {
|
|
72
|
-
const
|
|
73
|
-
vine
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}),
|
|
80
|
-
),
|
|
81
|
-
);
|
|
71
|
+
const schema = vine.create({
|
|
72
|
+
id: vine
|
|
73
|
+
.number()
|
|
74
|
+
.decimal([2, 4])
|
|
75
|
+
.transform<string>((val: unknown) => String(val)),
|
|
76
|
+
});
|
|
77
|
+
const resolver = vineResolver(schema);
|
|
82
78
|
|
|
83
79
|
expectTypeOf(resolver).toEqualTypeOf<
|
|
84
80
|
Resolver<{ id: number | string }, unknown, { id: string }>
|
|
@@ -86,7 +82,7 @@ describe('vineResolver', () => {
|
|
|
86
82
|
});
|
|
87
83
|
|
|
88
84
|
it('should correctly infer the output type from a vine schema for the handleSubmit function in useForm', () => {
|
|
89
|
-
const schema = vine.
|
|
85
|
+
const schema = vine.create({ id: vine.number() });
|
|
90
86
|
|
|
91
87
|
const {
|
|
92
88
|
result: { current: form },
|
|
@@ -106,11 +102,9 @@ describe('vineResolver', () => {
|
|
|
106
102
|
});
|
|
107
103
|
|
|
108
104
|
it('should correctly infer the output type from a vine schema with a transform for the handleSubmit function in useForm', () => {
|
|
109
|
-
const schema = vine.
|
|
110
|
-
vine.
|
|
111
|
-
|
|
112
|
-
}),
|
|
113
|
-
);
|
|
105
|
+
const schema = vine.create({
|
|
106
|
+
id: vine.number().transform<string>((val: unknown) => String(val)),
|
|
107
|
+
});
|
|
114
108
|
|
|
115
109
|
const {
|
|
116
110
|
result: { current: form },
|
package/vine/src/vine.ts
CHANGED
|
@@ -74,12 +74,10 @@ export function vineResolver<Input extends FieldValues, Context, Output>(
|
|
|
74
74
|
* @param {boolean} [resolverOptions.raw=false] - If true, returns raw values instead of validated results
|
|
75
75
|
* @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form
|
|
76
76
|
* @example
|
|
77
|
-
* const schema = vine.
|
|
78
|
-
* vine.
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
* })
|
|
82
|
-
* );
|
|
77
|
+
* const schema = vine.create({
|
|
78
|
+
* name: vine.string().minLength(2),
|
|
79
|
+
* age: vine.number().min(18)
|
|
80
|
+
* });
|
|
83
81
|
*
|
|
84
82
|
* useForm({
|
|
85
83
|
* resolver: vineResolver(schema)
|