UNPKG

next-rest-framework

Version:

Next REST Framework - write type-safe, self-documenting REST APIs in Next.js

98 lines (97 loc) 4.49 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.defineRoute = void 0; const server_1 = require("next/server"); const constants_1 = require("./constants"); const utils_1 = require("./utils"); const defineRoute = ({ config }) => { return (methodHandlers = {}) => { return async (req, context) => { try { const { method, headers, nextUrl } = req; const { pathname } = nextUrl; const { openApiJsonPath, openApiYamlPath, swaggerUiPath, exposeOpenApiSpec } = config; if ([openApiJsonPath, openApiYamlPath, swaggerUiPath].includes(pathname) && exposeOpenApiSpec && method === constants_1.ValidMethod.GET) { (0, utils_1.handleReservedPathWarnings)({ pathname, config }); } if (headers.get('user-agent') === constants_1.NEXT_REST_FRAMEWORK_USER_AGENT) { const route = decodeURIComponent(pathname ?? ''); try { const nextRestFrameworkPaths = (0, utils_1.getPathsFromMethodHandlers)({ config, methodHandlers, route }); return server_1.NextResponse.json({ nextRestFrameworkPaths }, { status: 200 }); } catch (error) { throw Error(`OpenAPI spec generation failed for route: ${route} ${error}`); } } const methodHandler = methodHandlers[method]; if (!methodHandler) { return server_1.NextResponse.json({ message: constants_1.DEFAULT_ERRORS.methodNotAllowed }, { status: 405, headers: { Allow: Object.keys(methodHandlers).join(', ') } }); } const { input, handler } = methodHandler; if (input) { const { body: bodySchema, query: querySchema, contentType } = input; if (headers.get('content-type')?.split(';')[0] !== contentType) { return server_1.NextResponse.json({ message: constants_1.DEFAULT_ERRORS.invalidMediaType }, { status: 415 }); } if (bodySchema) { const body = await req.json(); const validateBody = await (0, utils_1.validateSchema)?.({ schema: bodySchema, obj: body }); if (validateBody) { const { valid, errors } = validateBody; if (!valid) { return server_1.NextResponse.json({ message: `Invalid request body: ${errors}` }, { status: 400 }); } } } if (querySchema) { const validateQuery = await (0, utils_1.validateSchema)?.({ schema: querySchema, obj: context.params }); if (validateQuery) { const { valid, errors } = validateQuery; if (!valid) { return server_1.NextResponse.json({ message: `Invalid query parameters: ${errors}` }, { status: 400 }); } } } } return await handler(req, context); } catch (error) { const res = await config.errorHandler?.({ req, error }); if (res) { return res; } else { return server_1.NextResponse.json({ message: constants_1.DEFAULT_ERRORS.unexpectedError }, { status: 500 }); } } }; }; }; exports.defineRoute = defineRoute;