import type { Context, MiddlewareHandler, Env } from 'hono' import { validator } from 'hono/validator' import type { z } from 'zod' import type { ZodSchema, ZodError } from 'zod' type ValidationTypes = 'json' | 'form' | 'query' | 'queries' type Hook = ( result: { success: true; data: T } | { success: false; error: ZodError }, c: Context ) => Response | Promise | void export const zValidator = < T extends ZodSchema, Type extends ValidationTypes, E extends Env, P extends string >( type: Type, schema: T, hook?: Hook> ): MiddlewareHandler }> => validator(type, (value, c) => { const result = schema.safeParse(value) if (hook) { const hookResult = hook(result, c) if (hookResult instanceof Response || hookResult instanceof Promise) { return hookResult } } if (!result.success) { return c.json(result, 400) } const data = result.data as z.infer return data })