// lib/api.ts — shared helpers for route handlers. Error shape matches the kit: // { error: { code, message } } with a matching HTTP status. import { ZodError } from "zod"; import { AuthError } from "./auth"; export function ok(data: unknown, init?: ResponseInit): Response { return Response.json(data, init); } export function apiError(code: string, message: string, status: number): Response { return Response.json({ error: { code, message } }, { status }); } type Handler = (req: Request, ctx: { params: Promise> }) => Promise; // Wrap a handler so thrown ZodError/AuthError/Error become clean JSON responses. export function withErrors(handler: Handler): Handler { return async (req, ctx) => { try { return await handler(req, ctx); } catch (err) { if (err instanceof ZodError) { return apiError("invalid_input", "Validation failed", 400); } if (err instanceof AuthError) { return apiError("unauthorized", err.message, err.status); } const message = err instanceof Error ? err.message : "Unknown error"; return apiError("internal_error", message, 500); } }; } export async function parseJson(req: Request, schema: { parse(v: unknown): T }): Promise { let body: unknown; try { body = await req.json(); } catch { throw new ZodError([]); } return schema.parse(body); }