UNPKG

nuxt-procedures

Version:

Nuxt module to define and easily consume your backend API in a validated and type-safe way using procedures and Zod schemas.

44 lines (43 loc) 1.26 kB
import { defineEventHandler, readBody, createError } from "h3"; import z from "zod"; import superjson from "superjson"; export function defineProcedure({ input: inputSchema, output: outputSchema = z.void(), handler }) { const voidSchema = z.void(); const h = defineEventHandler(async (event) => { const inputParser = inputSchema ?? voidSchema; const inputRaw = superjson.deserialize(await readBody(event)); const parseResult = inputParser.safeParse(inputRaw); if (!parseResult.success) { throw createError({ status: 400, message: "Invalid procedure input", data: parseResult.error }); } const input = parseResult.data; const outputRaw = await handler(inputSchema ? { input, event } : { event }); const outputParseResult = outputSchema.safeParse(outputRaw); if (!outputParseResult.success) { throw createError({ status: 500, message: "Invalid procedure output", data: { error: outputParseResult.error, received: outputRaw } }); } return superjson.serialize(outputParseResult.data); }); const procedure = h; procedure.__procedureMetadata = { inputSchema, outputSchema }; return procedure; }