@oriun/next-api
Version:
Next.js API routes with Zod validation
42 lines (41 loc) • 1.57 kB
JavaScript
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,
]);
};
}