next-rest-framework
Version:
Next REST Framework - write type-safe, self-documenting REST APIs in Next.js
98 lines (97 loc) • 4.49 kB
JavaScript
;
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;