UNPKG

@velascosoftware/next-api-router

Version:
1 lines 12.9 kB
{"version":3,"sources":["../src/http/utils/metadata.ts","../src/http/decorators/RoutingMapping.ts","../src/http/routing/ApiRouter.ts","../src/next/createNextRoute.ts"],"names":["NextResponse","getReasonPhrase","StatusCodes","pathMatch"],"mappings":"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","file":"index.cjs","sourcesContent":["const store = new WeakMap<object, Map<unknown, unknown>>();\n\nfunction getMap(target: object) {\n let m = store.get(target);\n if (!m) { m = new Map(); store.set(target, m); }\n return m;\n}\n\nexport function defineMetadata(key: unknown, value: unknown, target: object) {\n const R: any = (globalThis as any).Reflect;\n if (R && typeof R.defineMetadata === 'function') {\n R.defineMetadata(key, value, target);\n return;\n }\n getMap(target).set(key, value);\n}\n\nexport function getMetadata<T = any>(key: unknown, target: object): T | undefined {\n const R: any = (globalThis as any).Reflect;\n if (R && typeof R.getMetadata === 'function') {\n return R.getMetadata(key, target) as T | undefined;\n }\n return getMap(target).get(key) as T | undefined;\n}\n","import { HTTP_METHOD } from \"../../types\";\nimport { Middleware } from \"../middlewares\";\nimport { defineMetadata, getMetadata } from \"../utils/metadata\";\n\nexport interface RouteDefinition {\n path: string;\n method: HTTP_METHOD;\n handlerName: string;\n}\n\nconst routesMetadataKey = Symbol('routes');\nconst routeMiddlewaresKey = Symbol('route_middlewares');\nconst controllerMiddlewaresKey = Symbol('controller_middlewares');\n\nexport function RequestMapping(path: string, method: HTTP_METHOD) {\n return function (target: any, propertyKey: string) {\n const routes: RouteDefinition[] = getMetadata(routesMetadataKey, target.constructor) || [];\n routes.push({\n path,\n method,\n handlerName: propertyKey,\n });\n \n defineMetadata(routesMetadataKey, routes, target.constructor);\n };\n}\n\nexport function Use(...middlewares: Middleware[]) {\n return function (target: any, propertyKey: string) {\n const map: Record<string, Middleware[]> =\n getMetadata(routeMiddlewaresKey, target.constructor) || {};\n map[propertyKey] = [...(map[propertyKey] || []), ...middlewares];\n defineMetadata(routeMiddlewaresKey, map, target.constructor);\n };\n}\n\nexport function UseController(...middlewares: Middleware[]) {\n return function (constructor: any) {\n const list: Middleware[] =\n getMetadata(controllerMiddlewaresKey, constructor) || [];\n defineMetadata(controllerMiddlewaresKey, [...list, ...middlewares], constructor);\n };\n}\n\nexport function getRoutes(target: any): RouteDefinition[] {\n return getMetadata(routesMetadataKey, target.constructor) || [];\n}\n\nexport function getControllerMiddlewares(target: any): Middleware[] {\n return getMetadata(controllerMiddlewaresKey, target.constructor) || [];\n}\n\nexport function getRouteMiddlewares(target: any): Record<string, Middleware[]> {\n return getMetadata(routeMiddlewaresKey, target.constructor) || {};\n}","import { getReasonPhrase, StatusCodes } from \"http-status-codes\";\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { match as pathMatch } from \"path-to-regexp\";\nimport { Middleware } from \"../middlewares\";\nimport { getControllerMiddlewares, getRouteMiddlewares, getRoutes } from \"../decorators/RoutingMapping\";\nimport { HTTP_METHOD } from '../../types';\n\ntype ErrorHandler = (\n error: unknown,\n req: NextRequest,\n params: Record<string, string>\n) => Promise<NextResponse> | NextResponse;\n\ninterface Route {\n method: HTTP_METHOD;\n path: string;\n matcher: ReturnType<typeof pathMatch>;\n handlers: Middleware[];\n onError?: ErrorHandler;\n}\n\nexport interface ApiRouteController {\n [key: string]: any;\n}\n\nexport class ApiRouter {\n private routes: Route[] = [];\n private basePath = '';\n private globalErrorHandler: ErrorHandler = (err, req) => {\n const reqPath = req.nextUrl.pathname;\n\n return NextResponse.json({\n success: false,\n message: getReasonPhrase(StatusCodes.INTERNAL_SERVER_ERROR),\n path: reqPath,\n }, { status: StatusCodes.INTERNAL_SERVER_ERROR });\n }\n\n constructor(basePath = '', controller: ApiRouteController) {\n this.basePath = basePath;\n\n const controllerRoutes = getRoutes(controller);\n const classMiddlewares = getControllerMiddlewares(controller);\n const routeMwsMap = getRouteMiddlewares(controller);\n\n for (const route of controllerRoutes) {\n const fullPath = `${this.basePath}${route.path}`.replace(/\\/+$/, '');\n const matcher = pathMatch(fullPath, { decode: decodeURIComponent });\n const handler: Middleware = controller[route.handlerName].bind(controller);\n\n const methodMiddlewares = routeMwsMap[route.handlerName] || [];\n\n this.routes.push({\n method: route.method,\n path: fullPath,\n matcher,\n handlers: [...classMiddlewares, ...methodMiddlewares, handler],\n })\n }\n }\n\n onError(handler: ErrorHandler) {\n this.globalErrorHandler = handler;\n }\n\n async handle(req: NextRequest): Promise<NextResponse> {\n const reqMethod = req.method?.toUpperCase();\n const reqPath = req.nextUrl.pathname.replace(/^\\/api/, '');\n\n for (const route of this.routes) {\n if (route.method !== reqMethod) continue;\n const match = route.matcher(reqPath);\n if (match) {\n const params = match.params as Record<string, string>;\n const stack = [...route.handlers];\n\n const execute = async (i: number): Promise<NextResponse> => {\n if (i < stack.length - 1) {\n return stack[i](req, params, () => execute(i + 1));\n }\n return stack[i](req, params, () => execute(i));\n };\n\n try {\n return await execute(0);\n } catch (err) {\n if (route.onError) {\n return await route.onError(err, req, params);\n }\n if (this.globalErrorHandler) {\n return await this.globalErrorHandler(err, req, params);\n }\n\n return NextResponse.json({\n success: false,\n message: getReasonPhrase(StatusCodes.INTERNAL_SERVER_ERROR)\n }, { status: StatusCodes.INTERNAL_SERVER_ERROR });\n }\n }\n }\n\n return NextResponse.json({ sucess: false, message: 'Not Found' }, { status: StatusCodes.NOT_FOUND });\n }\n}","import type { NextRequest } from 'next/server';\nimport { ApiRouteController, ApiRouter } from '../http/routing/ApiRouter';\n\ntype NextHandler = (req: NextRequest) => Promise<Response> | Response;\n\ntype RouterRecords = {\n GET: NextHandler,\n POST: NextHandler,\n PUT: NextHandler,\n PATCH: NextHandler,\n DELETE: NextHandler,\n OPTIONS: NextHandler,\n HEAD: NextHandler\n}\n\nexport function createNextRoute(controller: ApiRouteController, basePath = ''): RouterRecords {\n const router = new ApiRouter(basePath, controller);\n const handle: NextHandler = (req) => router.handle(req);\n\n return {\n GET: handle,\n POST: handle,\n PUT: handle,\n PATCH: handle,\n DELETE: handle,\n OPTIONS: handle,\n HEAD: handle,\n };\n}"]}