{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Context, Env, Input, MiddlewareHandler, TypedResponse, ValidationTargets } from 'hono'\nimport { validator } from 'hono/validator'\nimport type { InferInput } from 'hono/validator'\nimport type * as v3 from 'zod/v3'\nimport type { ZodSafeParseResult as v4ZodSafeParseResult } from 'zod/v4'\nimport type * as v4 from 'zod/v4/core'\n\ntype ZodSchema = v3.ZodType | v4.$ZodType\ntype ZodError = T extends v4.$ZodType\n ? v4.$ZodError>\n : v3.ZodError\ntype ZodSafeParseResult = T3 extends v4.$ZodType\n ? v4ZodSafeParseResult\n : v3.SafeParseReturnType\ntype zInput = T extends v3.ZodType ? v3.input : T extends v4.$ZodType ? v4.input : never\ntype zOutput = T extends v3.ZodType ? v3.output : T extends v4.$ZodType ? v4.output : never\ntype zInfer = T extends v3.ZodType ? v3.infer : T extends v4.$ZodType ? v4.infer : never\n\n// Failure variant of `safeParseAsync`'s return value.\n// Mirrors the runtime body returned by `c.json(result, 400)` on validation failure.\ntype ZodValidatorFailureBody = T extends v4.$ZodType\n ? Extract>, { success: false }>\n : T extends v3.ZodType\n ? Extract, v3.output>, { success: false }>\n : never\n\ntype ZodValidatorFailureResponse = Response &\n TypedResponse, 400, 'json'>\n\nexport type Hook<\n T,\n E extends Env,\n P extends string,\n Target extends keyof ValidationTargets = keyof ValidationTargets,\n O = {},\n Schema extends ZodSchema = any,\n> = (\n result: ({ success: true; data: T } | { success: false; error: ZodError; data: T }) & {\n target: Target\n },\n c: Context\n) => Response | void | TypedResponse | Promise>\n\ntype HasUndefined = undefined extends T ? true : false\n\ntype ExtractValidationResponse = VF extends (value: any, c: any) => infer R\n ? R extends Promise\n ? PR extends TypedResponse\n ? Response & TypedResponse\n : PR extends Response\n ? PR\n : PR extends undefined\n ? never\n : never\n : R extends TypedResponse\n ? Response & TypedResponse\n : R extends Response\n ? R\n : R extends undefined\n ? never\n : never\n : never\n\ntype ValidationFunctionOption = {\n validationFunction: (\n schema: T,\n value: ValidationTargets[Target]\n ) => ZodSafeParseResult | Promise>\n}\n\ntype DefaultInput = {\n in: HasUndefined extends true\n ? {\n [K in Target]?: [In] extends [ValidationTargets[K]] ? In : InferInput\n }\n : {\n [K in Target]: [In] extends [ValidationTargets[K]] ? In : InferInput\n }\n out: { [K in Target]: Out }\n}\n\n// without hook (with or without options)\nfunction zValidatorFunction<\n T extends ZodSchema,\n Target extends keyof ValidationTargets,\n E extends Env,\n P extends string,\n In = zInput,\n Out = zOutput,\n I extends Input = DefaultInput,\n V extends I = I,\n>(\n target: Target,\n schema: T,\n hook?: undefined,\n options?: ValidationFunctionOption\n): MiddlewareHandler>\n\n// with hook and options\nfunction zValidatorFunction<\n T extends ZodSchema,\n Target extends keyof ValidationTargets,\n E extends Env,\n P extends string,\n HookFn extends Hook,\n In = zInput,\n Out = zOutput,\n I extends Input = DefaultInput,\n V extends I = I,\n InferredValue = zInfer,\n>(\n target: Target,\n schema: T,\n hook?: HookFn,\n options?: ValidationFunctionOption\n): MiddlewareHandler>\n\n// implementation\nfunction zValidatorFunction<\n T extends ZodSchema,\n Target extends keyof ValidationTargets,\n E extends Env,\n P extends string,\n HookFn extends Hook,\n In = zInput,\n Out = zOutput,\n I extends Input = DefaultInput,\n V extends I = I,\n InferredValue = zInfer,\n>(\n target: Target,\n schema: T,\n hook?: HookFn,\n options?: ValidationFunctionOption\n):\n | MiddlewareHandler>\n | MiddlewareHandler> {\n // @ts-expect-error not typed well\n return validator(target, async (value: ValidationTargets[Target], c) => {\n let validatorValue = value\n\n // in case where our `target` === `header`, Hono parses all of the headers into lowercase.\n // this might not match the Zod schema, so we want to make sure that we account for that when parsing the schema.\n if ((target === 'header' && '_def' in schema) || (target === 'header' && '_zod' in schema)) {\n // create an object that maps lowercase schema keys to lowercase\n // @ts-expect-error the schema is a Zod Schema\n const schemaKeys = Object.keys('in' in schema ? schema.in.shape : schema.shape)\n const caseInsensitiveKeymap = Object.fromEntries(\n schemaKeys.map((key) => [key.toLowerCase(), key])\n )\n\n validatorValue = Object.fromEntries(\n Object.entries(value).map(([key, value]) => [caseInsensitiveKeymap[key] || key, value])\n )\n }\n\n const result =\n options && options.validationFunction\n ? await options.validationFunction(schema, validatorValue)\n : // @ts-expect-error z4.$ZodType has safeParseAsync\n await schema.safeParseAsync(validatorValue)\n\n if (hook) {\n const hookResult = await hook({ data: validatorValue, ...result, target }, c)\n if (hookResult) {\n if (hookResult instanceof Response) {\n return hookResult\n }\n\n if ('response' in hookResult) {\n return hookResult.response\n }\n }\n }\n\n if (!result.success) {\n return c.json(result, 400)\n }\n\n return result.data as zInfer\n })\n}\n\nexport const zValidator: typeof zValidatorFunction = zValidatorFunction\n"],"mappings":";;AAuHA,SAAS,mBAYP,QACA,QACA,MACA,SAGgE;CAEhE,OAAO,UAAU,QAAQ,OAAO,OAAkC,MAAM;EACtE,IAAI,iBAAiB;EAIrB,IAAK,WAAW,YAAY,UAAU,UAAY,WAAW,YAAY,UAAU,QAAS;GAG1F,MAAM,aAAa,OAAO,KAAK,QAAQ,SAAS,OAAO,GAAG,QAAQ,OAAO,KAAK;GAC9E,MAAM,wBAAwB,OAAO,YACnC,WAAW,KAAK,QAAQ,CAAC,IAAI,YAAY,GAAG,GAAG,CAAC,CAClD;GAEA,iBAAiB,OAAO,YACtB,OAAO,QAAQ,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,sBAAsB,QAAQ,KAAK,KAAK,CAAC,CACxF;EACF;EAEA,MAAM,SACJ,WAAW,QAAQ,qBACf,MAAM,QAAQ,mBAAmB,QAAQ,cAAc,IAEvD,MAAM,OAAO,eAAe,cAAc;EAEhD,IAAI,MAAM;GACR,MAAM,aAAa,MAAM,KAAK;IAAE,MAAM;IAAgB,GAAG;IAAQ;GAAO,GAAG,CAAC;GAC5E,IAAI,YAAY;IACd,IAAI,sBAAsB,UACxB,OAAO;IAGT,IAAI,cAAc,YAChB,OAAO,WAAW;GAEtB;EACF;EAEA,IAAI,CAAC,OAAO,SACV,OAAO,EAAE,KAAK,QAAQ,GAAG;EAG3B,OAAO,OAAO;CAChB,CAAC;AACH;AAEA,MAAa,aAAwC"}