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
JavaScript
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;
}