@prairielearn/express-list-endpoints 1.0.17 → 1.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @prairielearn/express-list-endpoints
2
2
 
3
+ ## 1.0.19
4
+
5
+ ### Patch Changes
6
+
7
+ - 0900843: Switch to the `tsgo` compiler
8
+
9
+ ## 1.0.18
10
+
11
+ ### Patch Changes
12
+
13
+ - 70a8029: Upgrade all JavaScript dependencies
14
+
3
15
  ## 1.0.17
4
16
 
5
17
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAQ/C,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAmMD;;;;GAIG;AACH,iBAAS,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,GAAG,GAAG,QAAQ,EAAE,CAIrE;AAED,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAQ/C,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAmMD;;;;GAIG;AACH,iBAAS,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,GAAG,GAAG,QAAQ,EAAE,CAIrE;AAED,eAAe,oBAAoB,CAAC","sourcesContent":["import type { Express, Router } from 'express';\n\ninterface Route {\n methods: object;\n path: string | string[];\n stack: any[];\n}\n\nexport interface Endpoint {\n path: string;\n methods: string[];\n middlewares: string[];\n}\n\nconst regExpToParseExpressPathRegExp =\n /^\\/\\^\\\\?\\/?(?:(:?[\\w\\\\.-]*(?:\\\\\\/:?[\\w\\\\.-]*)*)|(\\(\\?:\\\\?\\/?\\([^)]+\\)\\)))\\\\\\/.*/;\nconst regExpToReplaceExpressPathRegExpParams = /\\(\\?:\\\\?\\/?\\([^)]+\\)\\)/;\nconst regexpExpressParamRegexp = /\\(\\?:\\\\?\\\\?\\/?\\([^)]+\\)\\)/g;\nconst regexpExpressPathParamRegexp = /(:[^)]+)\\([^)]+\\)/g;\n\nconst EXPRESS_ROOT_PATH_REGEXP_VALUE = '/^\\\\/?(?=\\\\/|$)/i';\nconst STACK_ITEM_VALID_NAMES = new Set(['router', 'bound dispatch', 'mounted_app']);\n\n/**\n * Returns all the verbs detected for the passed route\n */\nfunction getRouteMethods(route: Route) {\n let methods = Object.keys(route.methods);\n\n methods = methods.filter((method) => method !== '_all');\n methods = methods.map((method) => method.toUpperCase());\n\n return methods;\n}\n\n/**\n * Returns the names (or anonymous) of all the middlewares attached to the\n * passed route.\n */\nfunction getRouteMiddlewares(route: Route): string[] {\n return route.stack.map((item) => {\n return item.handle.name || 'anonymous';\n });\n}\n\n/**\n * Returns true if found regexp related with express params.\n */\nfunction hasParams(expressPathRegExp: string): boolean {\n return regexpExpressParamRegexp.test(expressPathRegExp);\n}\n\n/**\n * @param route Express route object to be parsed\n * @param basePath The basePath the route is on\n * @returns Endpoints info\n */\nfunction parseExpressRoute(route: Route, basePath: string): Endpoint[] {\n const paths = [];\n\n if (Array.isArray(route.path)) {\n paths.push(...route.path);\n } else {\n paths.push(route.path);\n }\n\n const endpoints: Endpoint[] = paths.map((path) => {\n const completePath = basePath && path === '/' ? basePath : `${basePath}${path}`;\n\n const endpoint: Endpoint = {\n path: completePath.replaceAll(regexpExpressPathParamRegexp, '$1'),\n methods: getRouteMethods(route),\n middlewares: getRouteMiddlewares(route),\n };\n\n return endpoint;\n });\n\n return endpoints;\n}\n\nfunction parseExpressPath(expressPathRegExp: RegExp, params: any[]): string {\n let parsedRegExp = expressPathRegExp.toString();\n let expressPathRegExpExec = regExpToParseExpressPathRegExp.exec(parsedRegExp);\n let paramIndex = 0;\n\n while (hasParams(parsedRegExp)) {\n const paramName = params[paramIndex].name;\n const paramId = `:${paramName}`;\n\n parsedRegExp = parsedRegExp.replace(regExpToReplaceExpressPathRegExpParams, (str) => {\n // Express >= 4.20.0 uses a different RegExp for parameters: it\n // captures the slash as part of the parameter. We need to check\n // for this case and add the slash to the value that will replace\n // the parameter in the path.\n if (str.startsWith('(?:\\\\/')) {\n return `\\\\/${paramId}`;\n }\n\n return paramId;\n });\n\n paramIndex++;\n }\n\n if (parsedRegExp !== expressPathRegExp.toString()) {\n expressPathRegExpExec = regExpToParseExpressPathRegExp.exec(parsedRegExp);\n }\n\n // TODO: can we do better than this?\n if (!expressPathRegExpExec) {\n throw new Error('Error parsing express path');\n }\n\n const parsedPath = expressPathRegExpExec[1].replaceAll('\\\\/', '/');\n\n return parsedPath;\n}\n\nfunction parseEndpoints(\n app: Express | Router | any,\n basePath?: string,\n endpoints?: Endpoint[],\n): Endpoint[] {\n const stack = app.stack || (app._router && app._router.stack);\n\n endpoints = endpoints || [];\n basePath = basePath || '';\n\n if (!stack) {\n if (endpoints.length > 0) {\n endpoints = addEndpoints(endpoints, [\n {\n path: basePath,\n methods: [],\n middlewares: [],\n },\n ]);\n }\n } else {\n endpoints = parseStack(stack, basePath, endpoints);\n }\n\n return endpoints;\n}\n\n/**\n * Ensures the path of the new endpoints isn't yet in the array.\n * If the path is already in the array merges the endpoints with the existing\n * one, if not, it adds them to the array.\n *\n * @param currentEndpoints Array of current endpoints\n * @param endpointsToAdd New endpoints to be added to the array\n * @returns Updated endpoints array\n */\nfunction addEndpoints(currentEndpoints: Endpoint[], endpointsToAdd: Endpoint[]): Endpoint[] {\n endpointsToAdd.forEach((newEndpoint) => {\n const existingEndpoint = currentEndpoints.find(\n (endpoint) => endpoint.path === newEndpoint.path,\n );\n\n if (existingEndpoint !== undefined) {\n const newMethods = newEndpoint.methods.filter(\n (method) => !existingEndpoint.methods.includes(method),\n );\n\n existingEndpoint.methods = existingEndpoint.methods.concat(newMethods);\n } else {\n currentEndpoints.push(newEndpoint);\n }\n });\n\n return currentEndpoints;\n}\n\nfunction parseStack(stack: any[], basePath: string, endpoints: Endpoint[]): Endpoint[] {\n stack.forEach((stackItem) => {\n if (stackItem.route) {\n const newEndpoints = parseExpressRoute(stackItem.route, basePath);\n\n endpoints = addEndpoints(endpoints, newEndpoints);\n } else if (STACK_ITEM_VALID_NAMES.has(stackItem.name)) {\n const isExpressPathRegexp = regExpToParseExpressPathRegExp.test(stackItem.regexp);\n\n let newBasePath = basePath;\n\n if (isExpressPathRegexp) {\n const parsedPath = parseExpressPath(stackItem.regexp, stackItem.keys);\n\n newBasePath += `/${parsedPath}`;\n } else if (\n !stackItem.path &&\n stackItem.regexp &&\n stackItem.regexp.toString() !== EXPRESS_ROOT_PATH_REGEXP_VALUE\n ) {\n const regExpPath = ` RegExp(${stackItem.regexp}) `;\n\n newBasePath += `/${regExpPath}`;\n }\n\n endpoints = parseEndpoints(stackItem.handle, newBasePath, endpoints);\n }\n });\n\n return endpoints;\n}\n\n/**\n * Returns an array of strings with all the detected endpoints\n * @param app The express/router instance to get the endpoints from\n * @returns The array of endpoints\n */\nfunction expressListEndpoints(app: Express | Router | any): Endpoint[] {\n const endpoints = parseEndpoints(app);\n\n return endpoints;\n}\n\nexport default expressListEndpoints;\n"]}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Express, Router } from 'express';\n\ninterface Route {\n methods: object;\n path: string | string[];\n stack: any[];\n}\n\nexport interface Endpoint {\n path: string;\n methods: string[];\n middlewares: string[];\n}\n\nconst regExpToParseExpressPathRegExp =\n /^\\/\\^\\\\?\\/?(?:(:?[\\w\\\\.-]*(?:\\\\\\/:?[\\w\\\\.-]*)*)|(\\(\\?:\\\\?\\/?\\([^)]+\\)\\)))\\\\\\/.*/;\nconst regExpToReplaceExpressPathRegExpParams = /\\(\\?:\\\\?\\/?\\([^)]+\\)\\)/;\nconst regexpExpressParamRegexp = /\\(\\?:\\\\?\\\\?\\/?\\([^)]+\\)\\)/g;\nconst regexpExpressPathParamRegexp = /(:[^)]+)\\([^)]+\\)/g;\n\nconst EXPRESS_ROOT_PATH_REGEXP_VALUE = '/^\\\\/?(?=\\\\/|$)/i';\nconst STACK_ITEM_VALID_NAMES = new Set(['router', 'bound dispatch', 'mounted_app']);\n\n/**\n * Returns all the verbs detected for the passed route\n */\nfunction getRouteMethods(route: Route) {\n let methods = Object.keys(route.methods);\n\n methods = methods.filter((method) => method !== '_all');\n methods = methods.map((method) => method.toUpperCase());\n\n return methods;\n}\n\n/**\n * Returns the names (or anonymous) of all the middlewares attached to the\n * passed route.\n */\nfunction getRouteMiddlewares(route: Route): string[] {\n return route.stack.map((item) => {\n return item.handle.name || 'anonymous';\n });\n}\n\n/**\n * Returns true if found regexp related with express params.\n */\nfunction hasParams(expressPathRegExp: string): boolean {\n return regexpExpressParamRegexp.test(expressPathRegExp);\n}\n\n/**\n * @param route Express route object to be parsed\n * @param basePath The basePath the route is on\n * @returns Endpoints info\n */\nfunction parseExpressRoute(route: Route, basePath: string): Endpoint[] {\n const paths = [];\n\n if (Array.isArray(route.path)) {\n paths.push(...route.path);\n } else {\n paths.push(route.path);\n }\n\n const endpoints: Endpoint[] = paths.map((path) => {\n const completePath = basePath && path === '/' ? basePath : `${basePath}${path}`;\n\n const endpoint: Endpoint = {\n path: completePath.replaceAll(regexpExpressPathParamRegexp, '$1'),\n methods: getRouteMethods(route),\n middlewares: getRouteMiddlewares(route),\n };\n\n return endpoint;\n });\n\n return endpoints;\n}\n\nfunction parseExpressPath(expressPathRegExp: RegExp, params: any[]): string {\n let parsedRegExp = expressPathRegExp.toString();\n let expressPathRegExpExec = regExpToParseExpressPathRegExp.exec(parsedRegExp);\n let paramIndex = 0;\n\n while (hasParams(parsedRegExp)) {\n const paramName = params[paramIndex].name;\n const paramId = `:${paramName}`;\n\n parsedRegExp = parsedRegExp.replace(regExpToReplaceExpressPathRegExpParams, (str) => {\n // Express >= 4.20.0 uses a different RegExp for parameters: it\n // captures the slash as part of the parameter. We need to check\n // for this case and add the slash to the value that will replace\n // the parameter in the path.\n if (str.startsWith('(?:\\\\/')) {\n return `\\\\/${paramId}`;\n }\n\n return paramId;\n });\n\n paramIndex++;\n }\n\n if (parsedRegExp !== expressPathRegExp.toString()) {\n expressPathRegExpExec = regExpToParseExpressPathRegExp.exec(parsedRegExp);\n }\n\n // TODO: can we do better than this?\n if (!expressPathRegExpExec) {\n throw new Error('Error parsing express path');\n }\n\n const parsedPath = expressPathRegExpExec[1].replaceAll('\\\\/', '/');\n\n return parsedPath;\n}\n\nfunction parseEndpoints(\n app: Express | Router | any,\n basePath?: string,\n endpoints?: Endpoint[],\n): Endpoint[] {\n const stack = app.stack || (app._router && app._router.stack);\n\n endpoints = endpoints || [];\n basePath = basePath || '';\n\n if (!stack) {\n if (endpoints.length > 0) {\n endpoints = addEndpoints(endpoints, [\n {\n path: basePath,\n methods: [],\n middlewares: [],\n },\n ]);\n }\n } else {\n endpoints = parseStack(stack, basePath, endpoints);\n }\n\n return endpoints;\n}\n\n/**\n * Ensures the path of the new endpoints isn't yet in the array.\n * If the path is already in the array merges the endpoints with the existing\n * one, if not, it adds them to the array.\n *\n * @param currentEndpoints Array of current endpoints\n * @param endpointsToAdd New endpoints to be added to the array\n * @returns Updated endpoints array\n */\nfunction addEndpoints(currentEndpoints: Endpoint[], endpointsToAdd: Endpoint[]): Endpoint[] {\n endpointsToAdd.forEach((newEndpoint) => {\n const existingEndpoint = currentEndpoints.find(\n (endpoint) => endpoint.path === newEndpoint.path,\n );\n\n if (existingEndpoint !== undefined) {\n const newMethods = newEndpoint.methods.filter(\n (method) => !existingEndpoint.methods.includes(method),\n );\n\n existingEndpoint.methods = existingEndpoint.methods.concat(newMethods);\n } else {\n currentEndpoints.push(newEndpoint);\n }\n });\n\n return currentEndpoints;\n}\n\nfunction parseStack(stack: any[], basePath: string, endpoints: Endpoint[]): Endpoint[] {\n stack.forEach((stackItem) => {\n if (stackItem.route) {\n const newEndpoints = parseExpressRoute(stackItem.route, basePath);\n\n endpoints = addEndpoints(endpoints, newEndpoints);\n } else if (STACK_ITEM_VALID_NAMES.has(stackItem.name)) {\n const isExpressPathRegexp = regExpToParseExpressPathRegExp.test(stackItem.regexp);\n\n let newBasePath = basePath;\n\n if (isExpressPathRegexp) {\n const parsedPath = parseExpressPath(stackItem.regexp, stackItem.keys);\n\n newBasePath += `/${parsedPath}`;\n } else if (\n !stackItem.path &&\n stackItem.regexp &&\n stackItem.regexp.toString() !== EXPRESS_ROOT_PATH_REGEXP_VALUE\n ) {\n const regExpPath = ` RegExp(${stackItem.regexp}) `;\n\n newBasePath += `/${regExpPath}`;\n }\n\n endpoints = parseEndpoints(stackItem.handle, newBasePath, endpoints);\n }\n });\n\n return endpoints;\n}\n\n/**\n * Returns an array of strings with all the detected endpoints\n * @param app The express/router instance to get the endpoints from\n * @returns The array of endpoints\n */\nfunction expressListEndpoints(app: Express | Router | any): Endpoint[] {\n const endpoints = parseEndpoints(app);\n\n return endpoints;\n}\n\nexport default expressListEndpoints;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Express, Router } from 'express';\n\ninterface Route {\n methods: object;\n path: string | string[];\n stack: any[];\n}\n\nexport interface Endpoint {\n path: string;\n methods: string[];\n middlewares: string[];\n}\n\nconst regExpToParseExpressPathRegExp =\n /^\\/\\^\\\\?\\/?(?:(:?[\\w\\\\.-]*(?:\\\\\\/:?[\\w\\\\.-]*)*)|(\\(\\?:\\\\?\\/?\\([^)]+\\)\\)))\\\\\\/.*/;\nconst regExpToReplaceExpressPathRegExpParams = /\\(\\?:\\\\?\\/?\\([^)]+\\)\\)/;\nconst regexpExpressParamRegexp = /\\(\\?:\\\\?\\\\?\\/?\\([^)]+\\)\\)/g;\nconst regexpExpressPathParamRegexp = /(:[^)]+)\\([^)]+\\)/g;\n\nconst EXPRESS_ROOT_PATH_REGEXP_VALUE = '/^\\\\/?(?=\\\\/|$)/i';\nconst STACK_ITEM_VALID_NAMES = new Set(['router', 'bound dispatch', 'mounted_app']);\n\n/**\n * Returns all the verbs detected for the passed route\n */\nfunction getRouteMethods(route: Route) {\n let methods = Object.keys(route.methods);\n\n methods = methods.filter((method) => method !== '_all');\n methods = methods.map((method) => method.toUpperCase());\n\n return methods;\n}\n\n/**\n * Returns the names (or anonymous) of all the middlewares attached to the\n * passed route.\n */\nfunction getRouteMiddlewares(route: Route): string[] {\n return route.stack.map((item) => {\n return item.handle.name || 'anonymous';\n });\n}\n\n/**\n * Returns true if found regexp related with express params.\n */\nfunction hasParams(expressPathRegExp: string): boolean {\n return regexpExpressParamRegexp.test(expressPathRegExp);\n}\n\n/**\n * @param route Express route object to be parsed\n * @param basePath The basePath the route is on\n * @returns Endpoints info\n */\nfunction parseExpressRoute(route: Route, basePath: string): Endpoint[] {\n const paths = [];\n\n if (Array.isArray(route.path)) {\n paths.push(...route.path);\n } else {\n paths.push(route.path);\n }\n\n const endpoints: Endpoint[] = paths.map((path) => {\n const completePath = basePath && path === '/' ? basePath : `${basePath}${path}`;\n\n const endpoint: Endpoint = {\n path: completePath.replaceAll(regexpExpressPathParamRegexp, '$1'),\n methods: getRouteMethods(route),\n middlewares: getRouteMiddlewares(route),\n };\n\n return endpoint;\n });\n\n return endpoints;\n}\n\nfunction parseExpressPath(expressPathRegExp: RegExp, params: any[]): string {\n let parsedRegExp = expressPathRegExp.toString();\n let expressPathRegExpExec = regExpToParseExpressPathRegExp.exec(parsedRegExp);\n let paramIndex = 0;\n\n while (hasParams(parsedRegExp)) {\n const paramName = params[paramIndex].name;\n const paramId = `:${paramName}`;\n\n parsedRegExp = parsedRegExp.replace(regExpToReplaceExpressPathRegExpParams, (str) => {\n // Express >= 4.20.0 uses a different RegExp for parameters: it\n // captures the slash as part of the parameter. We need to check\n // for this case and add the slash to the value that will replace\n // the parameter in the path.\n if (str.startsWith('(?:\\\\/')) {\n return `\\\\/${paramId}`;\n }\n\n return paramId;\n });\n\n paramIndex++;\n }\n\n if (parsedRegExp !== expressPathRegExp.toString()) {\n expressPathRegExpExec = regExpToParseExpressPathRegExp.exec(parsedRegExp);\n }\n\n // TODO: can we do better than this?\n if (!expressPathRegExpExec) {\n throw new Error('Error parsing express path');\n }\n\n const parsedPath = expressPathRegExpExec[1].replaceAll('\\\\/', '/');\n\n return parsedPath;\n}\n\nfunction parseEndpoints(\n app: Express | Router | any,\n basePath?: string,\n endpoints?: Endpoint[],\n): Endpoint[] {\n const stack = app.stack || (app._router && app._router.stack);\n\n endpoints = endpoints || [];\n basePath = basePath || '';\n\n if (!stack) {\n if (endpoints.length > 0) {\n endpoints = addEndpoints(endpoints, [\n {\n path: basePath,\n methods: [],\n middlewares: [],\n },\n ]);\n }\n } else {\n endpoints = parseStack(stack, basePath, endpoints);\n }\n\n return endpoints;\n}\n\n/**\n * Ensures the path of the new endpoints isn't yet in the array.\n * If the path is already in the array merges the endpoints with the existing\n * one, if not, it adds them to the array.\n *\n * @param currentEndpoints Array of current endpoints\n * @param endpointsToAdd New endpoints to be added to the array\n * @returns Updated endpoints array\n */\nfunction addEndpoints(currentEndpoints: Endpoint[], endpointsToAdd: Endpoint[]): Endpoint[] {\n endpointsToAdd.forEach((newEndpoint) => {\n const existingEndpoint = currentEndpoints.find(\n (endpoint) => endpoint.path === newEndpoint.path,\n );\n\n if (existingEndpoint !== undefined) {\n const newMethods = newEndpoint.methods.filter(\n (method) => !existingEndpoint.methods.includes(method),\n );\n\n existingEndpoint.methods = existingEndpoint.methods.concat(newMethods);\n } else {\n currentEndpoints.push(newEndpoint);\n }\n });\n\n return currentEndpoints;\n}\n\nfunction parseStack(stack: any[], basePath: string, endpoints: Endpoint[]): Endpoint[] {\n stack.forEach((stackItem) => {\n if (stackItem.route) {\n const newEndpoints = parseExpressRoute(stackItem.route, basePath);\n\n endpoints = addEndpoints(endpoints, newEndpoints);\n } else if (STACK_ITEM_VALID_NAMES.has(stackItem.name)) {\n const isExpressPathRegexp = regExpToParseExpressPathRegExp.test(stackItem.regexp);\n\n let newBasePath = basePath;\n\n if (isExpressPathRegexp) {\n const parsedPath = parseExpressPath(stackItem.regexp, stackItem.keys);\n\n newBasePath += `/${parsedPath}`;\n } else if (\n !stackItem.path &&\n stackItem.regexp &&\n stackItem.regexp.toString() !== EXPRESS_ROOT_PATH_REGEXP_VALUE\n ) {\n const regExpPath = ` RegExp(${stackItem.regexp}) `;\n\n newBasePath += `/${regExpPath}`;\n }\n\n endpoints = parseEndpoints(stackItem.handle, newBasePath, endpoints);\n }\n });\n\n return endpoints;\n}\n\n/**\n * Returns an array of strings with all the detected endpoints\n * @param app The express/router instance to get the endpoints from\n * @returns The array of endpoints\n */\nfunction expressListEndpoints(app: Express | Router | any): Endpoint[] {\n const endpoints = parseEndpoints(app);\n\n return endpoints;\n}\n\nexport default expressListEndpoints;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"","sourcesContent":["import express from 'express';\nimport { assert, beforeAll, describe, it } from 'vitest';\n\nimport listEndpoints, { type Endpoint } from '../src/index.js';\n\nfunction assertResult(endpoints: Endpoint[]) {\n assert.isArray(endpoints);\n assert.lengthOf(endpoints, 2);\n\n endpoints.forEach((endpoint) => {\n assert.typeOf(endpoint, 'object');\n\n assert.typeOf(endpoint.path, 'string');\n assert.include(endpoint.path, '/');\n\n assert.isArray(endpoint.methods);\n endpoint.methods.forEach((method) => {\n assert.typeOf(method, 'string');\n assert.equal(method, method.toUpperCase());\n assert.notEqual(method, '_ALL');\n });\n\n assert.isArray(endpoint.middlewares);\n endpoint.middlewares.forEach((middleware) => {\n assert.typeOf(middleware, 'string');\n });\n });\n}\n\ndescribe('listEndpoints', () => {\n describe('when called with non configured app', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n\n endpoints = listEndpoints(app);\n });\n\n it('should return an empty array', () => {\n assert.isArray(endpoints);\n assert.lengthOf(endpoints, 0);\n });\n });\n\n describe('when called over an app', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n\n app\n .route('/')\n .get((_req, res) => {\n res.end();\n })\n .all((_req, res) => {\n res.end();\n })\n .post((_req, res) => {\n res.end();\n });\n\n app\n .route('/testing')\n .all((_req, res) => {\n res.end();\n })\n .delete((_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(app);\n });\n\n it('should return an array of well formed objects', () => {\n assertResult(endpoints);\n });\n });\n\n describe('when called over a router', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const router = express.Router();\n\n router\n .route('/')\n .get((_req, res) => {\n res.end();\n })\n .all((_req, res) => {\n res.end();\n })\n .post((_req, res) => {\n res.end();\n });\n\n router\n .route('/testing')\n .all((_req, res) => {\n res.end();\n })\n .delete((_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(router);\n });\n\n it('should return an array of well formed objects', () => {\n assertResult(endpoints);\n });\n });\n\n describe('when called over an app with mounted routers', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router();\n\n app\n .route('/testing')\n .all((_req, res) => {\n res.end();\n })\n .delete((_req, res) => {\n res.end();\n });\n\n router\n .route('/')\n .get((_req, res) => {\n res.end();\n })\n .all((_req, res) => {\n res.end();\n })\n .post((_req, res) => {\n res.end();\n });\n\n app.use('/router', router);\n\n endpoints = listEndpoints(app);\n });\n\n it('should return an array of well formed objects', () => {\n assertResult(endpoints);\n });\n\n describe('and some of the routers has the option `mergeParams`', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router({ mergeParams: true });\n\n router.get('/:id/friends', (_req, res) => {\n res.end();\n });\n\n app.use('/router', router);\n\n endpoints = listEndpoints(app);\n });\n\n it('should parse the endpoints correctly', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/router/:id/friends');\n });\n\n describe('and also has a sub-router on the router', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router({ mergeParams: true });\n const subRouter = express.Router();\n\n subRouter.get('/', (_req, res) => {\n res.end();\n });\n\n app.use('/router', router);\n\n router.use('/:postId/sub-router', subRouter);\n\n endpoints = listEndpoints(app);\n });\n\n it('should parse the endpoints correctly', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/router/:postId/sub-router');\n });\n });\n });\n });\n\n describe('when the defined routes', () => {\n describe('contains underscores', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const router = express.Router();\n\n router.get('/some_route', (_req, res) => {\n res.end();\n });\n\n router.get('/some_other_router', (_req, res) => {\n res.end();\n });\n\n router.get('/__last_route__', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(router);\n });\n\n it('should parse the endpoint correctly', () => {\n assert.lengthOf(endpoints, 3);\n assert.equal(endpoints[0].path, '/some_route');\n assert.equal(endpoints[1].path, '/some_other_router');\n assert.equal(endpoints[2].path, '/__last_route__');\n });\n });\n\n describe('contains hyphens', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const router = express.Router();\n\n router.get('/some-route', (_req, res) => {\n res.end();\n });\n\n router.get('/some-other-router', (_req, res) => {\n res.end();\n });\n\n router.get('/--last-route--', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(router);\n });\n\n it('should parse the endpoint correctly', () => {\n assert.lengthOf(endpoints, 3);\n assert.equal(endpoints[0].path, '/some-route');\n assert.equal(endpoints[1].path, '/some-other-router');\n assert.equal(endpoints[2].path, '/--last-route--');\n });\n });\n\n describe('contains dots', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const router = express.Router();\n\n router.get('/some.route', (_req, res) => {\n res.end();\n });\n\n router.get('/some.other.router', (_req, res) => {\n res.end();\n });\n\n router.get('/..last.route..', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(router);\n });\n\n it('should parse the endpoint correctly', () => {\n assert.lengthOf(endpoints, 3);\n assert.equal(endpoints[0].path, '/some.route');\n assert.equal(endpoints[1].path, '/some.other.router');\n assert.equal(endpoints[2].path, '/..last.route..');\n });\n });\n\n describe('contains multiple different chars', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const router = express.Router();\n\n router.get('/s0m3_r.oute', (_req, res) => {\n res.end();\n });\n\n router.get('/v1.0.0', (_req, res) => {\n res.end();\n });\n\n router.get('/not_sure.what-1m.d01ng', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(router);\n });\n\n it('should parse the endpoint correctly', () => {\n assert.lengthOf(endpoints, 3);\n assert.equal(endpoints[0].path, '/s0m3_r.oute');\n assert.equal(endpoints[1].path, '/v1.0.0');\n assert.equal(endpoints[2].path, '/not_sure.what-1m.d01ng');\n });\n });\n });\n\n describe('when called over a mounted router with only root path', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router();\n\n router.get('/', (_req, res) => {\n res.end();\n });\n\n app.use('/', router);\n\n endpoints = listEndpoints(app);\n });\n\n it('should retrieve the list of endpoints and its methods', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/');\n assert.lengthOf(endpoints[0].methods, 1);\n assert.equal(endpoints[0].methods[0], 'GET');\n });\n });\n\n describe('when called over a multi-level base route', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router();\n\n router.get('/my/path', (_req, res) => {\n res.end();\n });\n\n app.use('/multi/level', router);\n app.use('/super/duper/multi/level', router);\n\n endpoints = listEndpoints(app);\n });\n\n it('should retrieve the correct built path', () => {\n assert.lengthOf(endpoints, 2);\n assert.equal(endpoints[0].path, '/multi/level/my/path');\n assert.equal(endpoints[1].path, '/super/duper/multi/level/my/path');\n });\n\n describe('with params', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router();\n\n router.get('/users/:id', (_req, res) => {\n res.end();\n });\n\n router.get('/super/users/:id', (_req, res) => {\n res.end();\n });\n\n app.use('/multi/:multiId/level/:levelId', router);\n\n endpoints = listEndpoints(app);\n });\n\n it('should retrieve the correct built path', () => {\n assert.lengthOf(endpoints, 2);\n assert.equal(endpoints[0].path, '/multi/:multiId/level/:levelId/users/:id');\n assert.equal(endpoints[1].path, '/multi/:multiId/level/:levelId/super/users/:id');\n });\n });\n\n describe('with params in middle of the pattern', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router();\n\n router.get('/super/users/:id/friends', (_req, res) => {\n res.end();\n });\n\n app.use('/multi/level', router);\n\n endpoints = listEndpoints(app);\n });\n\n it('should retrieve the correct built path', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/multi/level/super/users/:id/friends');\n });\n });\n });\n\n describe('when called over a route with params', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n\n app.get('/users/:id', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(app);\n });\n\n it('should retrieve the correct built path', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/users/:id');\n });\n });\n\n describe('when called over a route with params in middle of the pattern', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n\n app.get('/users/:id/friends', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(app);\n });\n\n it('should retrieve the correct built path', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/users/:id/friends');\n });\n });\n\n describe('when called over a route with multiple methods with \"/\" path defined', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const router = express.Router();\n\n router\n .post('/test', (_req, res) => {\n res.end();\n })\n .delete('/test', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(router);\n });\n\n it('should retrieve the correct built path', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/test');\n });\n\n it('should retrieve the correct built methods', () => {\n assert.lengthOf(endpoints[0].methods, 2);\n assert.equal(endpoints[0].methods[0], 'POST');\n assert.equal(endpoints[0].methods[1], 'DELETE');\n });\n });\n\n describe('when called with middlewares', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const router = express.Router();\n\n const exampleMiddleware = () => {};\n\n router.post('/test', [\n exampleMiddleware,\n () => {}, // Anonymous middleware\n ]);\n\n endpoints = listEndpoints(router);\n });\n\n it('should retrieve the correct built path', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/test');\n assert.lengthOf(endpoints[0].methods, 1);\n assert.equal(endpoints[0].methods[0], 'POST');\n });\n\n it('should retrieve the correct middlewares', () => {\n assert.lengthOf(endpoints[0].middlewares, 2);\n assert.equal(endpoints[0].middlewares[0], 'exampleMiddleware');\n assert.equal(endpoints[0].middlewares[1], 'anonymous');\n });\n });\n\n describe('when called with an array of paths', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router();\n\n app.get(['/one', '/two'], (_req, res) => {\n res.end();\n });\n\n router.get(['/one', '/two'], (_req, res) => {\n res.end();\n });\n\n app.use(['/router', '/sub-path'], router);\n\n endpoints = listEndpoints(app);\n });\n\n it('should list routes correctly', () => {\n assert.lengthOf(endpoints, 4);\n assert.equal(endpoints[0].path, '/one');\n assert.equal(endpoints[0].methods[0], 'GET');\n assert.equal(endpoints[1].path, '/two');\n assert.equal(endpoints[1].methods[0], 'GET');\n });\n });\n\n describe('when called with an app with a mounted sub-app', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const subApp = express();\n\n app.get('/', (_req, res) => {\n res.end();\n });\n\n subApp.get('/', (_req, res) => {\n res.end();\n });\n\n app.use('/sub-app', subApp);\n\n endpoints = listEndpoints(app);\n });\n\n it('should list routes correctly', () => {\n assert.lengthOf(endpoints, 2);\n assert.equal(endpoints[0].path, '/');\n assert.equal(endpoints[0].methods[0], 'GET');\n assert.equal(endpoints[0].middlewares[0], 'anonymous');\n assert.equal(endpoints[1].path, '/sub-app');\n assert.lengthOf(endpoints[1].methods, 0);\n assert.lengthOf(endpoints[1].middlewares, 0);\n });\n });\n\n describe('when called with route params with regexp', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n\n app.get('/foo/:item_id(\\\\d+)/bar', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(app);\n });\n\n it('should list routes correctly', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/foo/:item_id/bar');\n assert.equal(endpoints[0].methods[0], 'GET');\n assert.equal(endpoints[0].middlewares[0], 'anonymous');\n });\n });\n\n describe('when called with a route with multiple params with regexp', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n\n app.get('/foo/bar/:baz_id(\\\\d+)/:biz_id(\\\\d+)', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(app);\n });\n\n it('should list routes correctly', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/foo/bar/:baz_id/:biz_id');\n assert.equal(endpoints[0].methods[0], 'GET');\n assert.equal(endpoints[0].middlewares[0], 'anonymous');\n });\n });\n\n describe('supports regexp validators for params in subapp', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const subApp = express.Router();\n\n subApp.get('/baz/:biz_id(\\\\d+)', (_req, res) => {\n res.end();\n });\n\n app.use('/foo/bar', subApp);\n\n endpoints = listEndpoints(app);\n });\n\n it('should list routes correctly', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/foo/bar/baz/:biz_id');\n assert.equal(endpoints[0].methods[0], 'GET');\n assert.equal(endpoints[0].middlewares[0], 'anonymous');\n });\n });\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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","sourcesContent":["import express from 'express';\nimport { assert, beforeAll, describe, it } from 'vitest';\n\nimport listEndpoints, { type Endpoint } from '../src/index.js';\n\nfunction assertResult(endpoints: Endpoint[]) {\n assert.isArray(endpoints);\n assert.lengthOf(endpoints, 2);\n\n endpoints.forEach((endpoint) => {\n assert.typeOf(endpoint, 'object');\n\n assert.typeOf(endpoint.path, 'string');\n assert.include(endpoint.path, '/');\n\n assert.isArray(endpoint.methods);\n endpoint.methods.forEach((method) => {\n assert.typeOf(method, 'string');\n assert.equal(method, method.toUpperCase());\n assert.notEqual(method, '_ALL');\n });\n\n assert.isArray(endpoint.middlewares);\n endpoint.middlewares.forEach((middleware) => {\n assert.typeOf(middleware, 'string');\n });\n });\n}\n\ndescribe('listEndpoints', () => {\n describe('when called with non configured app', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n\n endpoints = listEndpoints(app);\n });\n\n it('should return an empty array', () => {\n assert.isArray(endpoints);\n assert.lengthOf(endpoints, 0);\n });\n });\n\n describe('when called over an app', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n\n app\n .route('/')\n .get((_req, res) => {\n res.end();\n })\n .all((_req, res) => {\n res.end();\n })\n .post((_req, res) => {\n res.end();\n });\n\n app\n .route('/testing')\n .all((_req, res) => {\n res.end();\n })\n .delete((_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(app);\n });\n\n it('should return an array of well formed objects', () => {\n assertResult(endpoints);\n });\n });\n\n describe('when called over a router', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const router = express.Router();\n\n router\n .route('/')\n .get((_req, res) => {\n res.end();\n })\n .all((_req, res) => {\n res.end();\n })\n .post((_req, res) => {\n res.end();\n });\n\n router\n .route('/testing')\n .all((_req, res) => {\n res.end();\n })\n .delete((_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(router);\n });\n\n it('should return an array of well formed objects', () => {\n assertResult(endpoints);\n });\n });\n\n describe('when called over an app with mounted routers', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router();\n\n app\n .route('/testing')\n .all((_req, res) => {\n res.end();\n })\n .delete((_req, res) => {\n res.end();\n });\n\n router\n .route('/')\n .get((_req, res) => {\n res.end();\n })\n .all((_req, res) => {\n res.end();\n })\n .post((_req, res) => {\n res.end();\n });\n\n app.use('/router', router);\n\n endpoints = listEndpoints(app);\n });\n\n it('should return an array of well formed objects', () => {\n assertResult(endpoints);\n });\n\n describe('and some of the routers has the option `mergeParams`', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router({ mergeParams: true });\n\n router.get('/:id/friends', (_req, res) => {\n res.end();\n });\n\n app.use('/router', router);\n\n endpoints = listEndpoints(app);\n });\n\n it('should parse the endpoints correctly', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/router/:id/friends');\n });\n\n describe('and also has a sub-router on the router', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router({ mergeParams: true });\n const subRouter = express.Router();\n\n subRouter.get('/', (_req, res) => {\n res.end();\n });\n\n app.use('/router', router);\n\n router.use('/:postId/sub-router', subRouter);\n\n endpoints = listEndpoints(app);\n });\n\n it('should parse the endpoints correctly', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/router/:postId/sub-router');\n });\n });\n });\n });\n\n describe('when the defined routes', () => {\n describe('contains underscores', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const router = express.Router();\n\n router.get('/some_route', (_req, res) => {\n res.end();\n });\n\n router.get('/some_other_router', (_req, res) => {\n res.end();\n });\n\n router.get('/__last_route__', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(router);\n });\n\n it('should parse the endpoint correctly', () => {\n assert.lengthOf(endpoints, 3);\n assert.equal(endpoints[0].path, '/some_route');\n assert.equal(endpoints[1].path, '/some_other_router');\n assert.equal(endpoints[2].path, '/__last_route__');\n });\n });\n\n describe('contains hyphens', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const router = express.Router();\n\n router.get('/some-route', (_req, res) => {\n res.end();\n });\n\n router.get('/some-other-router', (_req, res) => {\n res.end();\n });\n\n router.get('/--last-route--', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(router);\n });\n\n it('should parse the endpoint correctly', () => {\n assert.lengthOf(endpoints, 3);\n assert.equal(endpoints[0].path, '/some-route');\n assert.equal(endpoints[1].path, '/some-other-router');\n assert.equal(endpoints[2].path, '/--last-route--');\n });\n });\n\n describe('contains dots', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const router = express.Router();\n\n router.get('/some.route', (_req, res) => {\n res.end();\n });\n\n router.get('/some.other.router', (_req, res) => {\n res.end();\n });\n\n router.get('/..last.route..', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(router);\n });\n\n it('should parse the endpoint correctly', () => {\n assert.lengthOf(endpoints, 3);\n assert.equal(endpoints[0].path, '/some.route');\n assert.equal(endpoints[1].path, '/some.other.router');\n assert.equal(endpoints[2].path, '/..last.route..');\n });\n });\n\n describe('contains multiple different chars', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const router = express.Router();\n\n router.get('/s0m3_r.oute', (_req, res) => {\n res.end();\n });\n\n router.get('/v1.0.0', (_req, res) => {\n res.end();\n });\n\n router.get('/not_sure.what-1m.d01ng', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(router);\n });\n\n it('should parse the endpoint correctly', () => {\n assert.lengthOf(endpoints, 3);\n assert.equal(endpoints[0].path, '/s0m3_r.oute');\n assert.equal(endpoints[1].path, '/v1.0.0');\n assert.equal(endpoints[2].path, '/not_sure.what-1m.d01ng');\n });\n });\n });\n\n describe('when called over a mounted router with only root path', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router();\n\n router.get('/', (_req, res) => {\n res.end();\n });\n\n app.use('/', router);\n\n endpoints = listEndpoints(app);\n });\n\n it('should retrieve the list of endpoints and its methods', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/');\n assert.lengthOf(endpoints[0].methods, 1);\n assert.equal(endpoints[0].methods[0], 'GET');\n });\n });\n\n describe('when called over a multi-level base route', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router();\n\n router.get('/my/path', (_req, res) => {\n res.end();\n });\n\n app.use('/multi/level', router);\n app.use('/super/duper/multi/level', router);\n\n endpoints = listEndpoints(app);\n });\n\n it('should retrieve the correct built path', () => {\n assert.lengthOf(endpoints, 2);\n assert.equal(endpoints[0].path, '/multi/level/my/path');\n assert.equal(endpoints[1].path, '/super/duper/multi/level/my/path');\n });\n\n describe('with params', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router();\n\n router.get('/users/:id', (_req, res) => {\n res.end();\n });\n\n router.get('/super/users/:id', (_req, res) => {\n res.end();\n });\n\n app.use('/multi/:multiId/level/:levelId', router);\n\n endpoints = listEndpoints(app);\n });\n\n it('should retrieve the correct built path', () => {\n assert.lengthOf(endpoints, 2);\n assert.equal(endpoints[0].path, '/multi/:multiId/level/:levelId/users/:id');\n assert.equal(endpoints[1].path, '/multi/:multiId/level/:levelId/super/users/:id');\n });\n });\n\n describe('with params in middle of the pattern', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router();\n\n router.get('/super/users/:id/friends', (_req, res) => {\n res.end();\n });\n\n app.use('/multi/level', router);\n\n endpoints = listEndpoints(app);\n });\n\n it('should retrieve the correct built path', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/multi/level/super/users/:id/friends');\n });\n });\n });\n\n describe('when called over a route with params', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n\n app.get('/users/:id', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(app);\n });\n\n it('should retrieve the correct built path', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/users/:id');\n });\n });\n\n describe('when called over a route with params in middle of the pattern', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n\n app.get('/users/:id/friends', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(app);\n });\n\n it('should retrieve the correct built path', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/users/:id/friends');\n });\n });\n\n describe('when called over a route with multiple methods with \"/\" path defined', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const router = express.Router();\n\n router\n .post('/test', (_req, res) => {\n res.end();\n })\n .delete('/test', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(router);\n });\n\n it('should retrieve the correct built path', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/test');\n });\n\n it('should retrieve the correct built methods', () => {\n assert.lengthOf(endpoints[0].methods, 2);\n assert.equal(endpoints[0].methods[0], 'POST');\n assert.equal(endpoints[0].methods[1], 'DELETE');\n });\n });\n\n describe('when called with middlewares', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const router = express.Router();\n\n const exampleMiddleware = () => {};\n\n router.post('/test', [\n exampleMiddleware,\n () => {}, // Anonymous middleware\n ]);\n\n endpoints = listEndpoints(router);\n });\n\n it('should retrieve the correct built path', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/test');\n assert.lengthOf(endpoints[0].methods, 1);\n assert.equal(endpoints[0].methods[0], 'POST');\n });\n\n it('should retrieve the correct middlewares', () => {\n assert.lengthOf(endpoints[0].middlewares, 2);\n assert.equal(endpoints[0].middlewares[0], 'exampleMiddleware');\n assert.equal(endpoints[0].middlewares[1], 'anonymous');\n });\n });\n\n describe('when called with an array of paths', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router();\n\n app.get(['/one', '/two'], (_req, res) => {\n res.end();\n });\n\n router.get(['/one', '/two'], (_req, res) => {\n res.end();\n });\n\n app.use(['/router', '/sub-path'], router);\n\n endpoints = listEndpoints(app);\n });\n\n it('should list routes correctly', () => {\n assert.lengthOf(endpoints, 4);\n assert.equal(endpoints[0].path, '/one');\n assert.equal(endpoints[0].methods[0], 'GET');\n assert.equal(endpoints[1].path, '/two');\n assert.equal(endpoints[1].methods[0], 'GET');\n });\n });\n\n describe('when called with an app with a mounted sub-app', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const subApp = express();\n\n app.get('/', (_req, res) => {\n res.end();\n });\n\n subApp.get('/', (_req, res) => {\n res.end();\n });\n\n app.use('/sub-app', subApp);\n\n endpoints = listEndpoints(app);\n });\n\n it('should list routes correctly', () => {\n assert.lengthOf(endpoints, 2);\n assert.equal(endpoints[0].path, '/');\n assert.equal(endpoints[0].methods[0], 'GET');\n assert.equal(endpoints[0].middlewares[0], 'anonymous');\n assert.equal(endpoints[1].path, '/sub-app');\n assert.lengthOf(endpoints[1].methods, 0);\n assert.lengthOf(endpoints[1].middlewares, 0);\n });\n });\n\n describe('when called with route params with regexp', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n\n app.get('/foo/:item_id(\\\\d+)/bar', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(app);\n });\n\n it('should list routes correctly', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/foo/:item_id/bar');\n assert.equal(endpoints[0].methods[0], 'GET');\n assert.equal(endpoints[0].middlewares[0], 'anonymous');\n });\n });\n\n describe('when called with a route with multiple params with regexp', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n\n app.get('/foo/bar/:baz_id(\\\\d+)/:biz_id(\\\\d+)', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(app);\n });\n\n it('should list routes correctly', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/foo/bar/:baz_id/:biz_id');\n assert.equal(endpoints[0].methods[0], 'GET');\n assert.equal(endpoints[0].middlewares[0], 'anonymous');\n });\n });\n\n describe('supports regexp validators for params in subapp', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const subApp = express.Router();\n\n subApp.get('/baz/:biz_id(\\\\d+)', (_req, res) => {\n res.end();\n });\n\n app.use('/foo/bar', subApp);\n\n endpoints = listEndpoints(app);\n });\n\n it('should list routes correctly', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/foo/bar/baz/:biz_id');\n assert.equal(endpoints[0].methods[0], 'GET');\n assert.equal(endpoints[0].middlewares[0], 'anonymous');\n });\n });\n});\n"]}
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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","sourcesContent":["import express from 'express';\nimport { assert, beforeAll, describe, it } from 'vitest';\n\nimport listEndpoints, { type Endpoint } from '../src/index.js';\n\nfunction assertResult(endpoints: Endpoint[]) {\n assert.isArray(endpoints);\n assert.lengthOf(endpoints, 2);\n\n endpoints.forEach((endpoint) => {\n assert.typeOf(endpoint, 'object');\n\n assert.typeOf(endpoint.path, 'string');\n assert.include(endpoint.path, '/');\n\n assert.isArray(endpoint.methods);\n endpoint.methods.forEach((method) => {\n assert.typeOf(method, 'string');\n assert.equal(method, method.toUpperCase());\n assert.notEqual(method, '_ALL');\n });\n\n assert.isArray(endpoint.middlewares);\n endpoint.middlewares.forEach((middleware) => {\n assert.typeOf(middleware, 'string');\n });\n });\n}\n\ndescribe('listEndpoints', () => {\n describe('when called with non configured app', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n\n endpoints = listEndpoints(app);\n });\n\n it('should return an empty array', () => {\n assert.isArray(endpoints);\n assert.lengthOf(endpoints, 0);\n });\n });\n\n describe('when called over an app', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n\n app\n .route('/')\n .get((_req, res) => {\n res.end();\n })\n .all((_req, res) => {\n res.end();\n })\n .post((_req, res) => {\n res.end();\n });\n\n app\n .route('/testing')\n .all((_req, res) => {\n res.end();\n })\n .delete((_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(app);\n });\n\n it('should return an array of well formed objects', () => {\n assertResult(endpoints);\n });\n });\n\n describe('when called over a router', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const router = express.Router();\n\n router\n .route('/')\n .get((_req, res) => {\n res.end();\n })\n .all((_req, res) => {\n res.end();\n })\n .post((_req, res) => {\n res.end();\n });\n\n router\n .route('/testing')\n .all((_req, res) => {\n res.end();\n })\n .delete((_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(router);\n });\n\n it('should return an array of well formed objects', () => {\n assertResult(endpoints);\n });\n });\n\n describe('when called over an app with mounted routers', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router();\n\n app\n .route('/testing')\n .all((_req, res) => {\n res.end();\n })\n .delete((_req, res) => {\n res.end();\n });\n\n router\n .route('/')\n .get((_req, res) => {\n res.end();\n })\n .all((_req, res) => {\n res.end();\n })\n .post((_req, res) => {\n res.end();\n });\n\n app.use('/router', router);\n\n endpoints = listEndpoints(app);\n });\n\n it('should return an array of well formed objects', () => {\n assertResult(endpoints);\n });\n\n describe('and some of the routers has the option `mergeParams`', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router({ mergeParams: true });\n\n router.get('/:id/friends', (_req, res) => {\n res.end();\n });\n\n app.use('/router', router);\n\n endpoints = listEndpoints(app);\n });\n\n it('should parse the endpoints correctly', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/router/:id/friends');\n });\n\n describe('and also has a sub-router on the router', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router({ mergeParams: true });\n const subRouter = express.Router();\n\n subRouter.get('/', (_req, res) => {\n res.end();\n });\n\n app.use('/router', router);\n\n router.use('/:postId/sub-router', subRouter);\n\n endpoints = listEndpoints(app);\n });\n\n it('should parse the endpoints correctly', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/router/:postId/sub-router');\n });\n });\n });\n });\n\n describe('when the defined routes', () => {\n describe('contains underscores', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const router = express.Router();\n\n router.get('/some_route', (_req, res) => {\n res.end();\n });\n\n router.get('/some_other_router', (_req, res) => {\n res.end();\n });\n\n router.get('/__last_route__', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(router);\n });\n\n it('should parse the endpoint correctly', () => {\n assert.lengthOf(endpoints, 3);\n assert.equal(endpoints[0].path, '/some_route');\n assert.equal(endpoints[1].path, '/some_other_router');\n assert.equal(endpoints[2].path, '/__last_route__');\n });\n });\n\n describe('contains hyphens', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const router = express.Router();\n\n router.get('/some-route', (_req, res) => {\n res.end();\n });\n\n router.get('/some-other-router', (_req, res) => {\n res.end();\n });\n\n router.get('/--last-route--', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(router);\n });\n\n it('should parse the endpoint correctly', () => {\n assert.lengthOf(endpoints, 3);\n assert.equal(endpoints[0].path, '/some-route');\n assert.equal(endpoints[1].path, '/some-other-router');\n assert.equal(endpoints[2].path, '/--last-route--');\n });\n });\n\n describe('contains dots', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const router = express.Router();\n\n router.get('/some.route', (_req, res) => {\n res.end();\n });\n\n router.get('/some.other.router', (_req, res) => {\n res.end();\n });\n\n router.get('/..last.route..', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(router);\n });\n\n it('should parse the endpoint correctly', () => {\n assert.lengthOf(endpoints, 3);\n assert.equal(endpoints[0].path, '/some.route');\n assert.equal(endpoints[1].path, '/some.other.router');\n assert.equal(endpoints[2].path, '/..last.route..');\n });\n });\n\n describe('contains multiple different chars', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const router = express.Router();\n\n router.get('/s0m3_r.oute', (_req, res) => {\n res.end();\n });\n\n router.get('/v1.0.0', (_req, res) => {\n res.end();\n });\n\n router.get('/not_sure.what-1m.d01ng', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(router);\n });\n\n it('should parse the endpoint correctly', () => {\n assert.lengthOf(endpoints, 3);\n assert.equal(endpoints[0].path, '/s0m3_r.oute');\n assert.equal(endpoints[1].path, '/v1.0.0');\n assert.equal(endpoints[2].path, '/not_sure.what-1m.d01ng');\n });\n });\n });\n\n describe('when called over a mounted router with only root path', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router();\n\n router.get('/', (_req, res) => {\n res.end();\n });\n\n app.use('/', router);\n\n endpoints = listEndpoints(app);\n });\n\n it('should retrieve the list of endpoints and its methods', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/');\n assert.lengthOf(endpoints[0].methods, 1);\n assert.equal(endpoints[0].methods[0], 'GET');\n });\n });\n\n describe('when called over a multi-level base route', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router();\n\n router.get('/my/path', (_req, res) => {\n res.end();\n });\n\n app.use('/multi/level', router);\n app.use('/super/duper/multi/level', router);\n\n endpoints = listEndpoints(app);\n });\n\n it('should retrieve the correct built path', () => {\n assert.lengthOf(endpoints, 2);\n assert.equal(endpoints[0].path, '/multi/level/my/path');\n assert.equal(endpoints[1].path, '/super/duper/multi/level/my/path');\n });\n\n describe('with params', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router();\n\n router.get('/users/:id', (_req, res) => {\n res.end();\n });\n\n router.get('/super/users/:id', (_req, res) => {\n res.end();\n });\n\n app.use('/multi/:multiId/level/:levelId', router);\n\n endpoints = listEndpoints(app);\n });\n\n it('should retrieve the correct built path', () => {\n assert.lengthOf(endpoints, 2);\n assert.equal(endpoints[0].path, '/multi/:multiId/level/:levelId/users/:id');\n assert.equal(endpoints[1].path, '/multi/:multiId/level/:levelId/super/users/:id');\n });\n });\n\n describe('with params in middle of the pattern', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router();\n\n router.get('/super/users/:id/friends', (_req, res) => {\n res.end();\n });\n\n app.use('/multi/level', router);\n\n endpoints = listEndpoints(app);\n });\n\n it('should retrieve the correct built path', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/multi/level/super/users/:id/friends');\n });\n });\n });\n\n describe('when called over a route with params', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n\n app.get('/users/:id', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(app);\n });\n\n it('should retrieve the correct built path', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/users/:id');\n });\n });\n\n describe('when called over a route with params in middle of the pattern', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n\n app.get('/users/:id/friends', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(app);\n });\n\n it('should retrieve the correct built path', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/users/:id/friends');\n });\n });\n\n describe('when called over a route with multiple methods with \"/\" path defined', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const router = express.Router();\n\n router\n .post('/test', (_req, res) => {\n res.end();\n })\n .delete('/test', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(router);\n });\n\n it('should retrieve the correct built path', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/test');\n });\n\n it('should retrieve the correct built methods', () => {\n assert.lengthOf(endpoints[0].methods, 2);\n assert.equal(endpoints[0].methods[0], 'POST');\n assert.equal(endpoints[0].methods[1], 'DELETE');\n });\n });\n\n describe('when called with middlewares', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const router = express.Router();\n\n const exampleMiddleware = () => {};\n\n router.post('/test', [\n exampleMiddleware,\n () => {}, // Anonymous middleware\n ]);\n\n endpoints = listEndpoints(router);\n });\n\n it('should retrieve the correct built path', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/test');\n assert.lengthOf(endpoints[0].methods, 1);\n assert.equal(endpoints[0].methods[0], 'POST');\n });\n\n it('should retrieve the correct middlewares', () => {\n assert.lengthOf(endpoints[0].middlewares, 2);\n assert.equal(endpoints[0].middlewares[0], 'exampleMiddleware');\n assert.equal(endpoints[0].middlewares[1], 'anonymous');\n });\n });\n\n describe('when called with an array of paths', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const router = express.Router();\n\n app.get(['/one', '/two'], (_req, res) => {\n res.end();\n });\n\n router.get(['/one', '/two'], (_req, res) => {\n res.end();\n });\n\n app.use(['/router', '/sub-path'], router);\n\n endpoints = listEndpoints(app);\n });\n\n it('should list routes correctly', () => {\n assert.lengthOf(endpoints, 4);\n assert.equal(endpoints[0].path, '/one');\n assert.equal(endpoints[0].methods[0], 'GET');\n assert.equal(endpoints[1].path, '/two');\n assert.equal(endpoints[1].methods[0], 'GET');\n });\n });\n\n describe('when called with an app with a mounted sub-app', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const subApp = express();\n\n app.get('/', (_req, res) => {\n res.end();\n });\n\n subApp.get('/', (_req, res) => {\n res.end();\n });\n\n app.use('/sub-app', subApp);\n\n endpoints = listEndpoints(app);\n });\n\n it('should list routes correctly', () => {\n assert.lengthOf(endpoints, 2);\n assert.equal(endpoints[0].path, '/');\n assert.equal(endpoints[0].methods[0], 'GET');\n assert.equal(endpoints[0].middlewares[0], 'anonymous');\n assert.equal(endpoints[1].path, '/sub-app');\n assert.lengthOf(endpoints[1].methods, 0);\n assert.lengthOf(endpoints[1].middlewares, 0);\n });\n });\n\n describe('when called with route params with regexp', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n\n app.get('/foo/:item_id(\\\\d+)/bar', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(app);\n });\n\n it('should list routes correctly', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/foo/:item_id/bar');\n assert.equal(endpoints[0].methods[0], 'GET');\n assert.equal(endpoints[0].middlewares[0], 'anonymous');\n });\n });\n\n describe('when called with a route with multiple params with regexp', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n\n app.get('/foo/bar/:baz_id(\\\\d+)/:biz_id(\\\\d+)', (_req, res) => {\n res.end();\n });\n\n endpoints = listEndpoints(app);\n });\n\n it('should list routes correctly', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/foo/bar/:baz_id/:biz_id');\n assert.equal(endpoints[0].methods[0], 'GET');\n assert.equal(endpoints[0].middlewares[0], 'anonymous');\n });\n });\n\n describe('supports regexp validators for params in subapp', () => {\n let endpoints: Endpoint[];\n\n beforeAll(() => {\n const app = express();\n const subApp = express.Router();\n\n subApp.get('/baz/:biz_id(\\\\d+)', (_req, res) => {\n res.end();\n });\n\n app.use('/foo/bar', subApp);\n\n endpoints = listEndpoints(app);\n });\n\n it('should list routes correctly', () => {\n assert.lengthOf(endpoints, 1);\n assert.equal(endpoints[0].path, '/foo/bar/baz/:biz_id');\n assert.equal(endpoints[0].methods[0], 'GET');\n assert.equal(endpoints[0].middlewares[0], 'anonymous');\n });\n });\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prairielearn/express-list-endpoints",
3
- "version": "1.0.17",
3
+ "version": "1.0.19",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -10,17 +10,18 @@
10
10
  "license": "MIT",
11
11
  "main": "dist/index.js",
12
12
  "scripts": {
13
- "build": "tsc",
14
- "dev": "tsc --watch --preserveWatchOutput",
13
+ "build": "tsgo",
14
+ "dev": "tsgo --watch --preserveWatchOutput",
15
15
  "test": "vitest run --coverage"
16
16
  },
17
17
  "devDependencies": {
18
18
  "@prairielearn/tsconfig": "^0.0.0",
19
- "@types/node": "^22.18.13",
20
- "@vitest/coverage-v8": "^4.0.6",
21
- "express": "^4.21.2",
22
- "tsx": "^4.20.6",
19
+ "@types/node": "^22.19.5",
20
+ "@typescript/native-preview": "^7.0.0-dev.20260106.1",
21
+ "@vitest/coverage-v8": "^4.0.17",
22
+ "express": "^4.22.1",
23
+ "tsx": "^4.21.0",
23
24
  "typescript": "^5.9.3",
24
- "vitest": "^4.0.6"
25
+ "vitest": "^4.0.17"
25
26
  }
26
27
  }