import type { FastifyInstance } from 'fastify' import fp from 'fastify-plugin' import type { ZodAny, ZodError, ZodTypeAny } from 'zod' import { z } from 'zod' import { fromZodError } from 'zod-validation-error' declare module 'fastify' { // TODO: Copy ZodTypeProvider here (output) interface FastifyTypeProviderDefault { output: this['input'] extends ZodTypeAny ? z.infer : unknown } } function asError(zodError: ZodError) { return fromZodError(zodError, { prefix: null, issueSeparator: '\n' }) } async function plugin(server: FastifyInstance) { server.setValidatorCompiler(({ schema }) => data => { const result = schema.safeParse(data) if (result.success) return { value: result.data } return { error: asError(result.error) } }) server.setSerializerCompiler(({ schema }) => data => { const result = schema.safeParse(data) if (result.success) return JSON.stringify(result.data) throw asError(result.error) }) } export default fp(plugin)