UNPKG

@visulima/api-platform

Version:

Visulima API platform is a set of tools to build and consume web APIs

1 lines 48.1 kB
{"version":3,"sources":["../src/framework/cli/command/list/routes/express/map-keys-to-path.ts","../src/framework/cli/command/list/routes/express/path-regex-parser.ts","../src/framework/cli/command/list/routes/express/express-path-parser.ts","../src/framework/cli/command/list/routes/express-routes.ts","../src/framework/cli/command/list/routes/fastify-routes.ts","../src/framework/cli/command/list/routes/hapi-routes.ts","../src/framework/cli/command/list/routes/koa-routes.ts","../src/framework/cli/command/list/routes/next/api-route-file-parser.ts","../src/framework/cli/command/list/utils.ts","../src/framework/cli/command/list/routes/next/collect-api-route-files.ts","../src/framework/cli/command/list/get-routes.ts","../src/framework/cli/command/list/routes/routes-group-by.ts","../src/framework/cli/command/list/routes/routes-render.ts","../src/framework/cli/command/list/list-command.ts"],"names":["mapKeysToPath","layerRegexPath","keys","convertedSubPath","key","map_keys_to_path_default","pathRegexParser","mappedPath","match","path_regex_parser_default","parseRouteLayer","layer","basePath","lastRequestHandler","pathParameters","filtered","element","path","traverse","routes","l","expressPathParser","app","router","express_path_parser_default","expressRoutes","route","express_routes_default","getSegment","line","getMethod","fastifyRoutes","lines","segments","allSegments","index","segment","entries","item","methods","spaces","depth","isRoute","seg","_index","previousArray","r","method","fastify_routes_default","hapiRoutes","coreRoutes","hapi_routes_default","koaRoutes","middlewareFunction","koa_routes_default","extensionRegex","apiRouteFileParser","apiRouteFile","cwd","verbose","toNamespacedPath","cwdPath","nodeCwd","specs","parsedJsDocumentFile","parseFile","jsDocumentCommentsToOpenApi","parsedSwaggerJsDocumentFile","swaggerJsDocumentCommentsToOpenApi","readFileSync","spec","pathSpec","methodSpec","api_route_file_parser_default","ALLOWED_EXTENSIONS","getAppWorkingDirectoryPath","appFilePath","lastParsedPath","parse","readdirSync","getFrameworkName","directory","packageJSONFilePath","dependencies","getApp","appExport","frameworkName","isDirectory","statSync","collectApiRouteFiles","apiFolderPath","join","collect","collect_api_route_files_default","getRoutes","appOrPath","apiRouteFiles","routesGroupBy","list","keyGetter","map","collection","routes_group_by_default","renderRoute","routePath","colorMap","chalk","methodText","coloredMethod","spacesCount","dotsCount","dots","routeText","routesRender","routesMap","options","routes_render_default","listCommand","framework","frameworkPath","process","existsSync","appWorkingDirectoryPath","extname","environmentFilePath","isTypeScriptApp","tscPath","execSync","error","rmSync","appJsFilePath","defaultExport","ipath","epath","groupedMap","counter","groupedRoutes","renderedRoute","list_command_default"],"mappings":"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","file":"chunk-JPUMGEAE.mjs","sourcesContent":["import type { ExpressRegex, Key } from \"./types\";\n\n/**\n * Map's the keys/path variables to the regex inside a given path\n * @param layerRegexPath The regex for a router with path parameters\n * @param keys The keys that represent the path parameters\n * @returns The regex for a path variable converted to original string on the express route\n */\nconst mapKeysToPath = (layerRegexPath: ExpressRegex, keys: Key[]): string => {\n if (keys.length === 0) {\n throw new Error(\"must include at least one key to map\");\n }\n\n let convertedSubPath = layerRegexPath.toString();\n\n keys.forEach((key) => {\n convertedSubPath = key.optional\n ? convertedSubPath.replace(\"(?:\\\\/([^\\\\/]+?))?\\\\\", `/:${key.name}?`)\n : convertedSubPath.replace(String.raw`(?:([^\\/]+?))`, `:${key.name}`);\n });\n\n return convertedSubPath\n .replace(String.raw`/?(?=\\/|$)/i`, \"\")\n .replace(\"/^\", \"\")\n .replaceAll(\"\\\\\", \"\")\n .replaceAll(/\\/{2,}/gu, \"/\");\n};\n\nexport default mapKeysToPath;\n","import mapKeysToPath from \"./map-keys-to-path\";\nimport type { ExpressRegex, Key } from \"./types\";\n\n/**\n * Parses an express layer's regex and converts it to the original format seen in code.\n * @param layerRegexPath The layer's regex pattern\n * @param keys The keys that represent the layer's path parameters\n * @returns The path string for that layer\n * Code inspired and modify from:\n * https://github.com/expressjs/express/issues/3308#issuecomment-300957572\n */\nconst pathRegexParser = (layerRegexPath: ExpressRegex | string, keys: Key[]): string => {\n if (typeof layerRegexPath === \"string\") {\n return layerRegexPath;\n }\n\n if (layerRegexPath.fast_slash) {\n return \"\";\n }\n\n if (layerRegexPath.fast_star) {\n return \"*\";\n }\n\n let mappedPath = \"\";\n\n if (keys.length > 0) {\n mappedPath = mapKeysToPath(layerRegexPath, keys);\n }\n\n const match = /^\\/\\^((?:\\\\[$()*+./?[\\\\\\]^{|}]|[^$()*+./?[\\\\\\]^{|}])*)\\$\\//u.exec(\n layerRegexPath\n .toString()\n .replace(String.raw`\\/?`, \"\")\n .replace(String.raw`(?=\\/|$)`, \"$\"),\n ) as string[];\n\n if (Array.isArray(match) && match.length > 1) {\n return (match[1] as string).replaceAll(/\\\\(.)/gu, \"$1\").slice(1);\n }\n\n if (mappedPath) {\n return mappedPath.slice(1);\n }\n\n return layerRegexPath.toString();\n};\n\nexport default pathRegexParser;\n","import type { Express, Router } from \"express\";\n\nimport pathRegexParser from \"./path-regex-parser\";\nimport type { Key, Layer, Parameter, Route, RouteMetaData } from \"./types\";\n\n/**\n * Parses a route object. Route objects are the leafs of an express router tree\n * @param layer The layer of this route object - represents the stack of middleware and other metadata\n * @param keys The full set of keys for this particular route\n * @param basePath The base path as it was initial declared for this route\n * @returns A ExpressPath object holding the metadata for a given route\n */\nconst parseRouteLayer = (layer: Required<Layer>, keys: Key[], basePath: string): RouteMetaData => {\n const lastRequestHandler = layer.route.stack.at(-1) as Layer;\n const pathParameters: Parameter[] = keys.map((key) => {\n return { in: \"path\", name: key.name, required: !key.optional };\n });\n\n const filtered = layer.route.stack.filter((element) => (element.handle as Route).metadata);\n\n if (filtered.length > 1) {\n throw new Error(\"Only one metadata middleware is allowed per route\");\n }\n\n const path = (basePath + layer.route.path).replaceAll(/\\/{2,}/gu, \"/\");\n\n if (filtered.length === 0) {\n return { method: lastRequestHandler.method, path, pathParams: pathParameters };\n }\n\n return {\n metadata: ((filtered[0] as Layer).handle as Route).metadata,\n method: lastRequestHandler.method,\n path,\n pathParams: pathParameters,\n };\n};\n\n/**\n * Recursive traversal method for the express router and middleware tree.\n * @param routes The array of routes to add to\n * @param path The current path segment that we have traversed so far\n * @param layer The current 'layer' of the router tree\n * @param keys The keys for the parameter's in the current path branch of the traversal\n * @returns void - base case saves result to internal object\n */\nconst traverse = (routes: RouteMetaData[], path: string, layer: Layer, keys: Key[]): void => {\n // eslint-disable-next-line no-param-reassign\n keys = [...keys, ...layer.keys];\n\n if (layer.name === \"router\" && layer.handle?.stack !== undefined) {\n for (const l of layer.handle.stack) {\n // eslint-disable-next-line no-param-reassign\n path = path || \"\";\n\n traverse(routes, `${path}/${pathRegexParser(layer.regexp, layer.keys)}`, l as Layer, keys);\n }\n }\n\n if (!layer.route || layer.route.stack.length === 0) {\n return;\n }\n\n routes.push(parseRouteLayer(layer as Required<Layer>, keys, path));\n};\n\n// @TODO use this to parse the express swagger\n\n/**\n * Parses an Express app and generates list of routes with metadata.\n *\n * Can Parse:\n * - Nested Routers and Complex Express Projects\n * - Optional parameters e.g. /:name?\n * - Complex Matching routes e.g. /ma*tch, /ex(ab)?mple\n * - Regex routes e.g. /\\/abc|\\/xyz/\n * - Array of paths e.g. app.get(['/abc', '/xyz']) -> /abc,xyz/\n * @param app The Express app reference. Must be used after all routes have been attached\n * @returns List of routes for this express app with meta-data that has been picked up\n */\nconst expressPathParser = (app: Express): RouteMetaData[] => {\n // eslint-disable-next-line no-underscore-dangle\n const router: Router = app._router || app.router;\n const routes: RouteMetaData[] = [];\n\n for (const layer of router.stack) {\n // @TODO: revisit this type assertion\n traverse(routes, \"\", layer as unknown as Layer, []);\n }\n\n return routes;\n};\n\nexport default expressPathParser;\n","import type { Express } from \"express\";\n\nimport expressPathParser from \"./express/express-path-parser\";\nimport type { RouteMetaData } from \"./express/types\";\nimport type { Route } from \"./types\";\n\nconst expressRoutes = (app: Express): Route[] => {\n const routes: Route[] = [];\n\n expressPathParser(app).forEach((route: RouteMetaData) => {\n routes.push({\n file: \"unknown\",\n method: route.method.toUpperCase(),\n path: route.path,\n tags: [],\n });\n });\n\n return routes;\n};\n\nexport default expressRoutes;\n","import type { FastifyInstance } from \"fastify\";\n\nimport type { Route } from \"./types\";\n\n// \"<spaces> activity (GET)\" -> \"activity\"\nconst getSegment = (line: string) => line.replaceAll(/ \\(.*\\)/gu, \"\").trim();\n\n// \"<spaces> activity (GET)\" -> \"GET\"\nconst getMethod = (line: string) => (line.trim().split(\" \")[1] as string).slice(1, -1);\n\ninterface Segment {\n depth: number;\n index: number;\n isRoute: boolean;\n methods: string[] | null;\n segment: string;\n}\n\nconst fastifyRoutes = (app: FastifyInstance): Route[] => {\n const printedRoutes = app\n .printRoutes()\n .replaceAll(/[─│└├]/gu, \" \")\n .trimEnd();\n\n const lines = printedRoutes.split(\"\\n\");\n\n // eslint-disable-next-line unicorn/no-array-reduce\n const segments = lines.reduce((allSegments: Segment[], line, index) => {\n const segment = getSegment(line);\n const previousSegment = getSegment(lines[index - 1] ?? \"\");\n\n if (previousSegment === segment) {\n const entries: Segment[] = allSegments.filter((item) => item.index < index && item.segment === segment);\n\n const { methods } = entries.at(-1) as Segment;\n\n if (methods !== null) {\n methods.push(getMethod(line));\n }\n\n return allSegments;\n }\n\n // spaces preceding segment / not counting single space between segment and (METHOD)\n const spaces = line.replaceAll(/ \\(.*\\)/gu, \"\").match(/ /gu);\n\n if (spaces === null) {\n throw new Error(\"Invalid spaces\");\n }\n\n const depth = spaces.length / 4;\n const isRoute = line.includes(\"(\");\n const methods = isRoute ? [getMethod(line)] : null;\n\n allSegments.push({\n depth,\n index,\n isRoute,\n methods,\n segment,\n });\n\n return allSegments;\n }, []);\n\n const routes: Route[] = [];\n\n segments\n .filter((item) => item.isRoute)\n .forEach((item) => {\n const ancestorSegments = segments\n .filter((seg) => seg.index < item.index && seg.depth < item.depth)\n // eslint-disable-next-line unicorn/prefer-array-some\n .filter((seg, _index, previousArray) => !previousArray.find((segment) => segment.depth === seg.depth && segment.index > seg.index));\n\n const route = [...ancestorSegments.map((r) => r.segment), item.segment].join(\"\");\n\n if (item.methods === null) {\n throw new Error(\"Invalid methods\");\n }\n\n item.methods.forEach((method: string) => {\n routes.push({\n file: \"unknown\",\n method: method.toUpperCase(),\n path: route,\n tags: [],\n });\n });\n });\n\n return routes;\n};\n\nexport default fastifyRoutes;\n","import type { Server } from \"@hapi/hapi\";\n\nimport type { Route } from \"./types\";\n\nconst hapiRoutes = (app: Server): Route[] => {\n // @ts-expect-error TS2339: Property '_core' does not exist on type 'Server'. Internal API.\n // eslint-disable-next-line no-underscore-dangle\n const core = app._core as any;\n const coreRoutes = core.router.routes;\n const routes: Route[] = [];\n\n [...coreRoutes.keys()].forEach((method: string) => {\n coreRoutes.get(method).routes.forEach((route: any) => {\n routes.push({\n file: \"unknown\",\n method: route.route.method.toUpperCase(),\n path: route.path,\n tags: [],\n });\n });\n });\n\n return routes;\n};\n\nexport default hapiRoutes;\n","import type Koa from \"koa\";\n\nimport type { Route } from \"./types\";\n\nconst koaRoutes = (app: Koa): Route[] => {\n const routes: Route[] = [];\n\n app.middleware\n .filter((middlewareFunction) => (middlewareFunction as any).router)\n\n .flatMap((middlewareFunction) => (middlewareFunction as any).router.stack)\n .forEach((route) => {\n routes.push({\n file: \"unknown\",\n method: route.methods.join(\"|\").toUpperCase(),\n path: route.path,\n tags: [],\n });\n });\n\n return routes;\n};\n\nexport default koaRoutes;\n","import { readFileSync } from \"node:fs\";\nimport { cwd as nodeCwd } from \"node:process\";\n\nimport type { OpenApiObject } from \"@visulima/jsdoc-open-api\";\nimport { jsDocumentCommentsToOpenApi, parseFile, swaggerJsDocumentCommentsToOpenApi } from \"@visulima/jsdoc-open-api\";\nimport { toNamespacedPath } from \"@visulima/path\";\n\nimport type { Route } from \"../types\";\n\nconst extensionRegex = /\\.(js|ts|mjs|cjs)$/u;\n\nconst apiRouteFileParser = (apiRouteFile: string, cwd: string, verbose = false): Route[] => {\n // eslint-disable-next-line no-param-reassign\n apiRouteFile = toNamespacedPath(apiRouteFile);\n\n const cwdPath = toNamespacedPath(nodeCwd());\n\n let specs: OpenApiObject[] = [];\n\n const parsedJsDocumentFile = parseFile(apiRouteFile, jsDocumentCommentsToOpenApi, verbose);\n\n specs = [...specs, ...parsedJsDocumentFile.map((item) => item.spec)];\n\n const parsedSwaggerJsDocumentFile = parseFile(apiRouteFile, swaggerJsDocumentCommentsToOpenApi, verbose);\n\n specs = [...specs, ...parsedSwaggerJsDocumentFile.map((item) => item.spec)];\n\n const routes: Route[] = [];\n\n if (specs.length === 0) {\n const apiRouteFileContent = readFileSync(apiRouteFile, \"utf8\");\n\n apiRouteFileContent.split(/\\r?\\n/u).forEach((line) => {\n const match = /[=aces|]+\\s[\"'|](GET|POST|PUT|PATCH|HEAD|DELETE|OPTIONS)[\"'|]/u.exec(line);\n\n if (match) {\n let [, method] = match;\n\n if (method === \"GET\") {\n method = \"GET|HEAD\";\n }\n\n routes.push({\n file: apiRouteFile.replace(`${cwdPath}/`, \"\"),\n method: method as string,\n path: toNamespacedPath(apiRouteFile.replace(cwd, \"\").replace(extensionRegex, \"\")),\n tags: [],\n });\n }\n });\n\n if (routes.length === 0) {\n routes.push({\n file: apiRouteFile.replace(`${cwdPath}/`, \"\"),\n method: \"GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS\",\n path: toNamespacedPath(apiRouteFile.replace(cwd, \"\").replace(extensionRegex, \"\")),\n tags: [],\n });\n }\n\n return routes;\n }\n\n specs.forEach((spec) => {\n const paths = Object.entries(spec?.paths ?? {});\n\n paths.forEach(([path, pathSpec]) => {\n const methods = Object.entries(pathSpec);\n\n methods.forEach(([method, methodSpec]) => {\n routes.push({\n file: apiRouteFile.replace(`${cwdPath}/`, \"\"),\n method: method.toUpperCase(),\n path: toNamespacedPath(path),\n tags: methodSpec.tags,\n });\n });\n });\n });\n\n return routes;\n};\n\nexport default apiRouteFileParser;\n","import { readdirSync, readFileSync } from \"node:fs\";\n\nimport { parse } from \"@visulima/path\";\nimport type { PackageJson } from \"type-fest\";\n\ninterface AppExport {\n [key: string]: any;\n app?: string | { app?: string };\n}\n\nexport const ALLOWED_EXTENSIONS = [\".js\", \".ts\", \".mjs\", \".cjs\"];\n\nexport const getAppWorkingDirectoryPath = (appFilePath: string): string | null => {\n let lastParsedPath = parse(appFilePath);\n\n // Once the following condition returns false it means we traversed the whole file system\n // eslint-disable-next-line no-loops/no-loops\n while (lastParsedPath.base && lastParsedPath.root !== lastParsedPath.dir) {\n const parentDirectionItems = readdirSync(lastParsedPath.dir);\n\n const packageJSON = parentDirectionItems.find((item) => item === \"package.json\");\n\n if (packageJSON) {\n return lastParsedPath.dir;\n }\n\n lastParsedPath = parse(lastParsedPath.dir);\n }\n\n return null;\n};\n\nexport const getFrameworkName = (directory: string): \"express\" | \"fastify\" | \"hapi\" | \"koa\" | \"next\" | null => {\n const packageJSONFilePath = `${directory}/package.json`;\n\n const { dependencies } = JSON.parse(readFileSync(packageJSONFilePath).toString()) as PackageJson;\n\n if (dependencies?.express) {\n return \"express\";\n }\n\n if (dependencies?.koa && (dependencies[\"@koa/router\"] || dependencies[\"koa-router\"])) {\n return \"koa\";\n }\n\n if (dependencies?.next) {\n return \"next\";\n }\n\n if (dependencies?.[\"@hapi/hapi\"]) {\n return \"hapi\";\n }\n\n if (dependencies?.fastify) {\n return \"fastify\";\n }\n\n return null;\n};\n\nexport const getApp = (appExport: AppExport, frameworkName: \"express\" | \"fastify\" | \"hapi\" | \"koa\" | \"next\" | null): AppExport | string | null => {\n const isExportEmpty = Object.keys(appExport).length === 0;\n\n if (isExportEmpty) {\n return null;\n }\n\n if (frameworkName === \"hapi\") {\n if (typeof (appExport.app as { app?: string }).app === \"string\") {\n return appExport.app as { app: string };\n }\n\n return appExport;\n }\n\n return appExport.app ?? appExport;\n};\n","import { statSync } from \"node:fs\";\n\nimport { collect } from \"@visulima/fs\";\nimport { join } from \"@visulima/path\";\n\nimport { ALLOWED_EXTENSIONS } from \"../../utils\";\n\nconst isDirectory = (path: string): boolean => {\n try {\n return statSync(path).isDirectory();\n } catch {\n return false;\n }\n};\n\nconst collectApiRouteFiles = async (path = \"\"): Promise<string[]> => {\n let apiFolderPath = join(path, \"pages/api\");\n\n // src/pages will be ignored if pages is present in the root directory\n if (!isDirectory(apiFolderPath)) {\n apiFolderPath = join(path, \"src/pages/api\");\n\n if (!isDirectory(apiFolderPath)) {\n return [];\n }\n }\n\n return collect(apiFolderPath, {\n extensions: ALLOWED_EXTENSIONS,\n includeDirs: false,\n });\n};\n\nexport default collectApiRouteFiles;\n","import type { Server } from \"@hapi/hapi\";\nimport type { Express } from \"express\";\nimport type { FastifyInstance } from \"fastify\";\nimport type Koa from \"koa\";\n\nimport expressRoutes from \"./routes/express-routes\";\nimport fastifyRoutes from \"./routes/fastify-routes\";\nimport hapiRoutes from \"./routes/hapi-routes\";\nimport koaRoutes from \"./routes/koa-routes\";\nimport apiRouteFileParser from \"./routes/next/api-route-file-parser\";\nimport collectApiRouteFiles from \"./routes/next/collect-api-route-files\";\nimport type { Route } from \"./routes/types\";\n\nexport type FrameworkName = \"express\" | \"fastify\" | \"hapi\" | \"koa\" | \"next\" | \"unknown\";\nexport const getRoutes = async (\n appOrPath: Express | FastifyInstance | Koa | Server | string,\n frameworkName: FrameworkName,\n verbose: boolean,\n): Promise<Route[] | null> => {\n if (frameworkName === \"express\") {\n return expressRoutes(appOrPath as Express);\n }\n\n if (frameworkName === \"koa\") {\n return koaRoutes(appOrPath as Koa);\n }\n\n if (frameworkName === \"hapi\") {\n return hapiRoutes(appOrPath as Server);\n }\n\n if (frameworkName === \"fastify\") {\n return fastifyRoutes(appOrPath as FastifyInstance);\n }\n\n if (frameworkName === \"next\") {\n const apiRouteFiles = await collectApiRouteFiles(appOrPath as string);\n\n if (apiRouteFiles.length === 0) {\n throw new Error(`No API routes found, in \"${appOrPath}\".`);\n }\n\n return apiRouteFiles.flatMap((apiRouteFile) => apiRouteFileParser(apiRouteFile, appOrPath as string, verbose));\n }\n\n return null;\n};\n","import type { Route } from \"./types\";\n\nconst routesGroupBy = (list: Route[], keyGetter: (item: Route) => keyof Route): Map<string, Route[]> => {\n const map = new Map<string, Route[]>();\n\n list.forEach((item) => {\n const key = keyGetter(item);\n const collection = map.get(key);\n\n if (collection) {\n collection.push(item);\n } else {\n map.set(key, [item]);\n }\n });\n\n return map;\n};\n\nexport default routesGroupBy;\n","import chalk from \"chalk\";\n\nimport type { Route } from \"./types\";\n\nconst renderRoute = (method: string, routePath: string): string => {\n const colorMap = {\n ANY: chalk.redBright,\n DELETE: chalk.redBright,\n GET: chalk.blue,\n HEAD: chalk.hex(\"#6C7280\"),\n OPTIONS: chalk.hex(\"#6C7280\"),\n PATCH: chalk.yellow,\n POST: chalk.yellow,\n PUT: chalk.yellow,\n };\n\n let methodText: string;\n\n if (method === \"GET|HEAD\") {\n methodText = `${chalk.blue(\"GET\")}${chalk.grey(\"|HEAD\")}`;\n } else {\n const coloredMethod = colorMap[method as keyof typeof colorMap](method);\n\n methodText = method === \"GET\" ? `${coloredMethod}${chalk.grey(\"|HEAD\")}` : coloredMethod;\n }\n\n const spacesCount = method === \"GET\" ? 6 : 14 - method.length;\n const spaces = Array.from({ length: spacesCount }).fill(\" \").join(\"\");\n\n const dotsCount = process.stdout.columns - 16 - routePath.length - 4;\n const dots = dotsCount > 0 ? Array.from({ length: dotsCount }).fill(\".\").join(\"\") : \"\";\n\n const routeText = routePath\n .split(\"/\")\n .map((segment) => {\n const isDynamicSegment = [\":\", \"[\"].includes(segment[0] ?? \"\");\n\n return isDynamicSegment ? chalk.yellowBright(segment) : segment;\n })\n .join(\"/\");\n\n return ` ${methodText}${spaces}${routeText}${chalk.grey(dots)}`;\n};\n\nconst routesRender = (routesMap: Route[], options: { methods?: string[] } = {}): (string | undefined)[] =>\n routesMap\n .map((route) => {\n if (Array.isArray(options.methods) && options.methods.includes(route.method)) {\n return;\n }\n\n if (route.method === \"GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS\") {\n // eslint-disable-next-line no-param-reassign\n route.method = \"ANY\";\n }\n\n // eslint-disable-next-line consistent-return\n return renderRoute(route.method, route.path.replace(\"/pages\", \"\"));\n })\n .filter(Boolean);\n\nexport default routesRender;\n","import { execSync } from \"node:child_process\";\nimport { existsSync, rmSync, statSync } from \"node:fs\";\nimport process from \"node:process\";\n\nimport { extname, join } from \"@visulima/path\";\nimport chalk from \"chalk\";\n\nimport { getRoutes } from \"./get-routes\";\nimport routesGroupBy from \"./routes/routes-group-by\";\nimport routesRender from \"./routes/routes-render\";\nimport type { Route } from \"./routes/types\";\nimport { ALLOWED_EXTENSIONS, getApp, getAppWorkingDirectoryPath, getFrameworkName } from \"./utils\";\n\ninterface RenderOptions {\n excludePaths: string[];\n group: string;\n includePaths: string[];\n methods: string[];\n verbose: boolean;\n}\n\nconst listCommand = async (\n framework: \"express\" | \"fastify\" | \"hapi\" | \"koa\" | \"next\" | undefined,\n path: string,\n options: Partial<RenderOptions> = {},\n // eslint-disable-next-line sonarjs/cognitive-complexity\n): Promise<void> => {\n const frameworkPath = join(process.cwd(), path);\n\n if (!existsSync(frameworkPath)) {\n throw new Error(\"No such file, invalid path provided.\");\n }\n\n const appWorkingDirectoryPath = getAppWorkingDirectoryPath(frameworkPath);\n\n if (!appWorkingDirectoryPath) {\n throw new Error(\"Please initialize local package.json.\");\n }\n\n if (framework === undefined) {\n const frameworkName = getFrameworkName(appWorkingDirectoryPath);\n\n if (!frameworkName) {\n throw new Error(\"Couldn't detect supported back-end framework.\");\n }\n\n // eslint-disable-next-line no-param-reassign\n framework = frameworkName;\n }\n\n let routes: Route[] | null = null;\n\n if (framework === \"next\") {\n routes = await getRoutes(frameworkPath, \"next\", options.verbose ?? false);\n } else {\n if (!statSync(frameworkPath).isFile()) {\n throw new Error(`${frameworkPath} is directory, but file expected.`);\n }\n\n if (!ALLOWED_EXTENSIONS.includes(extname(frameworkPath))) {\n throw new Error(\"Please specify application .ts/.js/.mjs/.cjs file.\");\n }\n\n const environmentFilePath = `${appWorkingDirectoryPath}/.env`;\n\n if (existsSync(environmentFilePath)) {\n // Loads environment vars in the current process so application\n // that depends on them can be loaded properly below\n const dotEnvironmentFilePath = `${appWorkingDirectoryPath}/node_modules/dotenv/lib/main.js`;\n const dotenv = await import(dotEnvironmentFilePath);\n\n dotenv.config({ path: environmentFilePath });\n }\n\n const isTypeScriptApp = extname(frameworkPath) === \".ts\";\n const tscPath = join(appWorkingDirectoryPath, \"node_modules/.bin/tsc\");\n\n if (isTypeScriptApp && !existsSync(tscPath)) {\n throw new Error(`Please install typescript in ${appWorkingDirectoryPath}`);\n }\n\n try {\n if (isTypeScriptApp) {\n // || rm -r ./framework-list removes framework-list directory in case tsc fails\n\n try {\n execSync(`${tscPath} --outDir framework-list >&2`, { cwd: appWorkingDirectoryPath });\n } catch (error: any) {\n // eslint-disable-next-line no-console\n console.log(\"TSC compilation failed. Please resolve issues in your project.\\n\");\n // eslint-disable-next-line no-console\n console.log(error);\n\n rmSync(join(appWorkingDirectoryPath, \"framework-list\"), { recursive: true });\n }\n }\n\n const appJsFilePath = isTypeScriptApp\n ? join(appWorkingDirectoryPath, \"framework-list\", frameworkPath.replace(appWorkingDirectoryPath, \"\").replace(\".ts\", \".js\"))\n : frameworkPath;\n\n const { default: defaultExport } = await import(appJsFilePath);\n\n routes = await getRoutes(\n [\"AsyncFunction\", \"Function\"].includes(defaultExport.constructor.name as string) ? await defaultExport() : getApp(defaultExport, framework),\n framework,\n options.verbose ?? false,\n );\n } finally {\n if (isTypeScriptApp) {\n rmSync(join(appWorkingDirectoryPath, \"framework-list\"), { recursive: true });\n }\n }\n }\n\n if (routes === null) {\n throw new Error(`Framework \"${framework}\" is not supported.`);\n }\n\n if (Array.isArray(options.includePaths) && options.includePaths.length > 0) {\n routes = options.includePaths.flatMap((ipath) => (routes as Route[]).filter((route) => route.path.startsWith(ipath)));\n }\n\n if (Array.isArray(options.excludePaths) && options.excludePaths.length > 0) {\n routes = options.excludePaths.flatMap((epath) => (routes as Route[]).filter((route) => !route.path.startsWith(epath)));\n }\n\n if (typeof options.group === \"string\" && options.group !== \"\") {\n // eslint-disable-next-line no-console\n console.log();\n\n const groupedMap = routesGroupBy(routes, (route) => {\n if (options.group === \"path\") {\n return route.path.replace(\"/pages\", \"\").split(\"/\")[1];\n }\n\n return route.tags[0] ?? \"unsorted\";\n });\n\n let counter = 0;\n\n groupedMap.forEach((groupedRoutes, key) => {\n if (counter > 0) {\n // eslint-disable-next-line no-console\n console.log();\n }\n\n const dotsCount = (process.stdout.columns - 16 - key.length) / 2;\n const dots = dotsCount > 0 ? Array.from({ length: dotsCount }).fill(\" \").join(\"\") : \"\";\n\n // eslint-disable-next-line no-console\n console.log(dots + chalk.bold.underline(key));\n\n routesRender(groupedRoutes, options).forEach((renderedRoute) => {\n // eslint-disable-next-line no-console\n console.log(renderedRoute);\n });\n\n counter += 1;\n });\n } else {\n // eslint-disable-next-line no-console\n console.log();\n\n routesRender(routes, options).forEach((renderedRoute) => {\n // eslint-disable-next-line no-console\n console.log(renderedRoute);\n });\n }\n\n // eslint-disable-next-line no-console\n console.log(`\\n Listed ${chalk.greenBright(String(routes.length))} HTTP ${routes.length === 1 ? \"route\" : \"routes\"}.\\n`);\n};\n\nexport default listCommand;\n"]}