import type { NextApiHandler, NextApiRequest, NextApiResponse } from "next" import * as z from "zod" import type { ZodSchema, ZodType } from "zod" type NextApiRequestWithParsedBody = NextApiRequest & { parsedBody?: T } export type NextApiHandlerWithParsedBody = ( req: NextApiRequestWithParsedBody, res: NextApiResponse ) => ReturnType export function withValidation( schema: T, handler: NextApiHandler ): ( req: NextApiRequest, res: NextApiResponse ) => Promise | NextApiHandlerWithParsedBody> { return async function (req: NextApiRequest, res: NextApiResponse) { try { const body = req.body await schema.parseAsync(body) ;(req as NextApiRequestWithParsedBody).parsedBody = body return handler(req, res) as Promise> } catch (error) { if (process.env.NODE_ENV === "development") { console.error(error) } if (error instanceof z.ZodError) { return res.status(422).json(error.issues) } return res.status(422).end() } } }