@hookform/resolvers 5.4.2 → 5.5.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/ajv/dist/ajv.js.map +1 -1
- package/ajv/dist/ajv.modern.mjs.map +1 -1
- package/ajv/dist/ajv.module.js.map +1 -1
- package/ajv/dist/ajv.umd.js.map +1 -1
- package/arktype/dist/arktype.js.map +1 -1
- package/arktype/dist/arktype.modern.mjs.map +1 -1
- package/arktype/dist/arktype.module.js.map +1 -1
- package/arktype/dist/arktype.umd.js.map +1 -1
- package/arktype/src/__tests__/__snapshots__/arktype.ts.snap +11 -11
- package/arktype/src/__tests__/arktype.ts +15 -6
- package/ata-validator/dist/ata-validator.js.map +1 -1
- package/ata-validator/dist/ata-validator.modern.mjs.map +1 -1
- package/ata-validator/dist/ata-validator.module.js.map +1 -1
- package/ata-validator/dist/ata-validator.umd.js.map +1 -1
- package/class-validator/dist/class-validator.js.map +1 -1
- package/class-validator/dist/class-validator.modern.mjs.map +1 -1
- package/class-validator/dist/class-validator.module.js.map +1 -1
- package/class-validator/dist/class-validator.umd.js.map +1 -1
- package/computed-types/dist/computed-types.js.map +1 -1
- package/computed-types/dist/computed-types.modern.mjs.map +1 -1
- package/computed-types/dist/computed-types.module.js.map +1 -1
- package/computed-types/dist/computed-types.umd.js.map +1 -1
- package/computed-types/src/__tests__/computed-types.ts +15 -6
- package/dist/resolvers.js.map +1 -1
- package/dist/resolvers.mjs.map +1 -1
- package/dist/resolvers.module.js.map +1 -1
- package/dist/resolvers.umd.js.map +1 -1
- package/effect-ts/dist/effect-ts.js.map +1 -1
- package/effect-ts/dist/effect-ts.modern.mjs.map +1 -1
- package/effect-ts/dist/effect-ts.module.js.map +1 -1
- package/effect-ts/dist/effect-ts.umd.js.map +1 -1
- package/effect-ts/src/__tests__/effect-ts.ts +15 -6
- package/fluentvalidation-ts/dist/fluentvalidation-ts.js.map +1 -1
- package/fluentvalidation-ts/dist/fluentvalidation-ts.modern.mjs.map +1 -1
- package/fluentvalidation-ts/dist/fluentvalidation-ts.module.js.map +1 -1
- package/fluentvalidation-ts/dist/fluentvalidation-ts.umd.js.map +1 -1
- package/io-ts/dist/io-ts.js.map +1 -1
- package/io-ts/dist/io-ts.modern.mjs.map +1 -1
- package/io-ts/dist/io-ts.module.js.map +1 -1
- package/io-ts/dist/io-ts.umd.js.map +1 -1
- package/io-ts/src/__tests__/io-ts.ts +15 -6
- package/joi/dist/joi.js.map +1 -1
- package/joi/dist/joi.modern.mjs.map +1 -1
- package/joi/dist/joi.module.js.map +1 -1
- package/joi/dist/joi.umd.js.map +1 -1
- package/nope/dist/nope.js.map +1 -1
- package/nope/dist/nope.modern.mjs.map +1 -1
- package/nope/dist/nope.module.js.map +1 -1
- package/nope/dist/nope.umd.js.map +1 -1
- package/nope/dist/types.d.ts +2 -1
- package/nope/src/nope.ts +7 -1
- package/nope/src/types.ts +7 -1
- package/package.json +31 -28
- package/standard-schema/dist/standard-schema.js.map +1 -1
- package/standard-schema/dist/standard-schema.modern.mjs.map +1 -1
- package/standard-schema/dist/standard-schema.module.js.map +1 -1
- package/standard-schema/dist/standard-schema.umd.js.map +1 -1
- package/standard-schema/src/__tests__/__snapshots__/standard-schema.ts.snap +31 -0
- package/standard-schema/src/__tests__/standard-schema.ts +21 -13
- package/superstruct/dist/superstruct.d.ts +5 -0
- package/superstruct/dist/superstruct.js.map +1 -1
- package/superstruct/dist/superstruct.modern.mjs.map +1 -1
- package/superstruct/dist/superstruct.module.js.map +1 -1
- package/superstruct/dist/superstruct.umd.js.map +1 -1
- package/superstruct/src/__tests__/superstruct.ts +22 -8
- package/superstruct/src/superstruct.ts +13 -0
- package/typanion/dist/typanion.js.map +1 -1
- package/typanion/dist/typanion.modern.mjs.map +1 -1
- package/typanion/dist/typanion.module.js.map +1 -1
- package/typanion/dist/typanion.umd.js.map +1 -1
- package/typanion/src/__tests__/typanion.ts +8 -3
- package/typebox/dist/typebox.js.map +1 -1
- package/typebox/dist/typebox.modern.mjs.map +1 -1
- package/typebox/dist/typebox.module.js.map +1 -1
- package/typebox/dist/typebox.umd.js.map +1 -1
- package/typebox/src/__tests__/typebox.ts +31 -18
- package/typeschema/dist/typeschema.js +1 -1
- package/typeschema/dist/typeschema.js.map +1 -1
- package/typeschema/dist/typeschema.mjs +1 -1
- package/typeschema/dist/typeschema.modern.mjs +1 -1
- package/typeschema/dist/typeschema.modern.mjs.map +1 -1
- package/typeschema/dist/typeschema.module.js +1 -1
- package/typeschema/dist/typeschema.module.js.map +1 -1
- package/typeschema/dist/typeschema.umd.js +1 -1
- package/typeschema/dist/typeschema.umd.js.map +1 -1
- package/typeschema/src/__tests__/Form-native-validation.tsx +1 -2
- package/typeschema/src/__tests__/Form.tsx +1 -2
- package/typeschema/src/__tests__/typeschema.ts +23 -15
- package/typeschema/src/typeschema.ts +6 -6
- package/valibot/dist/valibot.js.map +1 -1
- package/valibot/dist/valibot.modern.mjs.map +1 -1
- package/valibot/dist/valibot.module.js.map +1 -1
- package/valibot/dist/valibot.umd.js.map +1 -1
- package/valibot/src/__tests__/valibot.ts +15 -6
- package/vest/dist/vest.js.map +1 -1
- package/vest/dist/vest.modern.mjs.map +1 -1
- package/vest/dist/vest.module.js.map +1 -1
- package/vest/dist/vest.umd.js.map +1 -1
- 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/src/__tests__/vine.ts +15 -6
- package/yup/dist/yup.js.map +1 -1
- package/yup/dist/yup.modern.mjs.map +1 -1
- package/yup/dist/yup.module.js.map +1 -1
- package/yup/dist/yup.umd.js.map +1 -1
- package/yup/src/__tests__/yup.ts +15 -6
- package/yup/src/yup.ts +10 -2
- package/zod/dist/zod.js +1 -1
- package/zod/dist/zod.js.map +1 -1
- package/zod/dist/zod.mjs +1 -1
- package/zod/dist/zod.modern.mjs +1 -1
- package/zod/dist/zod.modern.mjs.map +1 -1
- package/zod/dist/zod.module.js +1 -1
- package/zod/dist/zod.module.js.map +1 -1
- package/zod/dist/zod.umd.js +1 -1
- package/zod/dist/zod.umd.js.map +1 -1
- package/zod/src/__tests__/__snapshots__/zod-v3.ts.snap +430 -0
- package/zod/src/__tests__/__snapshots__/zod-v4-mini.ts.snap +472 -0
- package/zod/src/__tests__/__snapshots__/zod-v4.ts.snap +434 -0
- package/zod/src/__tests__/zod-v3.ts +45 -6
- package/zod/src/__tests__/zod-v4-mini.ts +21 -11
- package/zod/src/__tests__/zod-v4.ts +47 -11
- package/zod/src/zod.ts +15 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standard-schema.js","sources":["../src/standard-schema.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { StandardSchemaV1 } from '@standard-schema/spec';\nimport { getDotPath } from '@standard-schema/utils';\nimport { FieldError, FieldValues, Resolver } from 'react-hook-form';\n\nconst schemaRootKey = Symbol('Schema root');\n\nfunction appendErrorMessage(error: FieldError, message: string | undefined) {\n if (!message) {\n return;\n }\n\n error.message = error.message ? `${error.message}\\n${message}` : message;\n}\n\nfunction appendErrorTypes(error: FieldError, types: FieldError['types']) {\n if (!types) {\n return;\n }\n\n const nextTypes = error.types || {};\n\n for (const message of Object.values(types)) {\n nextTypes[Object.keys(nextTypes).length] = message;\n }\n\n error.types = nextTypes;\n}\n\nfunction parseErrorSchema(\n issues: readonly StandardSchemaV1.Issue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors = new Map<string | typeof schemaRootKey, FieldError>();\n\n for (let i = 0; i < issues.length; i++) {\n const error = issues[i];\n const path = getDotPath(error) || schemaRootKey;\n const fieldError = errors.get(path);\n\n if (!fieldError) {\n errors.set(path, { message: error.message, type: '' });\n } else if (path === schemaRootKey) {\n // Root-level issues aren't tied to a single field, so there's no\n // natural \"first\" message to prefer the way there is for a field —\n // keep every one of them regardless of criteriaMode.\n appendErrorMessage(fieldError, error.message);\n }\n\n if (validateAllFieldCriteria) {\n const currentError = errors.get(path)!;\n const types = currentError.types || {};\n\n currentError.types = {\n ...types,\n [Object.keys(types).length]: error.message,\n };\n }\n }\n\n const fieldErrors: Record<string, FieldError> = {};\n\n for (const [path, error] of errors) {\n if (path !== schemaRootKey) {\n fieldErrors[path] = error;\n }\n }\n\n const rootError = errors.get(schemaRootKey);\n\n if (rootError) {\n if (fieldErrors.root) {\n appendErrorMessage(fieldErrors.root, rootError.message);\n appendErrorTypes(fieldErrors.root, rootError.types);\n } else {\n fieldErrors.root = rootError;\n }\n }\n\n return fieldErrors;\n}\n\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions?: never,\n resolverOptions?: {\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions: never | undefined,\n resolverOptions: {\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form that validates data using a Standard Schema.\n *\n * @param {Schema} schema - The Standard Schema to validate against\n * @param {Object} resolverOptions - Options for the resolver\n * @param {boolean} [resolverOptions.raw=false] - Whether to return raw input values instead of parsed values\n * @returns {Resolver} A resolver function compatible with react-hook-form\n *\n * @example\n * ```ts\n * const schema = z.object({\n * name: z.string().min(2),\n * age: z.number().min(18)\n * });\n *\n * useForm({\n * resolver: standardSchemaResolver(schema)\n * });\n * ```\n */\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions?: never,\n resolverOptions: {\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Output | Input> {\n return async (values, _, options) => {\n let result = schema['~standard'].validate(values);\n if (result instanceof Promise) {\n result = await result;\n }\n\n if (result.issues) {\n const errors = parseErrorSchema(\n result.issues,\n !options.shouldUseNativeValidation && options.criteriaMode === 'all',\n );\n\n return {\n values: {},\n errors: toNestErrors(errors, options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result.value,\n errors: {},\n };\n };\n}\n"],"names":["schemaRootKey","Symbol","appendErrorMessage","error","message","schema","_schemaOptions","resolverOptions","values","_","options","_temp2","result","issues","errors","validateAllFieldCriteria","Map","i","length","path","getDotPath","fieldError","get","set","type","_extends2","currentError","types","_extends","Object","keys","_step","fieldErrors","_iterator","_createForOfIteratorHelperLoose","done","_step$value","value","rootError","root","nextTypes","_i","_Object$values","appendErrorTypes","parseErrorSchema","shouldUseNativeValidation","criteriaMode","toNestErrors","validateFieldsNatively","raw","assign","validate","_temp","Promise","resolve","then","_result","e","reject"],"mappings":"uYAKA,IAAMA,EAAgBC,OAAO,eAE7B,SAASC,EAAmBC,EAAmBC,GACxCA,IAILD,EAAMC,QAAUD,EAAMC,QAAaD,EAAMC,
|
|
1
|
+
{"version":3,"file":"standard-schema.js","sources":["../src/standard-schema.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { StandardSchemaV1 } from '@standard-schema/spec';\nimport { getDotPath } from '@standard-schema/utils';\nimport { FieldError, FieldValues, Resolver } from 'react-hook-form';\n\nconst schemaRootKey = Symbol('Schema root');\n\nfunction appendErrorMessage(error: FieldError, message: string | undefined) {\n if (!message) {\n return;\n }\n\n error.message = error.message ? `${error.message}\\n${message}` : message;\n}\n\nfunction appendErrorTypes(error: FieldError, types: FieldError['types']) {\n if (!types) {\n return;\n }\n\n const nextTypes = error.types || {};\n\n for (const message of Object.values(types)) {\n nextTypes[Object.keys(nextTypes).length] = message;\n }\n\n error.types = nextTypes;\n}\n\nfunction parseErrorSchema(\n issues: readonly StandardSchemaV1.Issue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors = new Map<string | typeof schemaRootKey, FieldError>();\n\n for (let i = 0; i < issues.length; i++) {\n const error = issues[i];\n const path = getDotPath(error) || schemaRootKey;\n const fieldError = errors.get(path);\n\n if (!fieldError) {\n errors.set(path, { message: error.message, type: '' });\n } else if (path === schemaRootKey) {\n // Root-level issues aren't tied to a single field, so there's no\n // natural \"first\" message to prefer the way there is for a field —\n // keep every one of them regardless of criteriaMode.\n appendErrorMessage(fieldError, error.message);\n }\n\n if (validateAllFieldCriteria) {\n const currentError = errors.get(path)!;\n const types = currentError.types || {};\n\n currentError.types = {\n ...types,\n [Object.keys(types).length]: error.message,\n };\n }\n }\n\n const fieldErrors: Record<string, FieldError> = {};\n\n for (const [path, error] of errors) {\n if (path !== schemaRootKey) {\n fieldErrors[path] = error;\n }\n }\n\n const rootError = errors.get(schemaRootKey);\n\n if (rootError) {\n if (fieldErrors.root) {\n appendErrorMessage(fieldErrors.root, rootError.message);\n appendErrorTypes(fieldErrors.root, rootError.types);\n } else {\n fieldErrors.root = rootError;\n }\n }\n\n return fieldErrors;\n}\n\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions?: never,\n resolverOptions?: {\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions: never | undefined,\n resolverOptions: {\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form that validates data using a Standard Schema.\n *\n * @param {Schema} schema - The Standard Schema to validate against\n * @param {Object} resolverOptions - Options for the resolver\n * @param {boolean} [resolverOptions.raw=false] - Whether to return raw input values instead of parsed values\n * @returns {Resolver} A resolver function compatible with react-hook-form\n *\n * @example\n * ```ts\n * const schema = z.object({\n * name: z.string().min(2),\n * age: z.number().min(18)\n * });\n *\n * useForm({\n * resolver: standardSchemaResolver(schema)\n * });\n * ```\n */\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions?: never,\n resolverOptions: {\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Output | Input> {\n return async (values, _, options) => {\n let result = schema['~standard'].validate(values);\n if (result instanceof Promise) {\n result = await result;\n }\n\n if (result.issues) {\n const errors = parseErrorSchema(\n result.issues,\n !options.shouldUseNativeValidation && options.criteriaMode === 'all',\n );\n\n return {\n values: {},\n errors: toNestErrors(errors, options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result.value,\n errors: {},\n };\n };\n}\n"],"names":["schemaRootKey","Symbol","appendErrorMessage","error","message","schema","_schemaOptions","resolverOptions","values","_","options","_temp2","result","issues","errors","validateAllFieldCriteria","Map","i","length","path","getDotPath","fieldError","get","set","type","_extends2","currentError","types","_extends","Object","keys","_step","fieldErrors","_iterator","_createForOfIteratorHelperLoose","done","_step$value","value","rootError","root","nextTypes","_i","_Object$values","appendErrorTypes","parseErrorSchema","shouldUseNativeValidation","criteriaMode","toNestErrors","validateFieldsNatively","raw","assign","validate","_temp","Promise","resolve","then","_result","e","reject"],"mappings":"uYAKA,IAAMA,EAAgBC,OAAO,eAE7B,SAASC,EAAmBC,EAAmBC,GACxCA,IAILD,EAAMC,QAAUD,EAAMC,QAAaD,EAAMC,QAAO,KAAKA,EAAYA,EACnE,gCAiHgB,SAKdC,EACAC,EACAC,GAIA,YAJAA,IAAAA,IAAAA,EAEI,CAAE,GAEN,SAAcC,EAAQC,EAAGC,GAAW,IAAA,IAAAC,EAAA,WAMlC,GAAIC,EAAOC,OAAQ,CACjB,IAAMC,EAnHZ,SACED,EACAE,GAIA,IAFA,IAAMD,EAAS,IAAIE,IAEVC,EAAI,EAAGA,EAAIJ,EAAOK,OAAQD,IAAK,CACtC,IAAMd,EAAQU,EAAOI,GACfE,EAAOC,aAAWjB,IAAUH,EAC5BqB,EAAaP,EAAOQ,IAAIH,GAW9B,GATKE,EAEMF,IAASnB,GAIlBE,EAAmBmB,EAAYlB,EAAMC,SALrCU,EAAOS,IAAIJ,EAAM,CAAEf,QAASD,EAAMC,QAASoB,KAAM,KAQ/CT,EAA0B,CAAA,IAAAU,EACtBC,EAAeZ,EAAOQ,IAAIH,GAC1BQ,EAAQD,EAAaC,OAAS,CAAA,EAEpCD,EAAaC,MAAKC,EACbD,CAAAA,EAAAA,IAAKF,EAAA,CAAA,GACPI,OAAOC,KAAKH,GAAOT,QAASf,EAAMC,QAAOqB,GAE9C,CACF,CAIA,IAFA,IAEkCM,EAF5BC,EAA0C,CAAA,EAEhDC,2pBAAAC,CAA4BpB,KAAMiB,EAAAE,KAAAE,MAAE,CAAA,IAAAC,EAAAL,EAAAM,MAAxBlB,EAAIiB,EAAA,GACVjB,IAASnB,IACXgC,EAAYb,GAFOiB,EACrB,GAGF,CAEA,IAAME,EAAYxB,EAAOQ,IAAItB,GAW7B,OATIsC,IACEN,EAAYO,MACdrC,EAAmB8B,EAAYO,KAAMD,EAAUlC,SAzDrD,SAA0BD,EAAmBwB,GAC3C,GAAKA,EAAL,CAMA,IAFA,IAAMa,EAAYrC,EAAMwB,OAAS,CAAA,EAEjCc,EAAA,EAAAC,EAAsBb,OAAOrB,OAAOmB,GAAMc,EAAAC,EAAAxB,OAAAuB,IAAE,CAAvC,IAAMrC,EAAOsC,EAAAD,GAChBD,EAAUX,OAAOC,KAAKU,GAAWtB,QAAUd,CAC7C,CAEAD,EAAMwB,MAAQa,CARd,CASF,CA8CMG,CAAiBX,EAAYO,KAAMD,EAAUX,QAE7CK,EAAYO,KAAOD,GAIhBN,CACT,CAgEqBY,CACbhC,EAAOC,QACNH,EAAQmC,2BAAsD,QAAzBnC,EAAQoC,cAGhD,MAAO,CACLtC,OAAQ,CAAE,EACVM,OAAQiC,EAAAA,aAAajC,EAAQJ,GAEjC,CAIA,OAFAA,EAAQmC,2BAA6BG,EAAsBA,uBAAC,CAAE,EAAEtC,GAEzD,CACLF,OAAQD,EAAgB0C,IAAMpB,OAAOqB,OAAO,CAAE,EAAE1C,GAAUI,EAAOyB,MACjEvB,OAAQ,GACR,EAtBEF,EAASP,EAAO,aAAa8C,SAAS3C,GAAQ4C,EAAA,WAAA,GAC9CxC,aAAkByC,QAAO,OAAAA,QAAAC,QACZ1C,GAAM2C,KAAA,SAAAC,GAArB5C,EAAM4C,CAAgB,GAF0B,UAE1BH,QAAAC,QAAAF,GAAAA,EAAAG,KAAAH,EAAAG,KAAA5C,GAAAA,IAqB1B,CAAC,MAAA8C,UAAAJ,QAAAK,OAAAD,EACH,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standard-schema.modern.mjs","sources":["../src/standard-schema.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { StandardSchemaV1 } from '@standard-schema/spec';\nimport { getDotPath } from '@standard-schema/utils';\nimport { FieldError, FieldValues, Resolver } from 'react-hook-form';\n\nconst schemaRootKey = Symbol('Schema root');\n\nfunction appendErrorMessage(error: FieldError, message: string | undefined) {\n if (!message) {\n return;\n }\n\n error.message = error.message ? `${error.message}\\n${message}` : message;\n}\n\nfunction appendErrorTypes(error: FieldError, types: FieldError['types']) {\n if (!types) {\n return;\n }\n\n const nextTypes = error.types || {};\n\n for (const message of Object.values(types)) {\n nextTypes[Object.keys(nextTypes).length] = message;\n }\n\n error.types = nextTypes;\n}\n\nfunction parseErrorSchema(\n issues: readonly StandardSchemaV1.Issue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors = new Map<string | typeof schemaRootKey, FieldError>();\n\n for (let i = 0; i < issues.length; i++) {\n const error = issues[i];\n const path = getDotPath(error) || schemaRootKey;\n const fieldError = errors.get(path);\n\n if (!fieldError) {\n errors.set(path, { message: error.message, type: '' });\n } else if (path === schemaRootKey) {\n // Root-level issues aren't tied to a single field, so there's no\n // natural \"first\" message to prefer the way there is for a field —\n // keep every one of them regardless of criteriaMode.\n appendErrorMessage(fieldError, error.message);\n }\n\n if (validateAllFieldCriteria) {\n const currentError = errors.get(path)!;\n const types = currentError.types || {};\n\n currentError.types = {\n ...types,\n [Object.keys(types).length]: error.message,\n };\n }\n }\n\n const fieldErrors: Record<string, FieldError> = {};\n\n for (const [path, error] of errors) {\n if (path !== schemaRootKey) {\n fieldErrors[path] = error;\n }\n }\n\n const rootError = errors.get(schemaRootKey);\n\n if (rootError) {\n if (fieldErrors.root) {\n appendErrorMessage(fieldErrors.root, rootError.message);\n appendErrorTypes(fieldErrors.root, rootError.types);\n } else {\n fieldErrors.root = rootError;\n }\n }\n\n return fieldErrors;\n}\n\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions?: never,\n resolverOptions?: {\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions: never | undefined,\n resolverOptions: {\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form that validates data using a Standard Schema.\n *\n * @param {Schema} schema - The Standard Schema to validate against\n * @param {Object} resolverOptions - Options for the resolver\n * @param {boolean} [resolverOptions.raw=false] - Whether to return raw input values instead of parsed values\n * @returns {Resolver} A resolver function compatible with react-hook-form\n *\n * @example\n * ```ts\n * const schema = z.object({\n * name: z.string().min(2),\n * age: z.number().min(18)\n * });\n *\n * useForm({\n * resolver: standardSchemaResolver(schema)\n * });\n * ```\n */\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions?: never,\n resolverOptions: {\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Output | Input> {\n return async (values, _, options) => {\n let result = schema['~standard'].validate(values);\n if (result instanceof Promise) {\n result = await result;\n }\n\n if (result.issues) {\n const errors = parseErrorSchema(\n result.issues,\n !options.shouldUseNativeValidation && options.criteriaMode === 'all',\n );\n\n return {\n values: {},\n errors: toNestErrors(errors, options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result.value,\n errors: {},\n };\n };\n}\n"],"names":["schemaRootKey","Symbol","appendErrorMessage","error","message","standardSchemaResolver","schema","_schemaOptions","resolverOptions","async","values","_","options","result","validate","Promise","issues","errors","validateAllFieldCriteria","Map","i","length","path","getDotPath","fieldError","get","set","type","currentError","types","_extends","Object","keys","fieldErrors","rootError","root","nextTypes","appendErrorTypes","parseErrorSchema","shouldUseNativeValidation","criteriaMode","toNestErrors","validateFieldsNatively","raw","assign","value"],"mappings":"2VAKA,MAAMA,EAAgBC,OAAO,eAE7B,SAASC,EAAmBC,EAAmBC,GACxCA,IAILD,EAAMC,QAAUD,EAAMC,QAAU,GAAGD,EAAMC,YAAYA,IAAYA,EACnE,
|
|
1
|
+
{"version":3,"file":"standard-schema.modern.mjs","sources":["../src/standard-schema.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { StandardSchemaV1 } from '@standard-schema/spec';\nimport { getDotPath } from '@standard-schema/utils';\nimport { FieldError, FieldValues, Resolver } from 'react-hook-form';\n\nconst schemaRootKey = Symbol('Schema root');\n\nfunction appendErrorMessage(error: FieldError, message: string | undefined) {\n if (!message) {\n return;\n }\n\n error.message = error.message ? `${error.message}\\n${message}` : message;\n}\n\nfunction appendErrorTypes(error: FieldError, types: FieldError['types']) {\n if (!types) {\n return;\n }\n\n const nextTypes = error.types || {};\n\n for (const message of Object.values(types)) {\n nextTypes[Object.keys(nextTypes).length] = message;\n }\n\n error.types = nextTypes;\n}\n\nfunction parseErrorSchema(\n issues: readonly StandardSchemaV1.Issue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors = new Map<string | typeof schemaRootKey, FieldError>();\n\n for (let i = 0; i < issues.length; i++) {\n const error = issues[i];\n const path = getDotPath(error) || schemaRootKey;\n const fieldError = errors.get(path);\n\n if (!fieldError) {\n errors.set(path, { message: error.message, type: '' });\n } else if (path === schemaRootKey) {\n // Root-level issues aren't tied to a single field, so there's no\n // natural \"first\" message to prefer the way there is for a field —\n // keep every one of them regardless of criteriaMode.\n appendErrorMessage(fieldError, error.message);\n }\n\n if (validateAllFieldCriteria) {\n const currentError = errors.get(path)!;\n const types = currentError.types || {};\n\n currentError.types = {\n ...types,\n [Object.keys(types).length]: error.message,\n };\n }\n }\n\n const fieldErrors: Record<string, FieldError> = {};\n\n for (const [path, error] of errors) {\n if (path !== schemaRootKey) {\n fieldErrors[path] = error;\n }\n }\n\n const rootError = errors.get(schemaRootKey);\n\n if (rootError) {\n if (fieldErrors.root) {\n appendErrorMessage(fieldErrors.root, rootError.message);\n appendErrorTypes(fieldErrors.root, rootError.types);\n } else {\n fieldErrors.root = rootError;\n }\n }\n\n return fieldErrors;\n}\n\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions?: never,\n resolverOptions?: {\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions: never | undefined,\n resolverOptions: {\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form that validates data using a Standard Schema.\n *\n * @param {Schema} schema - The Standard Schema to validate against\n * @param {Object} resolverOptions - Options for the resolver\n * @param {boolean} [resolverOptions.raw=false] - Whether to return raw input values instead of parsed values\n * @returns {Resolver} A resolver function compatible with react-hook-form\n *\n * @example\n * ```ts\n * const schema = z.object({\n * name: z.string().min(2),\n * age: z.number().min(18)\n * });\n *\n * useForm({\n * resolver: standardSchemaResolver(schema)\n * });\n * ```\n */\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions?: never,\n resolverOptions: {\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Output | Input> {\n return async (values, _, options) => {\n let result = schema['~standard'].validate(values);\n if (result instanceof Promise) {\n result = await result;\n }\n\n if (result.issues) {\n const errors = parseErrorSchema(\n result.issues,\n !options.shouldUseNativeValidation && options.criteriaMode === 'all',\n );\n\n return {\n values: {},\n errors: toNestErrors(errors, options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result.value,\n errors: {},\n };\n };\n}\n"],"names":["schemaRootKey","Symbol","appendErrorMessage","error","message","standardSchemaResolver","schema","_schemaOptions","resolverOptions","async","values","_","options","result","validate","Promise","issues","errors","validateAllFieldCriteria","Map","i","length","path","getDotPath","fieldError","get","set","type","currentError","types","_extends","Object","keys","fieldErrors","rootError","root","nextTypes","appendErrorTypes","parseErrorSchema","shouldUseNativeValidation","criteriaMode","toNestErrors","validateFieldsNatively","raw","assign","value"],"mappings":"2VAKA,MAAMA,EAAgBC,OAAO,eAE7B,SAASC,EAAmBC,EAAmBC,GACxCA,IAILD,EAAMC,QAAUD,EAAMC,QAAU,GAAGD,EAAMC,YAAYA,IAAYA,EACnE,CAiHgB,SAAAC,EAKdC,EACAC,EACAC,EAEI,CAAE,GAEN,OAAOC,MAAOC,EAAQC,EAAGC,KACvB,IAAIC,EAASP,EAAO,aAAaQ,SAASJ,GAK1C,GAJIG,aAAkBE,UACpBF,QAAeA,GAGbA,EAAOG,OAAQ,CACjB,MAAMC,EAnHZ,SACED,EACAE,GAEA,MAAMD,EAAS,IAAIE,IAEnB,IAAK,IAAIC,EAAI,EAAGA,EAAIJ,EAAOK,OAAQD,IAAK,CACtC,MAAMjB,EAAQa,EAAOI,GACfE,EAAOC,EAAWpB,IAAUH,EAC5BwB,EAAaP,EAAOQ,IAAIH,GAW9B,GATKE,EAEMF,IAAStB,GAIlBE,EAAmBsB,EAAYrB,EAAMC,SALrCa,EAAOS,IAAIJ,EAAM,CAAElB,QAASD,EAAMC,QAASuB,KAAM,KAQ/CT,EAA0B,CAC5B,MAAMU,EAAeX,EAAOQ,IAAIH,GAC1BO,EAAQD,EAAaC,OAAS,CAAA,EAEpCD,EAAaC,MAAKC,EACbD,CAAAA,EAAAA,EACH,CAAA,CAACE,OAAOC,KAAKH,GAAOR,QAASlB,EAAMC,SAEvC,CACF,CAEA,MAAM6B,EAA0C,CAAE,EAElD,IAAK,MAAOX,EAAMnB,KAAUc,EACtBK,IAAStB,IACXiC,EAAYX,GAAQnB,GAIxB,MAAM+B,EAAYjB,EAAOQ,IAAIzB,GAW7B,OATIkC,IACED,EAAYE,MACdjC,EAAmB+B,EAAYE,KAAMD,EAAU9B,SAzDrD,SAA0BD,EAAmB0B,GAC3C,IAAKA,EACH,OAGF,MAAMO,EAAYjC,EAAM0B,OAAS,CAAE,EAEnC,IAAK,MAAMzB,KAAW2B,OAAOrB,OAAOmB,GAClCO,EAAUL,OAAOC,KAAKI,GAAWf,QAAUjB,EAG7CD,EAAM0B,MAAQO,CAChB,CA8CMC,CAAiBJ,EAAYE,KAAMD,EAAUL,QAE7CI,EAAYE,KAAOD,GAIhBD,CACT,CAgEqBK,CACbzB,EAAOG,QACNJ,EAAQ2B,2BAAsD,QAAzB3B,EAAQ4B,cAGhD,MAAO,CACL9B,OAAQ,CAAE,EACVO,OAAQwB,EAAaxB,EAAQL,GAEjC,CAIA,OAFAA,EAAQ2B,2BAA6BG,EAAuB,CAAE,EAAE9B,GAEzD,CACLF,OAAQF,EAAgBmC,IAAMZ,OAAOa,OAAO,CAAE,EAAElC,GAAUG,EAAOgC,MACjE5B,OAAQ,GACT,CAEL"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standard-schema.module.js","sources":["../src/standard-schema.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { StandardSchemaV1 } from '@standard-schema/spec';\nimport { getDotPath } from '@standard-schema/utils';\nimport { FieldError, FieldValues, Resolver } from 'react-hook-form';\n\nconst schemaRootKey = Symbol('Schema root');\n\nfunction appendErrorMessage(error: FieldError, message: string | undefined) {\n if (!message) {\n return;\n }\n\n error.message = error.message ? `${error.message}\\n${message}` : message;\n}\n\nfunction appendErrorTypes(error: FieldError, types: FieldError['types']) {\n if (!types) {\n return;\n }\n\n const nextTypes = error.types || {};\n\n for (const message of Object.values(types)) {\n nextTypes[Object.keys(nextTypes).length] = message;\n }\n\n error.types = nextTypes;\n}\n\nfunction parseErrorSchema(\n issues: readonly StandardSchemaV1.Issue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors = new Map<string | typeof schemaRootKey, FieldError>();\n\n for (let i = 0; i < issues.length; i++) {\n const error = issues[i];\n const path = getDotPath(error) || schemaRootKey;\n const fieldError = errors.get(path);\n\n if (!fieldError) {\n errors.set(path, { message: error.message, type: '' });\n } else if (path === schemaRootKey) {\n // Root-level issues aren't tied to a single field, so there's no\n // natural \"first\" message to prefer the way there is for a field —\n // keep every one of them regardless of criteriaMode.\n appendErrorMessage(fieldError, error.message);\n }\n\n if (validateAllFieldCriteria) {\n const currentError = errors.get(path)!;\n const types = currentError.types || {};\n\n currentError.types = {\n ...types,\n [Object.keys(types).length]: error.message,\n };\n }\n }\n\n const fieldErrors: Record<string, FieldError> = {};\n\n for (const [path, error] of errors) {\n if (path !== schemaRootKey) {\n fieldErrors[path] = error;\n }\n }\n\n const rootError = errors.get(schemaRootKey);\n\n if (rootError) {\n if (fieldErrors.root) {\n appendErrorMessage(fieldErrors.root, rootError.message);\n appendErrorTypes(fieldErrors.root, rootError.types);\n } else {\n fieldErrors.root = rootError;\n }\n }\n\n return fieldErrors;\n}\n\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions?: never,\n resolverOptions?: {\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions: never | undefined,\n resolverOptions: {\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form that validates data using a Standard Schema.\n *\n * @param {Schema} schema - The Standard Schema to validate against\n * @param {Object} resolverOptions - Options for the resolver\n * @param {boolean} [resolverOptions.raw=false] - Whether to return raw input values instead of parsed values\n * @returns {Resolver} A resolver function compatible with react-hook-form\n *\n * @example\n * ```ts\n * const schema = z.object({\n * name: z.string().min(2),\n * age: z.number().min(18)\n * });\n *\n * useForm({\n * resolver: standardSchemaResolver(schema)\n * });\n * ```\n */\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions?: never,\n resolverOptions: {\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Output | Input> {\n return async (values, _, options) => {\n let result = schema['~standard'].validate(values);\n if (result instanceof Promise) {\n result = await result;\n }\n\n if (result.issues) {\n const errors = parseErrorSchema(\n result.issues,\n !options.shouldUseNativeValidation && options.criteriaMode === 'all',\n );\n\n return {\n values: {},\n errors: toNestErrors(errors, options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result.value,\n errors: {},\n };\n };\n}\n"],"names":["schemaRootKey","Symbol","appendErrorMessage","error","message","standardSchemaResolver","schema","_schemaOptions","resolverOptions","values","_","options","_temp2","result","issues","errors","validateAllFieldCriteria","Map","i","length","path","getDotPath","fieldError","get","set","type","_extends2","currentError","types","_extends","Object","keys","_step","fieldErrors","_iterator","_createForOfIteratorHelperLoose","done","_step$value","value","rootError","root","nextTypes","_i","_Object$values","appendErrorTypes","parseErrorSchema","shouldUseNativeValidation","criteriaMode","toNestErrors","validateFieldsNatively","raw","assign","validate","_temp","Promise","resolve","then","_result","e","reject"],"mappings":"icAKA,IAAMA,EAAgBC,OAAO,eAE7B,SAASC,EAAmBC,EAAmBC,GACxCA,IAILD,EAAMC,QAAUD,EAAMC,QAAaD,EAAMC,
|
|
1
|
+
{"version":3,"file":"standard-schema.module.js","sources":["../src/standard-schema.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { StandardSchemaV1 } from '@standard-schema/spec';\nimport { getDotPath } from '@standard-schema/utils';\nimport { FieldError, FieldValues, Resolver } from 'react-hook-form';\n\nconst schemaRootKey = Symbol('Schema root');\n\nfunction appendErrorMessage(error: FieldError, message: string | undefined) {\n if (!message) {\n return;\n }\n\n error.message = error.message ? `${error.message}\\n${message}` : message;\n}\n\nfunction appendErrorTypes(error: FieldError, types: FieldError['types']) {\n if (!types) {\n return;\n }\n\n const nextTypes = error.types || {};\n\n for (const message of Object.values(types)) {\n nextTypes[Object.keys(nextTypes).length] = message;\n }\n\n error.types = nextTypes;\n}\n\nfunction parseErrorSchema(\n issues: readonly StandardSchemaV1.Issue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors = new Map<string | typeof schemaRootKey, FieldError>();\n\n for (let i = 0; i < issues.length; i++) {\n const error = issues[i];\n const path = getDotPath(error) || schemaRootKey;\n const fieldError = errors.get(path);\n\n if (!fieldError) {\n errors.set(path, { message: error.message, type: '' });\n } else if (path === schemaRootKey) {\n // Root-level issues aren't tied to a single field, so there's no\n // natural \"first\" message to prefer the way there is for a field —\n // keep every one of them regardless of criteriaMode.\n appendErrorMessage(fieldError, error.message);\n }\n\n if (validateAllFieldCriteria) {\n const currentError = errors.get(path)!;\n const types = currentError.types || {};\n\n currentError.types = {\n ...types,\n [Object.keys(types).length]: error.message,\n };\n }\n }\n\n const fieldErrors: Record<string, FieldError> = {};\n\n for (const [path, error] of errors) {\n if (path !== schemaRootKey) {\n fieldErrors[path] = error;\n }\n }\n\n const rootError = errors.get(schemaRootKey);\n\n if (rootError) {\n if (fieldErrors.root) {\n appendErrorMessage(fieldErrors.root, rootError.message);\n appendErrorTypes(fieldErrors.root, rootError.types);\n } else {\n fieldErrors.root = rootError;\n }\n }\n\n return fieldErrors;\n}\n\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions?: never,\n resolverOptions?: {\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions: never | undefined,\n resolverOptions: {\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form that validates data using a Standard Schema.\n *\n * @param {Schema} schema - The Standard Schema to validate against\n * @param {Object} resolverOptions - Options for the resolver\n * @param {boolean} [resolverOptions.raw=false] - Whether to return raw input values instead of parsed values\n * @returns {Resolver} A resolver function compatible with react-hook-form\n *\n * @example\n * ```ts\n * const schema = z.object({\n * name: z.string().min(2),\n * age: z.number().min(18)\n * });\n *\n * useForm({\n * resolver: standardSchemaResolver(schema)\n * });\n * ```\n */\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions?: never,\n resolverOptions: {\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Output | Input> {\n return async (values, _, options) => {\n let result = schema['~standard'].validate(values);\n if (result instanceof Promise) {\n result = await result;\n }\n\n if (result.issues) {\n const errors = parseErrorSchema(\n result.issues,\n !options.shouldUseNativeValidation && options.criteriaMode === 'all',\n );\n\n return {\n values: {},\n errors: toNestErrors(errors, options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result.value,\n errors: {},\n };\n };\n}\n"],"names":["schemaRootKey","Symbol","appendErrorMessage","error","message","standardSchemaResolver","schema","_schemaOptions","resolverOptions","values","_","options","_temp2","result","issues","errors","validateAllFieldCriteria","Map","i","length","path","getDotPath","fieldError","get","set","type","_extends2","currentError","types","_extends","Object","keys","_step","fieldErrors","_iterator","_createForOfIteratorHelperLoose","done","_step$value","value","rootError","root","nextTypes","_i","_Object$values","appendErrorTypes","parseErrorSchema","shouldUseNativeValidation","criteriaMode","toNestErrors","validateFieldsNatively","raw","assign","validate","_temp","Promise","resolve","then","_result","e","reject"],"mappings":"icAKA,IAAMA,EAAgBC,OAAO,eAE7B,SAASC,EAAmBC,EAAmBC,GACxCA,IAILD,EAAMC,QAAUD,EAAMC,QAAaD,EAAMC,QAAO,KAAKA,EAAYA,EACnE,CAiHgB,SAAAC,EAKdC,EACAC,EACAC,GAIA,YAJAA,IAAAA,IAAAA,EAEI,CAAE,GAEN,SAAcC,EAAQC,EAAGC,GAAW,IAAA,IAAAC,EAAA,WAMlC,GAAIC,EAAOC,OAAQ,CACjB,IAAMC,EAnHZ,SACED,EACAE,GAIA,IAFA,IAAMD,EAAS,IAAIE,IAEVC,EAAI,EAAGA,EAAIJ,EAAOK,OAAQD,IAAK,CACtC,IAAMf,EAAQW,EAAOI,GACfE,EAAOC,EAAWlB,IAAUH,EAC5BsB,EAAaP,EAAOQ,IAAIH,GAW9B,GATKE,EAEMF,IAASpB,GAIlBE,EAAmBoB,EAAYnB,EAAMC,SALrCW,EAAOS,IAAIJ,EAAM,CAAEhB,QAASD,EAAMC,QAASqB,KAAM,KAQ/CT,EAA0B,CAAA,IAAAU,EACtBC,EAAeZ,EAAOQ,IAAIH,GAC1BQ,EAAQD,EAAaC,OAAS,CAAA,EAEpCD,EAAaC,MAAKC,EACbD,CAAAA,EAAAA,IAAKF,EAAA,CAAA,GACPI,OAAOC,KAAKH,GAAOT,QAAShB,EAAMC,QAAOsB,GAE9C,CACF,CAIA,IAFA,IAEkCM,EAF5BC,EAA0C,CAAA,EAEhDC,2pBAAAC,CAA4BpB,KAAMiB,EAAAE,KAAAE,MAAE,CAAA,IAAAC,EAAAL,EAAAM,MAAxBlB,EAAIiB,EAAA,GACVjB,IAASpB,IACXiC,EAAYb,GAFOiB,EACrB,GAGF,CAEA,IAAME,EAAYxB,EAAOQ,IAAIvB,GAW7B,OATIuC,IACEN,EAAYO,MACdtC,EAAmB+B,EAAYO,KAAMD,EAAUnC,SAzDrD,SAA0BD,EAAmByB,GAC3C,GAAKA,EAAL,CAMA,IAFA,IAAMa,EAAYtC,EAAMyB,OAAS,CAAA,EAEjCc,EAAA,EAAAC,EAAsBb,OAAOrB,OAAOmB,GAAMc,EAAAC,EAAAxB,OAAAuB,IAAE,CAAvC,IAAMtC,EAAOuC,EAAAD,GAChBD,EAAUX,OAAOC,KAAKU,GAAWtB,QAAUf,CAC7C,CAEAD,EAAMyB,MAAQa,CARd,CASF,CA8CMG,CAAiBX,EAAYO,KAAMD,EAAUX,QAE7CK,EAAYO,KAAOD,GAIhBN,CACT,CAgEqBY,CACbhC,EAAOC,QACNH,EAAQmC,2BAAsD,QAAzBnC,EAAQoC,cAGhD,MAAO,CACLtC,OAAQ,CAAE,EACVM,OAAQiC,EAAajC,EAAQJ,GAEjC,CAIA,OAFAA,EAAQmC,2BAA6BG,EAAuB,CAAE,EAAEtC,GAEzD,CACLF,OAAQD,EAAgB0C,IAAMpB,OAAOqB,OAAO,CAAE,EAAE1C,GAAUI,EAAOyB,MACjEvB,OAAQ,GACR,EAtBEF,EAASP,EAAO,aAAa8C,SAAS3C,GAAQ4C,EAAA,WAAA,GAC9CxC,aAAkByC,QAAO,OAAAA,QAAAC,QACZ1C,GAAM2C,KAAA,SAAAC,GAArB5C,EAAM4C,CAAgB,GAF0B,UAE1BH,QAAAC,QAAAF,GAAAA,EAAAG,KAAAH,EAAAG,KAAA5C,GAAAA,IAqB1B,CAAC,MAAA8C,UAAAJ,QAAAK,OAAAD,EACH,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standard-schema.umd.js","sources":["../src/standard-schema.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { StandardSchemaV1 } from '@standard-schema/spec';\nimport { getDotPath } from '@standard-schema/utils';\nimport { FieldError, FieldValues, Resolver } from 'react-hook-form';\n\nconst schemaRootKey = Symbol('Schema root');\n\nfunction appendErrorMessage(error: FieldError, message: string | undefined) {\n if (!message) {\n return;\n }\n\n error.message = error.message ? `${error.message}\\n${message}` : message;\n}\n\nfunction appendErrorTypes(error: FieldError, types: FieldError['types']) {\n if (!types) {\n return;\n }\n\n const nextTypes = error.types || {};\n\n for (const message of Object.values(types)) {\n nextTypes[Object.keys(nextTypes).length] = message;\n }\n\n error.types = nextTypes;\n}\n\nfunction parseErrorSchema(\n issues: readonly StandardSchemaV1.Issue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors = new Map<string | typeof schemaRootKey, FieldError>();\n\n for (let i = 0; i < issues.length; i++) {\n const error = issues[i];\n const path = getDotPath(error) || schemaRootKey;\n const fieldError = errors.get(path);\n\n if (!fieldError) {\n errors.set(path, { message: error.message, type: '' });\n } else if (path === schemaRootKey) {\n // Root-level issues aren't tied to a single field, so there's no\n // natural \"first\" message to prefer the way there is for a field —\n // keep every one of them regardless of criteriaMode.\n appendErrorMessage(fieldError, error.message);\n }\n\n if (validateAllFieldCriteria) {\n const currentError = errors.get(path)!;\n const types = currentError.types || {};\n\n currentError.types = {\n ...types,\n [Object.keys(types).length]: error.message,\n };\n }\n }\n\n const fieldErrors: Record<string, FieldError> = {};\n\n for (const [path, error] of errors) {\n if (path !== schemaRootKey) {\n fieldErrors[path] = error;\n }\n }\n\n const rootError = errors.get(schemaRootKey);\n\n if (rootError) {\n if (fieldErrors.root) {\n appendErrorMessage(fieldErrors.root, rootError.message);\n appendErrorTypes(fieldErrors.root, rootError.types);\n } else {\n fieldErrors.root = rootError;\n }\n }\n\n return fieldErrors;\n}\n\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions?: never,\n resolverOptions?: {\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions: never | undefined,\n resolverOptions: {\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form that validates data using a Standard Schema.\n *\n * @param {Schema} schema - The Standard Schema to validate against\n * @param {Object} resolverOptions - Options for the resolver\n * @param {boolean} [resolverOptions.raw=false] - Whether to return raw input values instead of parsed values\n * @returns {Resolver} A resolver function compatible with react-hook-form\n *\n * @example\n * ```ts\n * const schema = z.object({\n * name: z.string().min(2),\n * age: z.number().min(18)\n * });\n *\n * useForm({\n * resolver: standardSchemaResolver(schema)\n * });\n * ```\n */\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions?: never,\n resolverOptions: {\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Output | Input> {\n return async (values, _, options) => {\n let result = schema['~standard'].validate(values);\n if (result instanceof Promise) {\n result = await result;\n }\n\n if (result.issues) {\n const errors = parseErrorSchema(\n result.issues,\n !options.shouldUseNativeValidation && options.criteriaMode === 'all',\n );\n\n return {\n values: {},\n errors: toNestErrors(errors, options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result.value,\n errors: {},\n };\n };\n}\n"],"names":["schemaRootKey","Symbol","appendErrorMessage","error","message","schema","_schemaOptions","resolverOptions","values","_","options","_temp2","result","issues","errors","validateAllFieldCriteria","Map","i","length","path","getDotPath","fieldError","get","set","type","_extends2","currentError","types","_extends","Object","keys","_step","fieldErrors","_iterator","_createForOfIteratorHelperLoose","done","_step$value","value","rootError","root","nextTypes","_i","_Object$values","appendErrorTypes","parseErrorSchema","shouldUseNativeValidation","criteriaMode","toNestErrors","validateFieldsNatively","raw","assign","validate","_temp","Promise","resolve","then","_result","e","reject"],"mappings":"usBAKA,IAAMA,EAAgBC,OAAO,eAE7B,SAASC,EAAmBC,EAAmBC,GACxCA,IAILD,EAAMC,QAAUD,EAAMC,QAAaD,EAAMC,
|
|
1
|
+
{"version":3,"file":"standard-schema.umd.js","sources":["../src/standard-schema.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { StandardSchemaV1 } from '@standard-schema/spec';\nimport { getDotPath } from '@standard-schema/utils';\nimport { FieldError, FieldValues, Resolver } from 'react-hook-form';\n\nconst schemaRootKey = Symbol('Schema root');\n\nfunction appendErrorMessage(error: FieldError, message: string | undefined) {\n if (!message) {\n return;\n }\n\n error.message = error.message ? `${error.message}\\n${message}` : message;\n}\n\nfunction appendErrorTypes(error: FieldError, types: FieldError['types']) {\n if (!types) {\n return;\n }\n\n const nextTypes = error.types || {};\n\n for (const message of Object.values(types)) {\n nextTypes[Object.keys(nextTypes).length] = message;\n }\n\n error.types = nextTypes;\n}\n\nfunction parseErrorSchema(\n issues: readonly StandardSchemaV1.Issue[],\n validateAllFieldCriteria: boolean,\n) {\n const errors = new Map<string | typeof schemaRootKey, FieldError>();\n\n for (let i = 0; i < issues.length; i++) {\n const error = issues[i];\n const path = getDotPath(error) || schemaRootKey;\n const fieldError = errors.get(path);\n\n if (!fieldError) {\n errors.set(path, { message: error.message, type: '' });\n } else if (path === schemaRootKey) {\n // Root-level issues aren't tied to a single field, so there's no\n // natural \"first\" message to prefer the way there is for a field —\n // keep every one of them regardless of criteriaMode.\n appendErrorMessage(fieldError, error.message);\n }\n\n if (validateAllFieldCriteria) {\n const currentError = errors.get(path)!;\n const types = currentError.types || {};\n\n currentError.types = {\n ...types,\n [Object.keys(types).length]: error.message,\n };\n }\n }\n\n const fieldErrors: Record<string, FieldError> = {};\n\n for (const [path, error] of errors) {\n if (path !== schemaRootKey) {\n fieldErrors[path] = error;\n }\n }\n\n const rootError = errors.get(schemaRootKey);\n\n if (rootError) {\n if (fieldErrors.root) {\n appendErrorMessage(fieldErrors.root, rootError.message);\n appendErrorTypes(fieldErrors.root, rootError.types);\n } else {\n fieldErrors.root = rootError;\n }\n }\n\n return fieldErrors;\n}\n\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions?: never,\n resolverOptions?: {\n raw?: false;\n },\n): Resolver<Input, Context, Output>;\n\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions: never | undefined,\n resolverOptions: {\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form that validates data using a Standard Schema.\n *\n * @param {Schema} schema - The Standard Schema to validate against\n * @param {Object} resolverOptions - Options for the resolver\n * @param {boolean} [resolverOptions.raw=false] - Whether to return raw input values instead of parsed values\n * @returns {Resolver} A resolver function compatible with react-hook-form\n *\n * @example\n * ```ts\n * const schema = z.object({\n * name: z.string().min(2),\n * age: z.number().min(18)\n * });\n *\n * useForm({\n * resolver: standardSchemaResolver(schema)\n * });\n * ```\n */\nexport function standardSchemaResolver<\n Input extends FieldValues,\n Context,\n Output,\n>(\n schema: StandardSchemaV1<Input, Output>,\n _schemaOptions?: never,\n resolverOptions: {\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Output | Input> {\n return async (values, _, options) => {\n let result = schema['~standard'].validate(values);\n if (result instanceof Promise) {\n result = await result;\n }\n\n if (result.issues) {\n const errors = parseErrorSchema(\n result.issues,\n !options.shouldUseNativeValidation && options.criteriaMode === 'all',\n );\n\n return {\n values: {},\n errors: toNestErrors(errors, options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result.value,\n errors: {},\n };\n };\n}\n"],"names":["schemaRootKey","Symbol","appendErrorMessage","error","message","schema","_schemaOptions","resolverOptions","values","_","options","_temp2","result","issues","errors","validateAllFieldCriteria","Map","i","length","path","getDotPath","fieldError","get","set","type","_extends2","currentError","types","_extends","Object","keys","_step","fieldErrors","_iterator","_createForOfIteratorHelperLoose","done","_step$value","value","rootError","root","nextTypes","_i","_Object$values","appendErrorTypes","parseErrorSchema","shouldUseNativeValidation","criteriaMode","toNestErrors","validateFieldsNatively","raw","assign","validate","_temp","Promise","resolve","then","_result","e","reject"],"mappings":"usBAKA,IAAMA,EAAgBC,OAAO,eAE7B,SAASC,EAAmBC,EAAmBC,GACxCA,IAILD,EAAMC,QAAUD,EAAMC,QAAaD,EAAMC,QAAO,KAAKA,EAAYA,EACnE,0BAiHgB,SAKdC,EACAC,EACAC,GAIA,YAJAA,IAAAA,IAAAA,EAEI,CAAE,GAEN,SAAcC,EAAQC,EAAGC,GAAW,IAAA,IAAAC,EAAA,WAMlC,GAAIC,EAAOC,OAAQ,CACjB,IAAMC,EAnHZ,SACED,EACAE,GAIA,IAFA,IAAMD,EAAS,IAAIE,IAEVC,EAAI,EAAGA,EAAIJ,EAAOK,OAAQD,IAAK,CACtC,IAAMd,EAAQU,EAAOI,GACfE,EAAOC,aAAWjB,IAAUH,EAC5BqB,EAAaP,EAAOQ,IAAIH,GAW9B,GATKE,EAEMF,IAASnB,GAIlBE,EAAmBmB,EAAYlB,EAAMC,SALrCU,EAAOS,IAAIJ,EAAM,CAAEf,QAASD,EAAMC,QAASoB,KAAM,KAQ/CT,EAA0B,CAAA,IAAAU,EACtBC,EAAeZ,EAAOQ,IAAIH,GAC1BQ,EAAQD,EAAaC,OAAS,CAAA,EAEpCD,EAAaC,MAAKC,EACbD,CAAAA,EAAAA,IAAKF,EAAA,CAAA,GACPI,OAAOC,KAAKH,GAAOT,QAASf,EAAMC,QAAOqB,GAE9C,CACF,CAIA,IAFA,IAEkCM,EAF5BC,EAA0C,CAAA,EAEhDC,2pBAAAC,CAA4BpB,KAAMiB,EAAAE,KAAAE,MAAE,CAAA,IAAAC,EAAAL,EAAAM,MAAxBlB,EAAIiB,EAAA,GACVjB,IAASnB,IACXgC,EAAYb,GAFOiB,EACrB,GAGF,CAEA,IAAME,EAAYxB,EAAOQ,IAAItB,GAW7B,OATIsC,IACEN,EAAYO,MACdrC,EAAmB8B,EAAYO,KAAMD,EAAUlC,SAzDrD,SAA0BD,EAAmBwB,GAC3C,GAAKA,EAAL,CAMA,IAFA,IAAMa,EAAYrC,EAAMwB,OAAS,CAAA,EAEjCc,EAAA,EAAAC,EAAsBb,OAAOrB,OAAOmB,GAAMc,EAAAC,EAAAxB,OAAAuB,IAAE,CAAvC,IAAMrC,EAAOsC,EAAAD,GAChBD,EAAUX,OAAOC,KAAKU,GAAWtB,QAAUd,CAC7C,CAEAD,EAAMwB,MAAQa,CARd,CASF,CA8CMG,CAAiBX,EAAYO,KAAMD,EAAUX,QAE7CK,EAAYO,KAAOD,GAIhBN,CACT,CAgEqBY,CACbhC,EAAOC,QACNH,EAAQmC,2BAAsD,QAAzBnC,EAAQoC,cAGhD,MAAO,CACLtC,OAAQ,CAAE,EACVM,OAAQiC,EAAAA,aAAajC,EAAQJ,GAEjC,CAIA,OAFAA,EAAQmC,2BAA6BG,EAAsBA,uBAAC,CAAE,EAAEtC,GAEzD,CACLF,OAAQD,EAAgB0C,IAAMpB,OAAOqB,OAAO,CAAE,EAAE1C,GAAUI,EAAOyB,MACjEvB,OAAQ,GACR,EAtBEF,EAASP,EAAO,aAAa8C,SAAS3C,GAAQ4C,EAAA,WAAA,GAC9CxC,aAAkByC,QAAO,OAAAA,QAAAC,QACZ1C,GAAM2C,KAAA,SAAAC,GAArB5C,EAAM4C,CAAgB,GAF0B,UAE1BH,QAAAC,QAAAF,GAAAA,EAAAG,KAAAH,EAAAG,KAAA5C,GAAAA,IAqB1B,CAAC,MAAA8C,UAAAJ,QAAAK,OAAAD,EACH,CAAA,CAAA"}
|
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
2
|
|
|
3
|
+
exports[`standardSchemaResolver > should collect all root errors when validateAllFieldCriteria is true 1`] = `
|
|
4
|
+
{
|
|
5
|
+
"errors": {
|
|
6
|
+
"root": {
|
|
7
|
+
"message": "Invalid union
|
|
8
|
+
Missing discriminator",
|
|
9
|
+
"ref": undefined,
|
|
10
|
+
"type": "",
|
|
11
|
+
"types": {
|
|
12
|
+
"0": "Invalid union",
|
|
13
|
+
"1": "Missing discriminator",
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
"values": {},
|
|
18
|
+
}
|
|
19
|
+
`;
|
|
20
|
+
|
|
3
21
|
exports[`standardSchemaResolver > should correctly handle path segments that are objects 1`] = `
|
|
4
22
|
{
|
|
5
23
|
"errors": {
|
|
@@ -24,6 +42,19 @@ exports[`standardSchemaResolver > should correctly handle path segments that are
|
|
|
24
42
|
}
|
|
25
43
|
`;
|
|
26
44
|
|
|
45
|
+
exports[`standardSchemaResolver > should return a root error when a standard schema issue has no path 1`] = `
|
|
46
|
+
{
|
|
47
|
+
"errors": {
|
|
48
|
+
"root": {
|
|
49
|
+
"message": "Invalid input",
|
|
50
|
+
"ref": undefined,
|
|
51
|
+
"type": "",
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
"values": {},
|
|
55
|
+
}
|
|
56
|
+
`;
|
|
57
|
+
|
|
27
58
|
exports[`standardSchemaResolver > should return a single error from standardSchemaResolver when validation fails 1`] = `
|
|
28
59
|
{
|
|
29
60
|
"errors": {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { renderHook } from '@testing-library/react';
|
|
1
2
|
import { Resolver, SubmitHandler, useForm } from 'react-hook-form';
|
|
2
3
|
import { z } from 'zod/v3';
|
|
3
4
|
import { standardSchemaResolver } from '..';
|
|
@@ -218,13 +219,16 @@ describe('standardSchemaResolver', () => {
|
|
|
218
219
|
|
|
219
220
|
it('should correctly infer the output type from a standardSchema schema for the handleSubmit function in useForm', () => {
|
|
220
221
|
const schema = z.object({ id: z.number() });
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
222
|
+
const {
|
|
223
|
+
result: { current: form },
|
|
224
|
+
} = renderHook(() =>
|
|
225
|
+
useForm({
|
|
226
|
+
resolver: standardSchemaResolver(schema),
|
|
227
|
+
defaultValues: {
|
|
228
|
+
id: 3,
|
|
229
|
+
},
|
|
230
|
+
}),
|
|
231
|
+
);
|
|
228
232
|
|
|
229
233
|
expectTypeOf(form.watch('id')).toEqualTypeOf<number>();
|
|
230
234
|
|
|
@@ -238,12 +242,16 @@ describe('standardSchemaResolver', () => {
|
|
|
238
242
|
it('should correctly infer the output type from a standardSchema schema with a transform for the handleSubmit function in useForm', () => {
|
|
239
243
|
const schema = z.object({ id: z.number().transform((val) => String(val)) });
|
|
240
244
|
|
|
241
|
-
const
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
245
|
+
const {
|
|
246
|
+
result: { current: form },
|
|
247
|
+
} = renderHook(() =>
|
|
248
|
+
useForm({
|
|
249
|
+
resolver: standardSchemaResolver(schema),
|
|
250
|
+
defaultValues: {
|
|
251
|
+
id: 3,
|
|
252
|
+
},
|
|
253
|
+
}),
|
|
254
|
+
);
|
|
247
255
|
|
|
248
256
|
expectTypeOf(form.watch('id')).toEqualTypeOf<number>();
|
|
249
257
|
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { FieldValues, Resolver } from 'react-hook-form';
|
|
2
2
|
import { Infer, Struct, validate } from 'superstruct';
|
|
3
|
+
export declare function superstructResolver<Input extends FieldValues, Context, Output>(schema: Struct<Output, any>, schemaOptions: Omit<Parameters<typeof validate>[2], 'coerce'> & {
|
|
4
|
+
coerce: true;
|
|
5
|
+
}, resolverOptions?: {
|
|
6
|
+
raw?: boolean;
|
|
7
|
+
}): Resolver<Input, Context, Output>;
|
|
3
8
|
export declare function superstructResolver<Input extends FieldValues, Context, Output>(schema: Struct<Input, any>, schemaOptions?: Parameters<typeof validate>[2], resolverOptions?: {
|
|
4
9
|
raw?: false;
|
|
5
10
|
}): Resolver<Input, Context, Infer<typeof schema>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"superstruct.js","sources":["../src/superstruct.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { FieldError, FieldValues, Resolver } from 'react-hook-form';\nimport { Infer, Struct, StructError, validate } from 'superstruct';\n\nfunction parseErrorSchema(error: StructError) {\n return error.failures().reduce<Record<string, FieldError>>(\n (previous, error) =>\n (previous[error.path.join('.')] = {\n message: error.message,\n type: error.type,\n }) && previous,\n {},\n );\n}\n\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions?: Parameters<typeof validate>[2],\n resolverOptions?: {\n raw?: false;\n },\n): Resolver<Input, Context, Infer<typeof schema>>;\n\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions: Parameters<typeof validate>[2] | undefined,\n resolverOptions: {\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using Superstruct schema validation\n * @param {Struct<TFieldValues, any>} schema - The Superstruct schema to validate against\n * @param {Parameters<typeof validate>[2]} [schemaOptions] - Optional Superstruct validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values rather than validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = struct({\n * name: string(),\n * age: number()\n * });\n *\n * useForm({\n * resolver: superstructResolver(schema)\n * });\n */\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions?: Parameters<typeof validate>[2],\n resolverOptions: {\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Input | Output> {\n return (values: Input, _, options) => {\n const result = validate(values, schema, schemaOptions);\n\n if (result[0]) {\n return {\n values: {},\n errors: toNestErrors(parseErrorSchema(result[0]), options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result[1],\n errors: {},\n };\n };\n}\n"],"names":["schema","schemaOptions","resolverOptions","values","_","options","error","result","validate","errors","toNestErrors","failures","reduce","previous","path","join","message","type","shouldUseNativeValidation","validateFieldsNatively","raw","Object","assign"],"mappings":"
|
|
1
|
+
{"version":3,"file":"superstruct.js","sources":["../src/superstruct.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { FieldError, FieldValues, Resolver } from 'react-hook-form';\nimport { Infer, Struct, StructError, validate } from 'superstruct';\n\nfunction parseErrorSchema(error: StructError) {\n return error.failures().reduce<Record<string, FieldError>>(\n (previous, error) =>\n (previous[error.path.join('.')] = {\n message: error.message,\n type: error.type,\n }) && previous,\n {},\n );\n}\n\n// This is required to correctly type the input of the returned function when coerce is true\n// superstruct does not store the input type of a schema alongside it\n// Infer<typeof schema> gives the output type of the coercion\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Output, any>,\n schemaOptions: Omit<Parameters<typeof validate>[2], 'coerce'> & {\n coerce: true;\n },\n resolverOptions?: {\n raw?: boolean;\n },\n): Resolver<Input, Context, Output>;\n\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions?: Parameters<typeof validate>[2],\n resolverOptions?: {\n raw?: false;\n },\n): Resolver<Input, Context, Infer<typeof schema>>;\n\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions: Parameters<typeof validate>[2] | undefined,\n resolverOptions: {\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using Superstruct schema validation\n * @param {Struct<TFieldValues, any>} schema - The Superstruct schema to validate against\n * @param {Parameters<typeof validate>[2]} [schemaOptions] - Optional Superstruct validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values rather than validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = struct({\n * name: string(),\n * age: number()\n * });\n *\n * useForm({\n * resolver: superstructResolver(schema)\n * });\n */\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions?: Parameters<typeof validate>[2],\n resolverOptions: {\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Input | Output> {\n return (values: Input, _, options) => {\n const result = validate(values, schema, schemaOptions);\n\n if (result[0]) {\n return {\n values: {},\n errors: toNestErrors(parseErrorSchema(result[0]), options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result[1],\n errors: {},\n };\n };\n}\n"],"names":["schema","schemaOptions","resolverOptions","values","_","options","error","result","validate","errors","toNestErrors","failures","reduce","previous","path","join","message","type","shouldUseNativeValidation","validateFieldsNatively","raw","Object","assign"],"mappings":"0FA6DM,SACJA,EACAC,EACAC,GAIA,gBAJAA,IAAAA,EAEI,aAEIC,EAAeC,EAAGC,GACxB,IAjEsBC,EAiEhBC,EAASC,EAAQA,SAACL,EAAQH,EAAQC,GAExC,OAAIM,EAAO,GACF,CACLJ,OAAQ,CAAA,EACRM,OAAQC,EAAYA,cAtEFJ,EAsEoBC,EAAO,GArE5CD,EAAMK,WAAWC,OACtB,SAACC,EAAUP,UACRO,EAASP,EAAMQ,KAAKC,KAAK,MAAQ,CAChCC,QAASV,EAAMU,QACfC,KAAMX,EAAMW,QACRJ,CAAQ,EAChB,CAAE,IA+DoDR,KAItDA,EAAQa,2BAA6BC,EAAAA,uBAAuB,CAAE,EAAEd,GAEzD,CACLF,OAAQD,EAAgBkB,IAAMC,OAAOC,OAAO,CAAA,EAAInB,GAAUI,EAAO,GACjEE,OAAQ,IAEZ,CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"superstruct.modern.mjs","sources":["../src/superstruct.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { FieldError, FieldValues, Resolver } from 'react-hook-form';\nimport { Infer, Struct, StructError, validate } from 'superstruct';\n\nfunction parseErrorSchema(error: StructError) {\n return error.failures().reduce<Record<string, FieldError>>(\n (previous, error) =>\n (previous[error.path.join('.')] = {\n message: error.message,\n type: error.type,\n }) && previous,\n {},\n );\n}\n\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions?: Parameters<typeof validate>[2],\n resolverOptions?: {\n raw?: false;\n },\n): Resolver<Input, Context, Infer<typeof schema>>;\n\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions: Parameters<typeof validate>[2] | undefined,\n resolverOptions: {\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using Superstruct schema validation\n * @param {Struct<TFieldValues, any>} schema - The Superstruct schema to validate against\n * @param {Parameters<typeof validate>[2]} [schemaOptions] - Optional Superstruct validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values rather than validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = struct({\n * name: string(),\n * age: number()\n * });\n *\n * useForm({\n * resolver: superstructResolver(schema)\n * });\n */\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions?: Parameters<typeof validate>[2],\n resolverOptions: {\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Input | Output> {\n return (values: Input, _, options) => {\n const result = validate(values, schema, schemaOptions);\n\n if (result[0]) {\n return {\n values: {},\n errors: toNestErrors(parseErrorSchema(result[0]), options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result[1],\n errors: {},\n };\n };\n}\n"],"names":["superstructResolver","schema","schemaOptions","resolverOptions","values","_","options","result","validate","errors","toNestErrors","error","failures","reduce","previous","path","join","message","type","shouldUseNativeValidation","validateFieldsNatively","raw","Object","assign"],"mappings":"
|
|
1
|
+
{"version":3,"file":"superstruct.modern.mjs","sources":["../src/superstruct.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { FieldError, FieldValues, Resolver } from 'react-hook-form';\nimport { Infer, Struct, StructError, validate } from 'superstruct';\n\nfunction parseErrorSchema(error: StructError) {\n return error.failures().reduce<Record<string, FieldError>>(\n (previous, error) =>\n (previous[error.path.join('.')] = {\n message: error.message,\n type: error.type,\n }) && previous,\n {},\n );\n}\n\n// This is required to correctly type the input of the returned function when coerce is true\n// superstruct does not store the input type of a schema alongside it\n// Infer<typeof schema> gives the output type of the coercion\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Output, any>,\n schemaOptions: Omit<Parameters<typeof validate>[2], 'coerce'> & {\n coerce: true;\n },\n resolverOptions?: {\n raw?: boolean;\n },\n): Resolver<Input, Context, Output>;\n\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions?: Parameters<typeof validate>[2],\n resolverOptions?: {\n raw?: false;\n },\n): Resolver<Input, Context, Infer<typeof schema>>;\n\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions: Parameters<typeof validate>[2] | undefined,\n resolverOptions: {\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using Superstruct schema validation\n * @param {Struct<TFieldValues, any>} schema - The Superstruct schema to validate against\n * @param {Parameters<typeof validate>[2]} [schemaOptions] - Optional Superstruct validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values rather than validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = struct({\n * name: string(),\n * age: number()\n * });\n *\n * useForm({\n * resolver: superstructResolver(schema)\n * });\n */\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions?: Parameters<typeof validate>[2],\n resolverOptions: {\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Input | Output> {\n return (values: Input, _, options) => {\n const result = validate(values, schema, schemaOptions);\n\n if (result[0]) {\n return {\n values: {},\n errors: toNestErrors(parseErrorSchema(result[0]), options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result[1],\n errors: {},\n };\n };\n}\n"],"names":["superstructResolver","schema","schemaOptions","resolverOptions","values","_","options","result","validate","errors","toNestErrors","error","failures","reduce","previous","path","join","message","type","shouldUseNativeValidation","validateFieldsNatively","raw","Object","assign"],"mappings":"sHA6DgB,SAAAA,EACdC,EACAC,EACAC,EAEI,CAAA,GAEJ,MAAO,CAACC,EAAeC,EAAGC,KACxB,MAAMC,EAASC,EAASJ,EAAQH,EAAQC,GAExC,OAAIK,EAAO,GACF,CACLH,OAAQ,CAAE,EACVK,OAAQC,GAtEUC,EAsEoBJ,EAAO,GArE5CI,EAAMC,WAAWC,OACtB,CAACC,EAAUH,KACRG,EAASH,EAAMI,KAAKC,KAAK,MAAQ,CAChCC,QAASN,EAAMM,QACfC,KAAMP,EAAMO,QACRJ,EACR,CAAA,IA+DsDR,KAItDA,EAAQa,2BAA6BC,EAAuB,CAAE,EAAEd,GAEzD,CACLF,OAAQD,EAAgBkB,IAAMC,OAAOC,OAAO,GAAInB,GAAUG,EAAO,GACjEE,OAAQ,CAAA,IA9Ed,IAA0BE,CA+ErB,CAEL"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"superstruct.module.js","sources":["../src/superstruct.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { FieldError, FieldValues, Resolver } from 'react-hook-form';\nimport { Infer, Struct, StructError, validate } from 'superstruct';\n\nfunction parseErrorSchema(error: StructError) {\n return error.failures().reduce<Record<string, FieldError>>(\n (previous, error) =>\n (previous[error.path.join('.')] = {\n message: error.message,\n type: error.type,\n }) && previous,\n {},\n );\n}\n\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions?: Parameters<typeof validate>[2],\n resolverOptions?: {\n raw?: false;\n },\n): Resolver<Input, Context, Infer<typeof schema>>;\n\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions: Parameters<typeof validate>[2] | undefined,\n resolverOptions: {\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using Superstruct schema validation\n * @param {Struct<TFieldValues, any>} schema - The Superstruct schema to validate against\n * @param {Parameters<typeof validate>[2]} [schemaOptions] - Optional Superstruct validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values rather than validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = struct({\n * name: string(),\n * age: number()\n * });\n *\n * useForm({\n * resolver: superstructResolver(schema)\n * });\n */\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions?: Parameters<typeof validate>[2],\n resolverOptions: {\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Input | Output> {\n return (values: Input, _, options) => {\n const result = validate(values, schema, schemaOptions);\n\n if (result[0]) {\n return {\n values: {},\n errors: toNestErrors(parseErrorSchema(result[0]), options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result[1],\n errors: {},\n };\n };\n}\n"],"names":["superstructResolver","schema","schemaOptions","resolverOptions","values","_","options","error","result","validate","errors","toNestErrors","failures","reduce","previous","path","join","message","type","shouldUseNativeValidation","validateFieldsNatively","raw","Object","assign"],"mappings":"
|
|
1
|
+
{"version":3,"file":"superstruct.module.js","sources":["../src/superstruct.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { FieldError, FieldValues, Resolver } from 'react-hook-form';\nimport { Infer, Struct, StructError, validate } from 'superstruct';\n\nfunction parseErrorSchema(error: StructError) {\n return error.failures().reduce<Record<string, FieldError>>(\n (previous, error) =>\n (previous[error.path.join('.')] = {\n message: error.message,\n type: error.type,\n }) && previous,\n {},\n );\n}\n\n// This is required to correctly type the input of the returned function when coerce is true\n// superstruct does not store the input type of a schema alongside it\n// Infer<typeof schema> gives the output type of the coercion\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Output, any>,\n schemaOptions: Omit<Parameters<typeof validate>[2], 'coerce'> & {\n coerce: true;\n },\n resolverOptions?: {\n raw?: boolean;\n },\n): Resolver<Input, Context, Output>;\n\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions?: Parameters<typeof validate>[2],\n resolverOptions?: {\n raw?: false;\n },\n): Resolver<Input, Context, Infer<typeof schema>>;\n\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions: Parameters<typeof validate>[2] | undefined,\n resolverOptions: {\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using Superstruct schema validation\n * @param {Struct<TFieldValues, any>} schema - The Superstruct schema to validate against\n * @param {Parameters<typeof validate>[2]} [schemaOptions] - Optional Superstruct validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values rather than validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = struct({\n * name: string(),\n * age: number()\n * });\n *\n * useForm({\n * resolver: superstructResolver(schema)\n * });\n */\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions?: Parameters<typeof validate>[2],\n resolverOptions: {\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Input | Output> {\n return (values: Input, _, options) => {\n const result = validate(values, schema, schemaOptions);\n\n if (result[0]) {\n return {\n values: {},\n errors: toNestErrors(parseErrorSchema(result[0]), options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result[1],\n errors: {},\n };\n };\n}\n"],"names":["superstructResolver","schema","schemaOptions","resolverOptions","values","_","options","error","result","validate","errors","toNestErrors","failures","reduce","previous","path","join","message","type","shouldUseNativeValidation","validateFieldsNatively","raw","Object","assign"],"mappings":"sHA6DM,SAAUA,EACdC,EACAC,EACAC,GAIA,gBAJAA,IAAAA,EAEI,aAEIC,EAAeC,EAAGC,GACxB,IAjEsBC,EAiEhBC,EAASC,EAASL,EAAQH,EAAQC,GAExC,OAAIM,EAAO,GACF,CACLJ,OAAQ,CAAA,EACRM,OAAQC,GAtEUJ,EAsEoBC,EAAO,GArE5CD,EAAMK,WAAWC,OACtB,SAACC,EAAUP,UACRO,EAASP,EAAMQ,KAAKC,KAAK,MAAQ,CAChCC,QAASV,EAAMU,QACfC,KAAMX,EAAMW,QACRJ,CAAQ,EAChB,CAAE,IA+DoDR,KAItDA,EAAQa,2BAA6BC,EAAuB,CAAE,EAAEd,GAEzD,CACLF,OAAQD,EAAgBkB,IAAMC,OAAOC,OAAO,CAAA,EAAInB,GAAUI,EAAO,GACjEE,OAAQ,IAEZ,CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"superstruct.umd.js","sources":["../src/superstruct.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { FieldError, FieldValues, Resolver } from 'react-hook-form';\nimport { Infer, Struct, StructError, validate } from 'superstruct';\n\nfunction parseErrorSchema(error: StructError) {\n return error.failures().reduce<Record<string, FieldError>>(\n (previous, error) =>\n (previous[error.path.join('.')] = {\n message: error.message,\n type: error.type,\n }) && previous,\n {},\n );\n}\n\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions?: Parameters<typeof validate>[2],\n resolverOptions?: {\n raw?: false;\n },\n): Resolver<Input, Context, Infer<typeof schema>>;\n\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions: Parameters<typeof validate>[2] | undefined,\n resolverOptions: {\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using Superstruct schema validation\n * @param {Struct<TFieldValues, any>} schema - The Superstruct schema to validate against\n * @param {Parameters<typeof validate>[2]} [schemaOptions] - Optional Superstruct validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values rather than validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = struct({\n * name: string(),\n * age: number()\n * });\n *\n * useForm({\n * resolver: superstructResolver(schema)\n * });\n */\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions?: Parameters<typeof validate>[2],\n resolverOptions: {\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Input | Output> {\n return (values: Input, _, options) => {\n const result = validate(values, schema, schemaOptions);\n\n if (result[0]) {\n return {\n values: {},\n errors: toNestErrors(parseErrorSchema(result[0]), options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result[1],\n errors: {},\n };\n };\n}\n"],"names":["schema","schemaOptions","resolverOptions","values","_","options","error","result","validate","errors","toNestErrors","failures","reduce","previous","path","join","message","type","shouldUseNativeValidation","validateFieldsNatively","raw","Object","assign"],"mappings":"
|
|
1
|
+
{"version":3,"file":"superstruct.umd.js","sources":["../src/superstruct.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { FieldError, FieldValues, Resolver } from 'react-hook-form';\nimport { Infer, Struct, StructError, validate } from 'superstruct';\n\nfunction parseErrorSchema(error: StructError) {\n return error.failures().reduce<Record<string, FieldError>>(\n (previous, error) =>\n (previous[error.path.join('.')] = {\n message: error.message,\n type: error.type,\n }) && previous,\n {},\n );\n}\n\n// This is required to correctly type the input of the returned function when coerce is true\n// superstruct does not store the input type of a schema alongside it\n// Infer<typeof schema> gives the output type of the coercion\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Output, any>,\n schemaOptions: Omit<Parameters<typeof validate>[2], 'coerce'> & {\n coerce: true;\n },\n resolverOptions?: {\n raw?: boolean;\n },\n): Resolver<Input, Context, Output>;\n\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions?: Parameters<typeof validate>[2],\n resolverOptions?: {\n raw?: false;\n },\n): Resolver<Input, Context, Infer<typeof schema>>;\n\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions: Parameters<typeof validate>[2] | undefined,\n resolverOptions: {\n raw: true;\n },\n): Resolver<Input, Context, Input>;\n\n/**\n * Creates a resolver for react-hook-form using Superstruct schema validation\n * @param {Struct<TFieldValues, any>} schema - The Superstruct schema to validate against\n * @param {Parameters<typeof validate>[2]} [schemaOptions] - Optional Superstruct validation options\n * @param {Object} resolverOptions - Additional resolver configuration\n * @param {boolean} [resolverOptions.raw=false] - If true, returns raw values rather than validated results\n * @returns {Resolver<Infer<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = struct({\n * name: string(),\n * age: number()\n * });\n *\n * useForm({\n * resolver: superstructResolver(schema)\n * });\n */\nexport function superstructResolver<Input extends FieldValues, Context, Output>(\n schema: Struct<Input, any>,\n schemaOptions?: Parameters<typeof validate>[2],\n resolverOptions: {\n raw?: boolean;\n } = {},\n): Resolver<Input, Context, Input | Output> {\n return (values: Input, _, options) => {\n const result = validate(values, schema, schemaOptions);\n\n if (result[0]) {\n return {\n values: {},\n errors: toNestErrors(parseErrorSchema(result[0]), options),\n };\n }\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n return {\n values: resolverOptions.raw ? Object.assign({}, values) : result[1],\n errors: {},\n };\n };\n}\n"],"names":["schema","schemaOptions","resolverOptions","values","_","options","error","result","validate","errors","toNestErrors","failures","reduce","previous","path","join","message","type","shouldUseNativeValidation","validateFieldsNatively","raw","Object","assign"],"mappings":"4YA6DM,SACJA,EACAC,EACAC,GAIA,gBAJAA,IAAAA,EAEI,aAEIC,EAAeC,EAAGC,GACxB,IAjEsBC,EAiEhBC,EAASC,EAAQA,SAACL,EAAQH,EAAQC,GAExC,OAAIM,EAAO,GACF,CACLJ,OAAQ,CAAA,EACRM,OAAQC,EAAYA,cAtEFJ,EAsEoBC,EAAO,GArE5CD,EAAMK,WAAWC,OACtB,SAACC,EAAUP,UACRO,EAASP,EAAMQ,KAAKC,KAAK,MAAQ,CAChCC,QAASV,EAAMU,QACfC,KAAMX,EAAMW,QACRJ,CAAQ,EAChB,CAAE,IA+DoDR,KAItDA,EAAQa,2BAA6BC,EAAAA,uBAAuB,CAAE,EAAEd,GAEzD,CACLF,OAAQD,EAAgBkB,IAAMC,OAAOC,OAAO,CAAA,EAAInB,GAAUI,EAAO,GACjEE,OAAQ,IAEZ,CACF"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { renderHook } from '@testing-library/react';
|
|
1
2
|
import { Resolver, SubmitHandler, useForm } from 'react-hook-form';
|
|
2
3
|
import * as s from 'superstruct';
|
|
3
4
|
import { superstructResolver } from '..';
|
|
@@ -18,8 +19,9 @@ describe('superstructResolver', () => {
|
|
|
18
19
|
it('should return values from superstructResolver with coerced values', async () => {
|
|
19
20
|
const result = await superstructResolver(
|
|
20
21
|
s.object({
|
|
21
|
-
id: s.coerce(s.
|
|
22
|
+
id: s.coerce(s.string(), s.number(), (val) => String(val)),
|
|
22
23
|
}),
|
|
24
|
+
{ coerce: true },
|
|
23
25
|
)({ id: 1 }, undefined, {
|
|
24
26
|
fields,
|
|
25
27
|
shouldUseNativeValidation,
|
|
@@ -64,9 +66,13 @@ describe('superstructResolver', () => {
|
|
|
64
66
|
it('should correctly infer the output type from a superstruct schema for the handleSubmit function in useForm', () => {
|
|
65
67
|
const schema = s.object({ id: s.number() });
|
|
66
68
|
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
})
|
|
69
|
+
const {
|
|
70
|
+
result: { current: form },
|
|
71
|
+
} = renderHook(() =>
|
|
72
|
+
useForm({
|
|
73
|
+
resolver: superstructResolver(schema, {}),
|
|
74
|
+
}),
|
|
75
|
+
);
|
|
70
76
|
|
|
71
77
|
expectTypeOf(form.watch('id')).toEqualTypeOf<number>();
|
|
72
78
|
|
|
@@ -82,11 +88,19 @@ describe('superstructResolver', () => {
|
|
|
82
88
|
id: s.coerce(s.string(), s.number(), (val) => String(val)),
|
|
83
89
|
});
|
|
84
90
|
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
})
|
|
91
|
+
const {
|
|
92
|
+
result: { current: form },
|
|
93
|
+
} = renderHook(() =>
|
|
94
|
+
useForm({
|
|
95
|
+
// With coerce, there is no way to infer the input type of the schema
|
|
96
|
+
resolver: superstructResolver<{ id: number }, unknown, { id: string }>(
|
|
97
|
+
schema,
|
|
98
|
+
{ coerce: true },
|
|
99
|
+
),
|
|
100
|
+
}),
|
|
101
|
+
);
|
|
88
102
|
|
|
89
|
-
expectTypeOf(form.watch('id')).toEqualTypeOf<
|
|
103
|
+
expectTypeOf(form.watch('id')).toEqualTypeOf<number>();
|
|
90
104
|
|
|
91
105
|
expectTypeOf(form.handleSubmit).parameter(0).toEqualTypeOf<
|
|
92
106
|
SubmitHandler<{
|
|
@@ -13,6 +13,19 @@ function parseErrorSchema(error: StructError) {
|
|
|
13
13
|
);
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
+
// This is required to correctly type the input of the returned function when coerce is true
|
|
17
|
+
// superstruct does not store the input type of a schema alongside it
|
|
18
|
+
// Infer<typeof schema> gives the output type of the coercion
|
|
19
|
+
export function superstructResolver<Input extends FieldValues, Context, Output>(
|
|
20
|
+
schema: Struct<Output, any>,
|
|
21
|
+
schemaOptions: Omit<Parameters<typeof validate>[2], 'coerce'> & {
|
|
22
|
+
coerce: true;
|
|
23
|
+
},
|
|
24
|
+
resolverOptions?: {
|
|
25
|
+
raw?: boolean;
|
|
26
|
+
},
|
|
27
|
+
): Resolver<Input, Context, Output>;
|
|
28
|
+
|
|
16
29
|
export function superstructResolver<Input extends FieldValues, Context, Output>(
|
|
17
30
|
schema: Struct<Input, any>,
|
|
18
31
|
schemaOptions?: Parameters<typeof validate>[2],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typanion.js","sources":["../src/typanion.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type {\n FieldError,\n FieldErrors,\n FieldValues,\n Resolver,\n} from 'react-hook-form';\nimport * as t from 'typanion';\n\nfunction parseErrors(errors: string[], parsedErrors: FieldErrors = {}) {\n return errors.reduce((acc, error) => {\n const fieldIndex = error.indexOf(':');\n\n const field = error.slice(1, fieldIndex);\n const message = error.slice(fieldIndex + 1).trim();\n\n acc[field] = {\n message,\n } as FieldError;\n\n return acc;\n }, parsedErrors);\n}\n\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions?: Pick<t.ValidationState, 'coercions' | 'coercion'>,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, t.InferType<typeof schema>>;\n\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions: Pick<t.ValidationState, 'coercions' | 'coercion'> | 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 Typanion schema validation\n * @param {t.StrictValidator<TFieldValues, TFieldValues>} schema - The Typanion schema to validate against\n * @param {Pick<t.ValidationState, 'coercions' | 'coercion'>} [schemaOptions] - Optional Typanion validation options\n * @returns {Resolver<t.InferType<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = t.isObject({\n * name: t.isString(),\n * age: t.isInteger()\n * });\n *\n * useForm({\n * resolver: typanionResolver(schema)\n * });\n */\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions: Pick<t.ValidationState, 'coercions' | 'coercion'> = {},\n): Resolver<Input, Context, Output | Input> {\n return (values: Input, _, options) => {\n const rawErrors: string[] = [];\n const isValid = schema(\n values,\n Object.assign(\n {},\n {\n errors: rawErrors,\n },\n schemaOptions,\n ),\n );\n const parsedErrors = parseErrors(rawErrors);\n\n if (isValid) {\n options.shouldUseNativeValidation &&\n validateFieldsNatively(parsedErrors, options);\n\n return { values, errors: {} };\n }\n\n return { values: {}, errors: toNestErrors(parsedErrors, options) };\n };\n}\n"],"names":["schema","schemaOptions","values","_","options","rawErrors","isValid","Object","assign","errors","parsedErrors","reduce","acc","error","fieldIndex","indexOf","field","slice","message","trim","parseErrors","shouldUseNativeValidation","validateFieldsNatively","toNestErrors"],"mappings":"
|
|
1
|
+
{"version":3,"file":"typanion.js","sources":["../src/typanion.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type {\n FieldError,\n FieldErrors,\n FieldValues,\n Resolver,\n} from 'react-hook-form';\nimport * as t from 'typanion';\n\nfunction parseErrors(errors: string[], parsedErrors: FieldErrors = {}) {\n return errors.reduce((acc, error) => {\n const fieldIndex = error.indexOf(':');\n\n const field = error.slice(1, fieldIndex);\n const message = error.slice(fieldIndex + 1).trim();\n\n acc[field] = {\n message,\n } as FieldError;\n\n return acc;\n }, parsedErrors);\n}\n\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions?: Pick<t.ValidationState, 'coercions' | 'coercion'>,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, t.InferType<typeof schema>>;\n\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions: Pick<t.ValidationState, 'coercions' | 'coercion'> | 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 Typanion schema validation\n * @param {t.StrictValidator<TFieldValues, TFieldValues>} schema - The Typanion schema to validate against\n * @param {Pick<t.ValidationState, 'coercions' | 'coercion'>} [schemaOptions] - Optional Typanion validation options\n * @returns {Resolver<t.InferType<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = t.isObject({\n * name: t.isString(),\n * age: t.isInteger()\n * });\n *\n * useForm({\n * resolver: typanionResolver(schema)\n * });\n */\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions: Pick<t.ValidationState, 'coercions' | 'coercion'> = {},\n): Resolver<Input, Context, Output | Input> {\n return (values: Input, _, options) => {\n const rawErrors: string[] = [];\n const isValid = schema(\n values,\n Object.assign(\n {},\n {\n errors: rawErrors,\n },\n schemaOptions,\n ),\n );\n const parsedErrors = parseErrors(rawErrors);\n\n if (isValid) {\n options.shouldUseNativeValidation &&\n validateFieldsNatively(parsedErrors, options);\n\n return { values, errors: {} };\n }\n\n return { values: {}, errors: toNestErrors(parsedErrors, options) };\n };\n}\n"],"names":["schema","schemaOptions","values","_","options","rawErrors","isValid","Object","assign","errors","parsedErrors","reduce","acc","error","fieldIndex","indexOf","field","slice","message","trim","parseErrors","shouldUseNativeValidation","validateFieldsNatively","toNestErrors"],"mappings":"uEA0DEA,EACAC,GAEA,gBAFAA,IAAAA,EAAmE,IAE5D,SAACC,EAAeC,EAAGC,GACxB,IAAMC,EAAsB,GACtBC,EAAUN,EACdE,EACAK,OAAOC,OACL,GACA,CACEC,OAAQJ,GAEVJ,IAGES,EAhEV,SAAqBD,EAAkBC,GACrC,gBADqCA,IAAAA,EAA4B,IAC1DD,EAAOE,OAAO,SAACC,EAAKC,GACzB,IAAMC,EAAaD,EAAME,QAAQ,KAE3BC,EAAQH,EAAMI,MAAM,EAAGH,GACvBI,EAAUL,EAAMI,MAAMH,EAAa,GAAGK,OAM5C,OAJAP,EAAII,GAAS,CACXE,QAAAA,GAGKN,CACT,EAAGF,EACL,CAmDyBU,CAAYf,GAEjC,OAAIC,GACFF,EAAQiB,2BACNC,yBAAuBZ,EAAcN,GAEhC,CAAEF,OAAAA,EAAQO,OAAQ,CAAA,IAGpB,CAAEP,OAAQ,CAAE,EAAEO,OAAQc,EAAAA,aAAab,EAAcN,GAC1D,CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typanion.modern.mjs","sources":["../src/typanion.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type {\n FieldError,\n FieldErrors,\n FieldValues,\n Resolver,\n} from 'react-hook-form';\nimport * as t from 'typanion';\n\nfunction parseErrors(errors: string[], parsedErrors: FieldErrors = {}) {\n return errors.reduce((acc, error) => {\n const fieldIndex = error.indexOf(':');\n\n const field = error.slice(1, fieldIndex);\n const message = error.slice(fieldIndex + 1).trim();\n\n acc[field] = {\n message,\n } as FieldError;\n\n return acc;\n }, parsedErrors);\n}\n\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions?: Pick<t.ValidationState, 'coercions' | 'coercion'>,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, t.InferType<typeof schema>>;\n\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions: Pick<t.ValidationState, 'coercions' | 'coercion'> | 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 Typanion schema validation\n * @param {t.StrictValidator<TFieldValues, TFieldValues>} schema - The Typanion schema to validate against\n * @param {Pick<t.ValidationState, 'coercions' | 'coercion'>} [schemaOptions] - Optional Typanion validation options\n * @returns {Resolver<t.InferType<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = t.isObject({\n * name: t.isString(),\n * age: t.isInteger()\n * });\n *\n * useForm({\n * resolver: typanionResolver(schema)\n * });\n */\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions: Pick<t.ValidationState, 'coercions' | 'coercion'> = {},\n): Resolver<Input, Context, Output | Input> {\n return (values: Input, _, options) => {\n const rawErrors: string[] = [];\n const isValid = schema(\n values,\n Object.assign(\n {},\n {\n errors: rawErrors,\n },\n schemaOptions,\n ),\n );\n const parsedErrors = parseErrors(rawErrors);\n\n if (isValid) {\n options.shouldUseNativeValidation &&\n validateFieldsNatively(parsedErrors, options);\n\n return { values, errors: {} };\n }\n\n return { values: {}, errors: toNestErrors(parsedErrors, options) };\n };\n}\n"],"names":["typanionResolver","schema","schemaOptions","values","_","options","rawErrors","isValid","Object","assign","errors","parsedErrors","reduce","acc","error","fieldIndex","indexOf","field","slice","message","trim","parseErrors","shouldUseNativeValidation","validateFieldsNatively","toNestErrors"],"mappings":"
|
|
1
|
+
{"version":3,"file":"typanion.modern.mjs","sources":["../src/typanion.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type {\n FieldError,\n FieldErrors,\n FieldValues,\n Resolver,\n} from 'react-hook-form';\nimport * as t from 'typanion';\n\nfunction parseErrors(errors: string[], parsedErrors: FieldErrors = {}) {\n return errors.reduce((acc, error) => {\n const fieldIndex = error.indexOf(':');\n\n const field = error.slice(1, fieldIndex);\n const message = error.slice(fieldIndex + 1).trim();\n\n acc[field] = {\n message,\n } as FieldError;\n\n return acc;\n }, parsedErrors);\n}\n\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions?: Pick<t.ValidationState, 'coercions' | 'coercion'>,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, t.InferType<typeof schema>>;\n\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions: Pick<t.ValidationState, 'coercions' | 'coercion'> | 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 Typanion schema validation\n * @param {t.StrictValidator<TFieldValues, TFieldValues>} schema - The Typanion schema to validate against\n * @param {Pick<t.ValidationState, 'coercions' | 'coercion'>} [schemaOptions] - Optional Typanion validation options\n * @returns {Resolver<t.InferType<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = t.isObject({\n * name: t.isString(),\n * age: t.isInteger()\n * });\n *\n * useForm({\n * resolver: typanionResolver(schema)\n * });\n */\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions: Pick<t.ValidationState, 'coercions' | 'coercion'> = {},\n): Resolver<Input, Context, Output | Input> {\n return (values: Input, _, options) => {\n const rawErrors: string[] = [];\n const isValid = schema(\n values,\n Object.assign(\n {},\n {\n errors: rawErrors,\n },\n schemaOptions,\n ),\n );\n const parsedErrors = parseErrors(rawErrors);\n\n if (isValid) {\n options.shouldUseNativeValidation &&\n validateFieldsNatively(parsedErrors, options);\n\n return { values, errors: {} };\n }\n\n return { values: {}, errors: toNestErrors(parsedErrors, options) };\n };\n}\n"],"names":["typanionResolver","schema","schemaOptions","values","_","options","rawErrors","isValid","Object","assign","errors","parsedErrors","reduce","acc","error","fieldIndex","indexOf","field","slice","message","trim","parseErrors","shouldUseNativeValidation","validateFieldsNatively","toNestErrors"],"mappings":"wFAyDgBA,EACdC,EACAC,EAAmE,CAAA,GAEnE,MAAO,CAACC,EAAeC,EAAGC,KACxB,MAAMC,EAAsB,GACtBC,EAAUN,EACdE,EACAK,OAAOC,OACL,GACA,CACEC,OAAQJ,GAEVJ,IAGES,EAhEV,SAAqBD,EAAkBC,EAA4B,IACjE,OAAOD,EAAOE,OAAO,CAACC,EAAKC,KACzB,MAAMC,EAAaD,EAAME,QAAQ,KAE3BC,EAAQH,EAAMI,MAAM,EAAGH,GACvBI,EAAUL,EAAMI,MAAMH,EAAa,GAAGK,OAM5C,OAJAP,EAAII,GAAS,CACXE,WAGKN,CAAG,EACTF,EACL,CAmDyBU,CAAYf,GAEjC,OAAIC,GACFF,EAAQiB,2BACNC,EAAuBZ,EAAcN,GAEhC,CAAEF,SAAQO,OAAQ,CAAA,IAGpB,CAAEP,OAAQ,CAAA,EAAIO,OAAQc,EAAab,EAAcN,GAAU,CAEtE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typanion.module.js","sources":["../src/typanion.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type {\n FieldError,\n FieldErrors,\n FieldValues,\n Resolver,\n} from 'react-hook-form';\nimport * as t from 'typanion';\n\nfunction parseErrors(errors: string[], parsedErrors: FieldErrors = {}) {\n return errors.reduce((acc, error) => {\n const fieldIndex = error.indexOf(':');\n\n const field = error.slice(1, fieldIndex);\n const message = error.slice(fieldIndex + 1).trim();\n\n acc[field] = {\n message,\n } as FieldError;\n\n return acc;\n }, parsedErrors);\n}\n\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions?: Pick<t.ValidationState, 'coercions' | 'coercion'>,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, t.InferType<typeof schema>>;\n\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions: Pick<t.ValidationState, 'coercions' | 'coercion'> | 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 Typanion schema validation\n * @param {t.StrictValidator<TFieldValues, TFieldValues>} schema - The Typanion schema to validate against\n * @param {Pick<t.ValidationState, 'coercions' | 'coercion'>} [schemaOptions] - Optional Typanion validation options\n * @returns {Resolver<t.InferType<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = t.isObject({\n * name: t.isString(),\n * age: t.isInteger()\n * });\n *\n * useForm({\n * resolver: typanionResolver(schema)\n * });\n */\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions: Pick<t.ValidationState, 'coercions' | 'coercion'> = {},\n): Resolver<Input, Context, Output | Input> {\n return (values: Input, _, options) => {\n const rawErrors: string[] = [];\n const isValid = schema(\n values,\n Object.assign(\n {},\n {\n errors: rawErrors,\n },\n schemaOptions,\n ),\n );\n const parsedErrors = parseErrors(rawErrors);\n\n if (isValid) {\n options.shouldUseNativeValidation &&\n validateFieldsNatively(parsedErrors, options);\n\n return { values, errors: {} };\n }\n\n return { values: {}, errors: toNestErrors(parsedErrors, options) };\n };\n}\n"],"names":["typanionResolver","schema","schemaOptions","values","_","options","rawErrors","isValid","Object","assign","errors","parsedErrors","reduce","acc","error","fieldIndex","indexOf","field","slice","message","trim","parseErrors","shouldUseNativeValidation","validateFieldsNatively","toNestErrors"],"mappings":"
|
|
1
|
+
{"version":3,"file":"typanion.module.js","sources":["../src/typanion.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type {\n FieldError,\n FieldErrors,\n FieldValues,\n Resolver,\n} from 'react-hook-form';\nimport * as t from 'typanion';\n\nfunction parseErrors(errors: string[], parsedErrors: FieldErrors = {}) {\n return errors.reduce((acc, error) => {\n const fieldIndex = error.indexOf(':');\n\n const field = error.slice(1, fieldIndex);\n const message = error.slice(fieldIndex + 1).trim();\n\n acc[field] = {\n message,\n } as FieldError;\n\n return acc;\n }, parsedErrors);\n}\n\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions?: Pick<t.ValidationState, 'coercions' | 'coercion'>,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, t.InferType<typeof schema>>;\n\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions: Pick<t.ValidationState, 'coercions' | 'coercion'> | 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 Typanion schema validation\n * @param {t.StrictValidator<TFieldValues, TFieldValues>} schema - The Typanion schema to validate against\n * @param {Pick<t.ValidationState, 'coercions' | 'coercion'>} [schemaOptions] - Optional Typanion validation options\n * @returns {Resolver<t.InferType<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = t.isObject({\n * name: t.isString(),\n * age: t.isInteger()\n * });\n *\n * useForm({\n * resolver: typanionResolver(schema)\n * });\n */\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions: Pick<t.ValidationState, 'coercions' | 'coercion'> = {},\n): Resolver<Input, Context, Output | Input> {\n return (values: Input, _, options) => {\n const rawErrors: string[] = [];\n const isValid = schema(\n values,\n Object.assign(\n {},\n {\n errors: rawErrors,\n },\n schemaOptions,\n ),\n );\n const parsedErrors = parseErrors(rawErrors);\n\n if (isValid) {\n options.shouldUseNativeValidation &&\n validateFieldsNatively(parsedErrors, options);\n\n return { values, errors: {} };\n }\n\n return { values: {}, errors: toNestErrors(parsedErrors, options) };\n };\n}\n"],"names":["typanionResolver","schema","schemaOptions","values","_","options","rawErrors","isValid","Object","assign","errors","parsedErrors","reduce","acc","error","fieldIndex","indexOf","field","slice","message","trim","parseErrors","shouldUseNativeValidation","validateFieldsNatively","toNestErrors"],"mappings":"wFAyDgBA,EACdC,EACAC,GAEA,gBAFAA,IAAAA,EAAmE,IAE5D,SAACC,EAAeC,EAAGC,GACxB,IAAMC,EAAsB,GACtBC,EAAUN,EACdE,EACAK,OAAOC,OACL,GACA,CACEC,OAAQJ,GAEVJ,IAGES,EAhEV,SAAqBD,EAAkBC,GACrC,gBADqCA,IAAAA,EAA4B,IAC1DD,EAAOE,OAAO,SAACC,EAAKC,GACzB,IAAMC,EAAaD,EAAME,QAAQ,KAE3BC,EAAQH,EAAMI,MAAM,EAAGH,GACvBI,EAAUL,EAAMI,MAAMH,EAAa,GAAGK,OAM5C,OAJAP,EAAII,GAAS,CACXE,QAAAA,GAGKN,CACT,EAAGF,EACL,CAmDyBU,CAAYf,GAEjC,OAAIC,GACFF,EAAQiB,2BACNC,EAAuBZ,EAAcN,GAEhC,CAAEF,OAAAA,EAAQO,OAAQ,CAAA,IAGpB,CAAEP,OAAQ,CAAE,EAAEO,OAAQc,EAAab,EAAcN,GAC1D,CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typanion.umd.js","sources":["../src/typanion.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type {\n FieldError,\n FieldErrors,\n FieldValues,\n Resolver,\n} from 'react-hook-form';\nimport * as t from 'typanion';\n\nfunction parseErrors(errors: string[], parsedErrors: FieldErrors = {}) {\n return errors.reduce((acc, error) => {\n const fieldIndex = error.indexOf(':');\n\n const field = error.slice(1, fieldIndex);\n const message = error.slice(fieldIndex + 1).trim();\n\n acc[field] = {\n message,\n } as FieldError;\n\n return acc;\n }, parsedErrors);\n}\n\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions?: Pick<t.ValidationState, 'coercions' | 'coercion'>,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, t.InferType<typeof schema>>;\n\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions: Pick<t.ValidationState, 'coercions' | 'coercion'> | 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 Typanion schema validation\n * @param {t.StrictValidator<TFieldValues, TFieldValues>} schema - The Typanion schema to validate against\n * @param {Pick<t.ValidationState, 'coercions' | 'coercion'>} [schemaOptions] - Optional Typanion validation options\n * @returns {Resolver<t.InferType<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = t.isObject({\n * name: t.isString(),\n * age: t.isInteger()\n * });\n *\n * useForm({\n * resolver: typanionResolver(schema)\n * });\n */\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions: Pick<t.ValidationState, 'coercions' | 'coercion'> = {},\n): Resolver<Input, Context, Output | Input> {\n return (values: Input, _, options) => {\n const rawErrors: string[] = [];\n const isValid = schema(\n values,\n Object.assign(\n {},\n {\n errors: rawErrors,\n },\n schemaOptions,\n ),\n );\n const parsedErrors = parseErrors(rawErrors);\n\n if (isValid) {\n options.shouldUseNativeValidation &&\n validateFieldsNatively(parsedErrors, options);\n\n return { values, errors: {} };\n }\n\n return { values: {}, errors: toNestErrors(parsedErrors, options) };\n };\n}\n"],"names":["schema","schemaOptions","values","_","options","rawErrors","isValid","Object","assign","errors","parsedErrors","reduce","acc","error","fieldIndex","indexOf","field","slice","message","trim","parseErrors","shouldUseNativeValidation","validateFieldsNatively","toNestErrors"],"mappings":"
|
|
1
|
+
{"version":3,"file":"typanion.umd.js","sources":["../src/typanion.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport type {\n FieldError,\n FieldErrors,\n FieldValues,\n Resolver,\n} from 'react-hook-form';\nimport * as t from 'typanion';\n\nfunction parseErrors(errors: string[], parsedErrors: FieldErrors = {}) {\n return errors.reduce((acc, error) => {\n const fieldIndex = error.indexOf(':');\n\n const field = error.slice(1, fieldIndex);\n const message = error.slice(fieldIndex + 1).trim();\n\n acc[field] = {\n message,\n } as FieldError;\n\n return acc;\n }, parsedErrors);\n}\n\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions?: Pick<t.ValidationState, 'coercions' | 'coercion'>,\n resolverOptions?: {\n mode?: 'async' | 'sync';\n raw?: false;\n },\n): Resolver<Input, Context, t.InferType<typeof schema>>;\n\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions: Pick<t.ValidationState, 'coercions' | 'coercion'> | 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 Typanion schema validation\n * @param {t.StrictValidator<TFieldValues, TFieldValues>} schema - The Typanion schema to validate against\n * @param {Pick<t.ValidationState, 'coercions' | 'coercion'>} [schemaOptions] - Optional Typanion validation options\n * @returns {Resolver<t.InferType<typeof schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = t.isObject({\n * name: t.isString(),\n * age: t.isInteger()\n * });\n *\n * useForm({\n * resolver: typanionResolver(schema)\n * });\n */\nexport function typanionResolver<Input extends FieldValues, Context, Output>(\n schema: t.StrictValidator<Input, Input>,\n schemaOptions: Pick<t.ValidationState, 'coercions' | 'coercion'> = {},\n): Resolver<Input, Context, Output | Input> {\n return (values: Input, _, options) => {\n const rawErrors: string[] = [];\n const isValid = schema(\n values,\n Object.assign(\n {},\n {\n errors: rawErrors,\n },\n schemaOptions,\n ),\n );\n const parsedErrors = parseErrors(rawErrors);\n\n if (isValid) {\n options.shouldUseNativeValidation &&\n validateFieldsNatively(parsedErrors, options);\n\n return { values, errors: {} };\n }\n\n return { values: {}, errors: toNestErrors(parsedErrors, options) };\n };\n}\n"],"names":["schema","schemaOptions","values","_","options","rawErrors","isValid","Object","assign","errors","parsedErrors","reduce","acc","error","fieldIndex","indexOf","field","slice","message","trim","parseErrors","shouldUseNativeValidation","validateFieldsNatively","toNestErrors"],"mappings":"0VA0DEA,EACAC,GAEA,gBAFAA,IAAAA,EAAmE,IAE5D,SAACC,EAAeC,EAAGC,GACxB,IAAMC,EAAsB,GACtBC,EAAUN,EACdE,EACAK,OAAOC,OACL,GACA,CACEC,OAAQJ,GAEVJ,IAGES,EAhEV,SAAqBD,EAAkBC,GACrC,gBADqCA,IAAAA,EAA4B,IAC1DD,EAAOE,OAAO,SAACC,EAAKC,GACzB,IAAMC,EAAaD,EAAME,QAAQ,KAE3BC,EAAQH,EAAMI,MAAM,EAAGH,GACvBI,EAAUL,EAAMI,MAAMH,EAAa,GAAGK,OAM5C,OAJAP,EAAII,GAAS,CACXE,QAAAA,GAGKN,CACT,EAAGF,EACL,CAmDyBU,CAAYf,GAEjC,OAAIC,GACFF,EAAQiB,2BACNC,yBAAuBZ,EAAcN,GAEhC,CAAEF,OAAAA,EAAQO,OAAQ,CAAA,IAGpB,CAAEP,OAAQ,CAAE,EAAEO,OAAQc,EAAAA,aAAab,EAAcN,GAC1D,CACF"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { renderHook } from '@testing-library/react';
|
|
1
2
|
import { SubmitHandler } from 'react-hook-form';
|
|
2
3
|
import { useForm } from 'react-hook-form';
|
|
3
4
|
import { Resolver } from 'react-hook-form';
|
|
@@ -51,9 +52,13 @@ describe('typanionResolver', () => {
|
|
|
51
52
|
it('should correctly infer the output type from a typanion schema for the handleSubmit function in useForm', () => {
|
|
52
53
|
const schema = t.isObject({ id: t.isNumber() });
|
|
53
54
|
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
})
|
|
55
|
+
const {
|
|
56
|
+
result: { current: form },
|
|
57
|
+
} = renderHook(() =>
|
|
58
|
+
useForm({
|
|
59
|
+
resolver: typanionResolver(schema),
|
|
60
|
+
}),
|
|
61
|
+
);
|
|
57
62
|
|
|
58
63
|
expectTypeOf(form.watch('id')).toEqualTypeOf<number>();
|
|
59
64
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typebox.js","sources":["../src/typebox.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { Static, StaticDecode, TObject } from '@sinclair/typebox';\nimport { TypeCheck } from '@sinclair/typebox/compiler';\nimport { Value, type ValueError } from '@sinclair/typebox/value';\nimport { FieldError, Resolver, appendErrors } from 'react-hook-form';\n\nfunction parseErrorSchema(\n _errors: ValueError[],\n validateAllFieldCriteria: boolean,\n) {\n const errors: Record<string, FieldError> = {};\n for (; _errors.length; ) {\n const error = _errors[0];\n const { type, message, path } = error;\n const _path = path.substring(1).replace(/\\//g, '.');\n\n if (!errors[_path]) {\n errors[_path] = { message, type: '' + type };\n }\n\n if (validateAllFieldCriteria) {\n const types = errors[_path].types;\n const messages = types && types['' + type];\n\n errors[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n errors,\n '' + type,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n _errors.shift();\n }\n\n return errors;\n}\n\n/**\n * Creates a resolver for react-hook-form using Typebox schema validation\n * @param {Schema | TypeCheck<Schema>} schema - The Typebox schema to validate against\n * @param {Object} options - Additional resolver configuration\n * @param {string} [options.mode='async'] - Validation mode\n * @returns {Resolver<Static<Schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = Type.Object({\n * name: Type.String(),\n * age: Type.Number()\n * });\n *\n * useForm({\n * resolver: typeboxResolver(schema)\n * });\n */\nexport function typeboxResolver<Schema extends TObject, Context>(\n schema: Schema | TypeCheck<Schema>,\n): Resolver<Static<Schema>, Context, StaticDecode<Schema>> {\n return async (values: Static<Schema>, _, options) => {\n const errors = Array.from(\n schema instanceof TypeCheck\n ? schema.Errors(values)\n : Value.Errors(schema, values),\n );\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n if (!errors.length) {\n return {\n errors: {},\n values,\n };\n }\n\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n errors,\n !options.shouldUseNativeValidation && options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n };\n}\n"],"names":["parseErrorSchema","_errors","validateAllFieldCriteria","errors","length","error","type","message","_path","path","substring","replace","types","messages","appendErrors","concat","shift","schema","values","_","options","Array","from","TypeCheck","Errors","Value","shouldUseNativeValidation","validateFieldsNatively","Promise","resolve","toNestErrors","criteriaMode","e","reject"],"mappings":"+IAMA,SAASA,EACPC,EACAC,GAGA,IADA,IAAMC,EAAqC,
|
|
1
|
+
{"version":3,"file":"typebox.js","sources":["../src/typebox.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { Static, StaticDecode, TObject } from '@sinclair/typebox';\nimport { TypeCheck } from '@sinclair/typebox/compiler';\nimport { Value, type ValueError } from '@sinclair/typebox/value';\nimport { FieldError, Resolver, appendErrors } from 'react-hook-form';\n\nfunction parseErrorSchema(\n _errors: ValueError[],\n validateAllFieldCriteria: boolean,\n) {\n const errors: Record<string, FieldError> = {};\n for (; _errors.length; ) {\n const error = _errors[0];\n const { type, message, path } = error;\n const _path = path.substring(1).replace(/\\//g, '.');\n\n if (!errors[_path]) {\n errors[_path] = { message, type: '' + type };\n }\n\n if (validateAllFieldCriteria) {\n const types = errors[_path].types;\n const messages = types && types['' + type];\n\n errors[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n errors,\n '' + type,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n _errors.shift();\n }\n\n return errors;\n}\n\n/**\n * Creates a resolver for react-hook-form using Typebox schema validation\n * @param {Schema | TypeCheck<Schema>} schema - The Typebox schema to validate against\n * @param {Object} options - Additional resolver configuration\n * @param {string} [options.mode='async'] - Validation mode\n * @returns {Resolver<Static<Schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = Type.Object({\n * name: Type.String(),\n * age: Type.Number()\n * });\n *\n * useForm({\n * resolver: typeboxResolver(schema)\n * });\n */\nexport function typeboxResolver<Schema extends TObject, Context>(\n schema: Schema | TypeCheck<Schema>,\n): Resolver<Static<Schema>, Context, StaticDecode<Schema>> {\n return async (values: Static<Schema>, _, options) => {\n const errors = Array.from(\n schema instanceof TypeCheck\n ? schema.Errors(values)\n : Value.Errors(schema, values),\n );\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n if (!errors.length) {\n return {\n errors: {},\n values,\n };\n }\n\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n errors,\n !options.shouldUseNativeValidation && options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n };\n}\n"],"names":["parseErrorSchema","_errors","validateAllFieldCriteria","errors","length","error","type","message","_path","path","substring","replace","types","messages","appendErrors","concat","shift","schema","values","_","options","Array","from","TypeCheck","Errors","Value","shouldUseNativeValidation","validateFieldsNatively","Promise","resolve","toNestErrors","criteriaMode","e","reject"],"mappings":"+IAMA,SAASA,EACPC,EACAC,GAGA,IADA,IAAMC,EAAqC,CAAA,EACpCF,EAAQG,QAAU,CACvB,IAAMC,EAAQJ,EAAQ,GACdK,EAAwBD,EAAxBC,KAAMC,EAAkBF,EAAlBE,QACRC,EAD0BH,EAATI,KACJC,UAAU,GAAGC,QAAQ,MAAO,KAM/C,GAJKR,EAAOK,KACVL,EAAOK,GAAS,CAAED,QAAAA,EAASD,KAAM,GAAKA,IAGpCJ,EAA0B,CAC5B,IAAMU,EAAQT,EAAOK,GAAOI,MACtBC,EAAWD,GAASA,EAAM,GAAKN,GAErCH,EAAOK,GAASM,EAAAA,aACdN,EACAN,EACAC,EACA,GAAKG,EACLO,EACK,GAAgBE,OAAOF,EAAsBR,EAAME,SACpDF,EAAME,QAEd,CAEAN,EAAQe,OACV,CAEA,OAAOb,CACT,yBAkBM,SACJc,GAEA,OAAA,SAAcC,EAAwBC,EAAGC,OACvC,IAAMjB,EAASkB,MAAMC,KACnBL,aAAkBM,YACdN,EAAOO,OAAON,GACdO,QAAMD,OAAOP,EAAQC,IAK3B,OAFAE,EAAQM,2BAA6BC,yBAAuB,CAAA,EAAIP,GAShEQ,QAAAC,QAPK1B,EAAOC,OAOL,CACLc,OAAQ,CAAA,EACRf,OAAQ2B,EAAYA,aAClB9B,EACEG,GACCiB,EAAQM,2BAAsD,QAAzBN,EAAQW,cAEhDX,IAbK,CACLjB,OAAQ,CAAA,EACRe,OAAAA,GAcN,CAAC,MAAAc,GAAAJ,OAAAA,QAAAK,OAAAD,EACH,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typebox.modern.mjs","sources":["../src/typebox.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { Static, StaticDecode, TObject } from '@sinclair/typebox';\nimport { TypeCheck } from '@sinclair/typebox/compiler';\nimport { Value, type ValueError } from '@sinclair/typebox/value';\nimport { FieldError, Resolver, appendErrors } from 'react-hook-form';\n\nfunction parseErrorSchema(\n _errors: ValueError[],\n validateAllFieldCriteria: boolean,\n) {\n const errors: Record<string, FieldError> = {};\n for (; _errors.length; ) {\n const error = _errors[0];\n const { type, message, path } = error;\n const _path = path.substring(1).replace(/\\//g, '.');\n\n if (!errors[_path]) {\n errors[_path] = { message, type: '' + type };\n }\n\n if (validateAllFieldCriteria) {\n const types = errors[_path].types;\n const messages = types && types['' + type];\n\n errors[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n errors,\n '' + type,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n _errors.shift();\n }\n\n return errors;\n}\n\n/**\n * Creates a resolver for react-hook-form using Typebox schema validation\n * @param {Schema | TypeCheck<Schema>} schema - The Typebox schema to validate against\n * @param {Object} options - Additional resolver configuration\n * @param {string} [options.mode='async'] - Validation mode\n * @returns {Resolver<Static<Schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = Type.Object({\n * name: Type.String(),\n * age: Type.Number()\n * });\n *\n * useForm({\n * resolver: typeboxResolver(schema)\n * });\n */\nexport function typeboxResolver<Schema extends TObject, Context>(\n schema: Schema | TypeCheck<Schema>,\n): Resolver<Static<Schema>, Context, StaticDecode<Schema>> {\n return async (values: Static<Schema>, _, options) => {\n const errors = Array.from(\n schema instanceof TypeCheck\n ? schema.Errors(values)\n : Value.Errors(schema, values),\n );\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n if (!errors.length) {\n return {\n errors: {},\n values,\n };\n }\n\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n errors,\n !options.shouldUseNativeValidation && options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n };\n}\n"],"names":["parseErrorSchema","_errors","validateAllFieldCriteria","errors","length","error","type","message","path","_path","substring","replace","types","messages","appendErrors","concat","shift","typeboxResolver","schema","values","_","options","Array","from","TypeCheck","Errors","Value","shouldUseNativeValidation","validateFieldsNatively","toNestErrors","criteriaMode"],"mappings":"qOAMA,SAASA,EACPC,EACAC,GAEA,MAAMC,EAAqC,
|
|
1
|
+
{"version":3,"file":"typebox.modern.mjs","sources":["../src/typebox.ts"],"sourcesContent":["import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';\nimport { Static, StaticDecode, TObject } from '@sinclair/typebox';\nimport { TypeCheck } from '@sinclair/typebox/compiler';\nimport { Value, type ValueError } from '@sinclair/typebox/value';\nimport { FieldError, Resolver, appendErrors } from 'react-hook-form';\n\nfunction parseErrorSchema(\n _errors: ValueError[],\n validateAllFieldCriteria: boolean,\n) {\n const errors: Record<string, FieldError> = {};\n for (; _errors.length; ) {\n const error = _errors[0];\n const { type, message, path } = error;\n const _path = path.substring(1).replace(/\\//g, '.');\n\n if (!errors[_path]) {\n errors[_path] = { message, type: '' + type };\n }\n\n if (validateAllFieldCriteria) {\n const types = errors[_path].types;\n const messages = types && types['' + type];\n\n errors[_path] = appendErrors(\n _path,\n validateAllFieldCriteria,\n errors,\n '' + type,\n messages\n ? ([] as string[]).concat(messages as string[], error.message)\n : error.message,\n ) as FieldError;\n }\n\n _errors.shift();\n }\n\n return errors;\n}\n\n/**\n * Creates a resolver for react-hook-form using Typebox schema validation\n * @param {Schema | TypeCheck<Schema>} schema - The Typebox schema to validate against\n * @param {Object} options - Additional resolver configuration\n * @param {string} [options.mode='async'] - Validation mode\n * @returns {Resolver<Static<Schema>>} A resolver function compatible with react-hook-form\n * @example\n * const schema = Type.Object({\n * name: Type.String(),\n * age: Type.Number()\n * });\n *\n * useForm({\n * resolver: typeboxResolver(schema)\n * });\n */\nexport function typeboxResolver<Schema extends TObject, Context>(\n schema: Schema | TypeCheck<Schema>,\n): Resolver<Static<Schema>, Context, StaticDecode<Schema>> {\n return async (values: Static<Schema>, _, options) => {\n const errors = Array.from(\n schema instanceof TypeCheck\n ? schema.Errors(values)\n : Value.Errors(schema, values),\n );\n\n options.shouldUseNativeValidation && validateFieldsNatively({}, options);\n\n if (!errors.length) {\n return {\n errors: {},\n values,\n };\n }\n\n return {\n values: {},\n errors: toNestErrors(\n parseErrorSchema(\n errors,\n !options.shouldUseNativeValidation && options.criteriaMode === 'all',\n ),\n options,\n ),\n };\n };\n}\n"],"names":["parseErrorSchema","_errors","validateAllFieldCriteria","errors","length","error","type","message","path","_path","substring","replace","types","messages","appendErrors","concat","shift","typeboxResolver","schema","values","_","options","Array","from","TypeCheck","Errors","Value","shouldUseNativeValidation","validateFieldsNatively","toNestErrors","criteriaMode"],"mappings":"qOAMA,SAASA,EACPC,EACAC,GAEA,MAAMC,EAAqC,CAAE,EAC7C,KAAOF,EAAQG,QAAU,CACvB,MAAMC,EAAQJ,EAAQ,IAChBK,KAAEA,EAAIC,QAAEA,EAAOC,KAAEA,GAASH,EAC1BI,EAAQD,EAAKE,UAAU,GAAGC,QAAQ,MAAO,KAM/C,GAJKR,EAAOM,KACVN,EAAOM,GAAS,CAAEF,UAASD,KAAM,GAAKA,IAGpCJ,EAA0B,CAC5B,MAAMU,EAAQT,EAAOM,GAAOG,MACtBC,EAAWD,GAASA,EAAM,GAAKN,GAErCH,EAAOM,GAASK,EACdL,EACAP,EACAC,EACA,GAAKG,EACLO,EACK,GAAgBE,OAAOF,EAAsBR,EAAME,SACpDF,EAAME,QAEd,CAEAN,EAAQe,OACV,CAEA,OAAOb,CACT,CAkBM,SAAUc,EACdC,GAEA,OAAcC,MAAAA,EAAwBC,EAAGC,KACvC,MAAMlB,EAASmB,MAAMC,KACnBL,aAAkBM,EACdN,EAAOO,OAAON,GACdO,EAAMD,OAAOP,EAAQC,IAK3B,OAFAE,EAAQM,2BAA6BC,EAAuB,CAAA,EAAIP,GAE3DlB,EAAOC,OAOL,CACLe,OAAQ,CAAA,EACRhB,OAAQ0B,EACN7B,EACEG,GACCkB,EAAQM,2BAAsD,QAAzBN,EAAQS,cAEhDT,IAbK,CACLlB,OAAQ,CAAA,EACRgB,SAaH,CAEL"}
|