{"version":3,"sources":["../../src/open-api/router.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-function-type */\nimport { NextResponse } from \"next/server\";\nimport type { SafeActionResult } from \"..\";\n\ntype RouteConfig = {\n\thandler: Function;\n\tclient: any;\n};\n\ntype RouteMethod = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n\ntype Routes = {\n\t[path: string]: {\n\t\t[method in RouteMethod]?: RouteConfig;\n\t};\n};\n\nfunction matchRoute(pathname: string, routePath: string) {\n\tconst pathParts = pathname.split(\"/\");\n\tconst routeParts = routePath.split(\"/\");\n\n\tif (pathParts.length !== routeParts.length) return false;\n\n\tconst pathParams: Record<string, string> = {};\n\tfor (let i = 0; i < routeParts.length; i++) {\n\t\tconst routePart = routeParts[i];\n\t\tconst pathPart = pathParts[i];\n\n\t\tif (routePart?.startsWith(\"{\") && routePart.endsWith(\"}\")) {\n\t\t\t// Dynamic segment (e.g., '{postId}')\n\t\t\tconst paramName = routePart.slice(1, -1); // Get the name inside the brackets\n\t\t\tif (pathPart) {\n\t\t\t\tpathParams[paramName] = pathPart;\n\t\t\t}\n\t\t} else if (routePart !== pathPart) {\n\t\t\t// If the static parts don't match, it's not the right route\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn pathParams;\n}\n\nexport const createOpenApiServerActionRouter = ({ pathPrefix = \"\" }) => {\n\tconst routes: Routes = {};\n\n\tconst router = {\n\t\tget(path: string, handler: Function, client: any) {\n\t\t\troutes[pathPrefix + path] = {\n\t\t\t\t...routes[pathPrefix + path],\n\t\t\t\tGET: { handler, client },\n\t\t\t};\n\t\t\treturn router;\n\t\t},\n\t\tpost(path: string, handler: Function, client: any) {\n\t\t\troutes[pathPrefix + path] = {\n\t\t\t\t...routes[pathPrefix + path],\n\t\t\t\tPOST: { handler, client },\n\t\t\t};\n\t\t\treturn router;\n\t\t},\n\t\tput(path: string, handler: Function, client: any) {\n\t\t\troutes[pathPrefix + path] = {\n\t\t\t\t...routes[pathPrefix + path],\n\t\t\t\tPUT: { handler, client },\n\t\t\t};\n\t\t\treturn router;\n\t\t},\n\t\tdelete(path: string, handler: Function, client: any) {\n\t\t\troutes[pathPrefix + path] = {\n\t\t\t\t...routes[pathPrefix + path],\n\t\t\t\tDELETE: { handler, client },\n\t\t\t};\n\t\t\treturn router;\n\t\t},\n\t\tgetRoutes() {\n\t\t\treturn routes;\n\t\t},\n\t};\n\n\treturn router;\n};\n\nfunction handleResult(result: SafeActionResult<any, undefined, []>) {\n\tif (result.data) {\n\t\treturn NextResponse.json(result.data, { status: 200 });\n\t}\n\n\tif (result.serverError) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\tconst code = typeof result.serverError === \"object\" ? result.serverError?.code || 500 : 500;\n\n\t\tconst responseBody = typeof result.serverError === \"object\" ? result.serverError : { message: result.serverError };\n\n\t\treturn NextResponse.json(responseBody, { status: code });\n\t}\n\n\treturn NextResponse.json({ message: \"Unknown error\" }, { status: 500 });\n}\n\nexport function createRouteHandlers(router: ReturnType<typeof createOpenApiServerActionRouter>) {\n\tconst routes = router.getRoutes();\n\n\tconst findRoute = (pathname: string, method: RouteMethod) => {\n\t\tfor (const routePath in routes) {\n\t\t\tconst pathParams = matchRoute(pathname, routePath);\n\t\t\tif (pathParams && routes[routePath]?.[method]) {\n\t\t\t\treturn { handler: routes[routePath][method].handler, pathParams };\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t};\n\n\treturn {\n\t\tasync GET(req: Request) {\n\t\t\tconst url = new URL(req.url);\n\t\t\tconst route = findRoute(url.pathname, \"GET\");\n\t\t\tif (route) {\n\t\t\t\tconst queryParams = Object.fromEntries(url.searchParams.entries());\n\n\t\t\t\tconst result = (await route.handler({\n\t\t\t\t\t...route.pathParams,\n\t\t\t\t\t...queryParams,\n\t\t\t\t})) as SafeActionResult<any, undefined, []>;\n\n\t\t\t\treturn handleResult(result);\n\t\t\t}\n\n\t\t\treturn NextResponse.json({ message: \"Route not found\" }, { status: 404 });\n\t\t},\n\t\tasync POST(req: Request) {\n\t\t\tconst url = new URL(req.url);\n\n\t\t\tconst route = findRoute(url.pathname, \"POST\");\n\t\t\tif (route) {\n\t\t\t\tconst queryParams = Object.fromEntries(url.searchParams.entries());\n\t\t\t\tconst body = (await req.json()) as Record<string, unknown>;\n\n\t\t\t\tconst result = (await route.handler({\n\t\t\t\t\t...route.pathParams,\n\t\t\t\t\t...queryParams,\n\t\t\t\t\t...body,\n\t\t\t\t})) as SafeActionResult<any, undefined, []>;\n\n\t\t\t\treturn handleResult(result);\n\t\t\t}\n\n\t\t\treturn NextResponse.json({ message: \"Route not found\" }, { status: 404 });\n\t\t},\n\t\tasync PUT(req: Request) {\n\t\t\tconst url = new URL(req.url);\n\t\t\tconst route = findRoute(url.pathname, \"PUT\");\n\n\t\t\tif (route) {\n\t\t\t\tconst queryParams = Object.fromEntries(url.searchParams.entries());\n\t\t\t\tconst body = (await req.json()) as Record<string, unknown>;\n\n\t\t\t\tconst result = (await route.handler({\n\t\t\t\t\t...route.pathParams,\n\t\t\t\t\t...queryParams,\n\t\t\t\t\t...body,\n\t\t\t\t})) as SafeActionResult<any, undefined, []>;\n\n\t\t\t\treturn handleResult(result);\n\t\t\t}\n\n\t\t\treturn NextResponse.json({ message: \"Route not found\" }, { status: 404 });\n\t\t},\n\t\tasync DELETE(req: Request) {\n\t\t\tconst url = new URL(req.url);\n\t\t\tconst route = findRoute(url.pathname, \"DELETE\");\n\n\t\t\tif (route) {\n\t\t\t\tconst queryParams = Object.fromEntries(url.searchParams.entries());\n\t\t\t\tconst result = (await route.handler({\n\t\t\t\t\t...route.pathParams,\n\t\t\t\t\t...queryParams,\n\t\t\t\t})) as SafeActionResult<any, undefined, []>;\n\n\t\t\t\treturn handleResult(result);\n\t\t\t}\n\n\t\t\treturn NextResponse.json({ message: \"Route not found\" }, { status: 404 });\n\t\t},\n\t};\n}\n"],"mappings":"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","names":[]}