UNPKG

@oriun/next-api

Version:

Next.js API routes with Zod validation

42 lines (41 loc) 1.57 kB
import { bodyParser, cookiesParser, paramsParser, queryParser } from "./parser"; import { responseParser } from "./response"; import { compose } from "./composer"; export function api(handler, schemas = {}, errorHandlers = []) { return async (request, _variables) => { try { const body = await bodyParser(request, schemas.body); const query = queryParser(request, schemas.query); const params = paramsParser(_variables, schemas.params); const cookies = cookiesParser(request, schemas.cookies); const variables = { body, query, params, cookies, }; const response = await handler.call(null, variables, request); return responseParser(response, request); } catch (e) { if (e instanceof Response) return e; for (const errorHandler of errorHandlers) { const response = await errorHandler(e, _variables, request); if (response) return response; } return new Response(e.message, { status: 500, }); } }; } export function createAPI({ middlewares = [], errorHandlers: globalErrorHandlers = [], } = {}) { return function (handler, schemas = {}, routeErrorHandlers = []) { return api(compose(handler, ...middlewares), schemas, [ ...routeErrorHandlers, ...globalErrorHandlers, ]); }; }