@prairielearn/express-list-endpoints 1.0.9 → 1.0.10

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,11 @@
1
1
  # @prairielearn/express-list-endpoints
2
2
 
3
+ ## 1.0.10
4
+
5
+ ### Patch Changes
6
+
7
+ - be4444e: Upgrade all JavaScript dependencies
8
+
3
9
  ## 1.0.9
4
10
 
5
11
  ### Patch Changes
@@ -1,5 +1,5 @@
1
- import { assert } from 'chai';
2
1
  import express from 'express';
2
+ import { assert, beforeAll, describe, it } from 'vitest';
3
3
  import listEndpoints, {} from '../src/index.js';
4
4
  function assertResult(endpoints) {
5
5
  assert.isArray(endpoints);
@@ -23,7 +23,7 @@ function assertResult(endpoints) {
23
23
  describe('listEndpoints', () => {
24
24
  describe('when called with non configured app', () => {
25
25
  let endpoints;
26
- before(() => {
26
+ beforeAll(() => {
27
27
  const app = express();
28
28
  endpoints = listEndpoints(app);
29
29
  });
@@ -34,7 +34,7 @@ describe('listEndpoints', () => {
34
34
  });
35
35
  describe('when called over an app', () => {
36
36
  let endpoints;
37
- before(() => {
37
+ beforeAll(() => {
38
38
  const app = express();
39
39
  app
40
40
  .route('/')
@@ -63,7 +63,7 @@ describe('listEndpoints', () => {
63
63
  });
64
64
  describe('when called over a router', () => {
65
65
  let endpoints;
66
- before(() => {
66
+ beforeAll(() => {
67
67
  const router = express.Router();
68
68
  router
69
69
  .route('/')
@@ -92,7 +92,7 @@ describe('listEndpoints', () => {
92
92
  });
93
93
  describe('when called over an app with mounted routers', () => {
94
94
  let endpoints;
95
- before(() => {
95
+ beforeAll(() => {
96
96
  const app = express();
97
97
  const router = express.Router();
98
98
  app
@@ -122,7 +122,7 @@ describe('listEndpoints', () => {
122
122
  });
123
123
  describe('and some of the routers has the option `mergeParams`', () => {
124
124
  let endpoints;
125
- before(() => {
125
+ beforeAll(() => {
126
126
  const app = express();
127
127
  const router = express.Router({ mergeParams: true });
128
128
  router.get('/:id/friends', (_req, res) => {
@@ -137,7 +137,7 @@ describe('listEndpoints', () => {
137
137
  });
138
138
  describe('and also has a sub-router on the router', () => {
139
139
  let endpoints;
140
- before(() => {
140
+ beforeAll(() => {
141
141
  const app = express();
142
142
  const router = express.Router({ mergeParams: true });
143
143
  const subRouter = express.Router();
@@ -158,7 +158,7 @@ describe('listEndpoints', () => {
158
158
  describe('when the defined routes', () => {
159
159
  describe('contains underscores', () => {
160
160
  let endpoints;
161
- before(() => {
161
+ beforeAll(() => {
162
162
  const router = express.Router();
163
163
  router.get('/some_route', (_req, res) => {
164
164
  res.end();
@@ -180,7 +180,7 @@ describe('listEndpoints', () => {
180
180
  });
181
181
  describe('contains hyphens', () => {
182
182
  let endpoints;
183
- before(() => {
183
+ beforeAll(() => {
184
184
  const router = express.Router();
185
185
  router.get('/some-route', (_req, res) => {
186
186
  res.end();
@@ -202,7 +202,7 @@ describe('listEndpoints', () => {
202
202
  });
203
203
  describe('contains dots', () => {
204
204
  let endpoints;
205
- before(() => {
205
+ beforeAll(() => {
206
206
  const router = express.Router();
207
207
  router.get('/some.route', (_req, res) => {
208
208
  res.end();
@@ -224,7 +224,7 @@ describe('listEndpoints', () => {
224
224
  });
225
225
  describe('contains multiple different chars', () => {
226
226
  let endpoints;
227
- before(() => {
227
+ beforeAll(() => {
228
228
  const router = express.Router();
229
229
  router.get('/s0m3_r.oute', (_req, res) => {
230
230
  res.end();
@@ -247,7 +247,7 @@ describe('listEndpoints', () => {
247
247
  });
248
248
  describe('when called over a mounted router with only root path', () => {
249
249
  let endpoints;
250
- before(() => {
250
+ beforeAll(() => {
251
251
  const app = express();
252
252
  const router = express.Router();
253
253
  router.get('/', (_req, res) => {
@@ -265,7 +265,7 @@ describe('listEndpoints', () => {
265
265
  });
266
266
  describe('when called over a multi-level base route', () => {
267
267
  let endpoints;
268
- before(() => {
268
+ beforeAll(() => {
269
269
  const app = express();
270
270
  const router = express.Router();
271
271
  router.get('/my/path', (_req, res) => {
@@ -282,7 +282,7 @@ describe('listEndpoints', () => {
282
282
  });
283
283
  describe('with params', () => {
284
284
  let endpoints;
285
- before(() => {
285
+ beforeAll(() => {
286
286
  const app = express();
287
287
  const router = express.Router();
288
288
  router.get('/users/:id', (_req, res) => {
@@ -302,7 +302,7 @@ describe('listEndpoints', () => {
302
302
  });
303
303
  describe('with params in middle of the pattern', () => {
304
304
  let endpoints;
305
- before(() => {
305
+ beforeAll(() => {
306
306
  const app = express();
307
307
  const router = express.Router();
308
308
  router.get('/super/users/:id/friends', (_req, res) => {
@@ -319,7 +319,7 @@ describe('listEndpoints', () => {
319
319
  });
320
320
  describe('when called over a route with params', () => {
321
321
  let endpoints;
322
- before(() => {
322
+ beforeAll(() => {
323
323
  const app = express();
324
324
  app.get('/users/:id', (_req, res) => {
325
325
  res.end();
@@ -333,7 +333,7 @@ describe('listEndpoints', () => {
333
333
  });
334
334
  describe('when called over a route with params in middle of the pattern', () => {
335
335
  let endpoints;
336
- before(() => {
336
+ beforeAll(() => {
337
337
  const app = express();
338
338
  app.get('/users/:id/friends', (_req, res) => {
339
339
  res.end();
@@ -347,7 +347,7 @@ describe('listEndpoints', () => {
347
347
  });
348
348
  describe('when called over a route with multiple methods with "/" path defined', () => {
349
349
  let endpoints;
350
- before(() => {
350
+ beforeAll(() => {
351
351
  const router = express.Router();
352
352
  router
353
353
  .post('/test', (_req, res) => {
@@ -370,7 +370,7 @@ describe('listEndpoints', () => {
370
370
  });
371
371
  describe('when called with middlewares', () => {
372
372
  let endpoints;
373
- before(() => {
373
+ beforeAll(() => {
374
374
  const router = express.Router();
375
375
  const exampleMiddleware = () => { };
376
376
  router.post('/test', [
@@ -393,7 +393,7 @@ describe('listEndpoints', () => {
393
393
  });
394
394
  describe('when called with an array of paths', () => {
395
395
  let endpoints;
396
- before(() => {
396
+ beforeAll(() => {
397
397
  const app = express();
398
398
  const router = express.Router();
399
399
  app.get(['/one', '/two'], (_req, res) => {
@@ -415,7 +415,7 @@ describe('listEndpoints', () => {
415
415
  });
416
416
  describe('when called with an app with a mounted sub-app', () => {
417
417
  let endpoints;
418
- before(() => {
418
+ beforeAll(() => {
419
419
  const app = express();
420
420
  const subApp = express();
421
421
  app.get('/', (_req, res) => {
@@ -439,7 +439,7 @@ describe('listEndpoints', () => {
439
439
  });
440
440
  describe('when called with route params with regexp', () => {
441
441
  let endpoints;
442
- before(() => {
442
+ beforeAll(() => {
443
443
  const app = express();
444
444
  app.get('/foo/:item_id(\\d+)/bar', (_req, res) => {
445
445
  res.end();
@@ -455,7 +455,7 @@ describe('listEndpoints', () => {
455
455
  });
456
456
  describe('when called with a route with multiple params with regexp', () => {
457
457
  let endpoints;
458
- before(() => {
458
+ beforeAll(() => {
459
459
  const app = express();
460
460
  app.get('/foo/bar/:baz_id(\\d+)/:biz_id(\\d+)', (_req, res) => {
461
461
  res.end();
@@ -471,7 +471,7 @@ describe('listEndpoints', () => {
471
471
  });
472
472
  describe('supports regexp validators for params in subapp', () => {
473
473
  let endpoints;
474
- before(() => {
474
+ beforeAll(() => {
475
475
  const app = express();
476
476
  const subApp = express.Router();
477
477
  subApp.get('/baz/:biz_id(\\d+)', (_req, res) => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert } from 'chai';\nimport express from 'express';\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 before(() => {\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 before(() => {\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 before(() => {\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 before(() => {\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 before(() => {\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 before(() => {\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 before(() => {\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 before(() => {\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 before(() => {\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 before(() => {\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 before(() => {\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 before(() => {\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 before(() => {\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 before(() => {\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 before(() => {\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 before(() => {\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 before(() => {\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 before(() => {\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 before(() => {\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 before(() => {\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 before(() => {\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 before(() => {\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 before(() => {\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.9",
3
+ "version": "1.0.10",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -12,27 +12,15 @@
12
12
  "scripts": {
13
13
  "build": "tsc",
14
14
  "dev": "tsc --watch --preserveWatchOutput",
15
- "test": "c8 mocha src/**/*.test.ts"
15
+ "test": "vitest run --coverage"
16
16
  },
17
17
  "devDependencies": {
18
18
  "@prairielearn/tsconfig": "^0.0.0",
19
- "@types/node": "^20.17.32",
20
- "c8": "^10.1.3",
21
- "chai": "^5.2.0",
19
+ "@types/node": "^20.17.57",
20
+ "@vitest/coverage-v8": "^3.1.4",
22
21
  "express": "^4.21.2",
23
- "mocha": "^11.1.0",
24
22
  "tsx": "^4.19.4",
25
- "typescript": "^5.8.3"
26
- },
27
- "c8": {
28
- "reporter": [
29
- "html",
30
- "text-summary",
31
- "cobertura"
32
- ],
33
- "all": true,
34
- "include": [
35
- "src/**"
36
- ]
23
+ "typescript": "^5.8.3",
24
+ "vitest": "^3.1.4"
37
25
  }
38
26
  }
package/src/index.test.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { assert } from 'chai';
2
1
  import express from 'express';
2
+ import { assert, beforeAll, describe, it } from 'vitest';
3
3
 
4
4
  import listEndpoints, { type Endpoint } from '../src/index.js';
5
5
 
@@ -31,7 +31,7 @@ describe('listEndpoints', () => {
31
31
  describe('when called with non configured app', () => {
32
32
  let endpoints: Endpoint[];
33
33
 
34
- before(() => {
34
+ beforeAll(() => {
35
35
  const app = express();
36
36
 
37
37
  endpoints = listEndpoints(app);
@@ -46,7 +46,7 @@ describe('listEndpoints', () => {
46
46
  describe('when called over an app', () => {
47
47
  let endpoints: Endpoint[];
48
48
 
49
- before(() => {
49
+ beforeAll(() => {
50
50
  const app = express();
51
51
 
52
52
  app
@@ -81,7 +81,7 @@ describe('listEndpoints', () => {
81
81
  describe('when called over a router', () => {
82
82
  let endpoints: Endpoint[];
83
83
 
84
- before(() => {
84
+ beforeAll(() => {
85
85
  const router = express.Router();
86
86
 
87
87
  router
@@ -116,7 +116,7 @@ describe('listEndpoints', () => {
116
116
  describe('when called over an app with mounted routers', () => {
117
117
  let endpoints: Endpoint[];
118
118
 
119
- before(() => {
119
+ beforeAll(() => {
120
120
  const app = express();
121
121
  const router = express.Router();
122
122
 
@@ -153,7 +153,7 @@ describe('listEndpoints', () => {
153
153
  describe('and some of the routers has the option `mergeParams`', () => {
154
154
  let endpoints: Endpoint[];
155
155
 
156
- before(() => {
156
+ beforeAll(() => {
157
157
  const app = express();
158
158
  const router = express.Router({ mergeParams: true });
159
159
 
@@ -174,7 +174,7 @@ describe('listEndpoints', () => {
174
174
  describe('and also has a sub-router on the router', () => {
175
175
  let endpoints: Endpoint[];
176
176
 
177
- before(() => {
177
+ beforeAll(() => {
178
178
  const app = express();
179
179
  const router = express.Router({ mergeParams: true });
180
180
  const subRouter = express.Router();
@@ -202,7 +202,7 @@ describe('listEndpoints', () => {
202
202
  describe('contains underscores', () => {
203
203
  let endpoints: Endpoint[];
204
204
 
205
- before(() => {
205
+ beforeAll(() => {
206
206
  const router = express.Router();
207
207
 
208
208
  router.get('/some_route', (_req, res) => {
@@ -231,7 +231,7 @@ describe('listEndpoints', () => {
231
231
  describe('contains hyphens', () => {
232
232
  let endpoints: Endpoint[];
233
233
 
234
- before(() => {
234
+ beforeAll(() => {
235
235
  const router = express.Router();
236
236
 
237
237
  router.get('/some-route', (_req, res) => {
@@ -260,7 +260,7 @@ describe('listEndpoints', () => {
260
260
  describe('contains dots', () => {
261
261
  let endpoints: Endpoint[];
262
262
 
263
- before(() => {
263
+ beforeAll(() => {
264
264
  const router = express.Router();
265
265
 
266
266
  router.get('/some.route', (_req, res) => {
@@ -289,7 +289,7 @@ describe('listEndpoints', () => {
289
289
  describe('contains multiple different chars', () => {
290
290
  let endpoints: Endpoint[];
291
291
 
292
- before(() => {
292
+ beforeAll(() => {
293
293
  const router = express.Router();
294
294
 
295
295
  router.get('/s0m3_r.oute', (_req, res) => {
@@ -319,7 +319,7 @@ describe('listEndpoints', () => {
319
319
  describe('when called over a mounted router with only root path', () => {
320
320
  let endpoints: Endpoint[];
321
321
 
322
- before(() => {
322
+ beforeAll(() => {
323
323
  const app = express();
324
324
  const router = express.Router();
325
325
 
@@ -343,7 +343,7 @@ describe('listEndpoints', () => {
343
343
  describe('when called over a multi-level base route', () => {
344
344
  let endpoints: Endpoint[];
345
345
 
346
- before(() => {
346
+ beforeAll(() => {
347
347
  const app = express();
348
348
  const router = express.Router();
349
349
 
@@ -366,7 +366,7 @@ describe('listEndpoints', () => {
366
366
  describe('with params', () => {
367
367
  let endpoints: Endpoint[];
368
368
 
369
- before(() => {
369
+ beforeAll(() => {
370
370
  const app = express();
371
371
  const router = express.Router();
372
372
 
@@ -393,7 +393,7 @@ describe('listEndpoints', () => {
393
393
  describe('with params in middle of the pattern', () => {
394
394
  let endpoints: Endpoint[];
395
395
 
396
- before(() => {
396
+ beforeAll(() => {
397
397
  const app = express();
398
398
  const router = express.Router();
399
399
 
@@ -416,7 +416,7 @@ describe('listEndpoints', () => {
416
416
  describe('when called over a route with params', () => {
417
417
  let endpoints: Endpoint[];
418
418
 
419
- before(() => {
419
+ beforeAll(() => {
420
420
  const app = express();
421
421
 
422
422
  app.get('/users/:id', (_req, res) => {
@@ -435,7 +435,7 @@ describe('listEndpoints', () => {
435
435
  describe('when called over a route with params in middle of the pattern', () => {
436
436
  let endpoints: Endpoint[];
437
437
 
438
- before(() => {
438
+ beforeAll(() => {
439
439
  const app = express();
440
440
 
441
441
  app.get('/users/:id/friends', (_req, res) => {
@@ -454,7 +454,7 @@ describe('listEndpoints', () => {
454
454
  describe('when called over a route with multiple methods with "/" path defined', () => {
455
455
  let endpoints: Endpoint[];
456
456
 
457
- before(() => {
457
+ beforeAll(() => {
458
458
  const router = express.Router();
459
459
 
460
460
  router
@@ -483,7 +483,7 @@ describe('listEndpoints', () => {
483
483
  describe('when called with middlewares', () => {
484
484
  let endpoints: Endpoint[];
485
485
 
486
- before(() => {
486
+ beforeAll(() => {
487
487
  const router = express.Router();
488
488
 
489
489
  const exampleMiddleware = () => {};
@@ -513,7 +513,7 @@ describe('listEndpoints', () => {
513
513
  describe('when called with an array of paths', () => {
514
514
  let endpoints: Endpoint[];
515
515
 
516
- before(() => {
516
+ beforeAll(() => {
517
517
  const app = express();
518
518
  const router = express.Router();
519
519
 
@@ -542,7 +542,7 @@ describe('listEndpoints', () => {
542
542
  describe('when called with an app with a mounted sub-app', () => {
543
543
  let endpoints: Endpoint[];
544
544
 
545
- before(() => {
545
+ beforeAll(() => {
546
546
  const app = express();
547
547
  const subApp = express();
548
548
 
@@ -573,7 +573,7 @@ describe('listEndpoints', () => {
573
573
  describe('when called with route params with regexp', () => {
574
574
  let endpoints: Endpoint[];
575
575
 
576
- before(() => {
576
+ beforeAll(() => {
577
577
  const app = express();
578
578
 
579
579
  app.get('/foo/:item_id(\\d+)/bar', (_req, res) => {
@@ -594,7 +594,7 @@ describe('listEndpoints', () => {
594
594
  describe('when called with a route with multiple params with regexp', () => {
595
595
  let endpoints: Endpoint[];
596
596
 
597
- before(() => {
597
+ beforeAll(() => {
598
598
  const app = express();
599
599
 
600
600
  app.get('/foo/bar/:baz_id(\\d+)/:biz_id(\\d+)', (_req, res) => {
@@ -615,7 +615,7 @@ describe('listEndpoints', () => {
615
615
  describe('supports regexp validators for params in subapp', () => {
616
616
  let endpoints: Endpoint[];
617
617
 
618
- before(() => {
618
+ beforeAll(() => {
619
619
  const app = express();
620
620
  const subApp = express.Router();
621
621
 
package/tsconfig.json CHANGED
@@ -3,6 +3,6 @@
3
3
  "compilerOptions": {
4
4
  "outDir": "./dist",
5
5
  "rootDir": "./src",
6
- "types": ["mocha", "node"]
6
+ "types": ["node"]
7
7
  }
8
8
  }
@@ -0,0 +1,11 @@
1
+ import { defineConfig } from 'vitest/config';
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ coverage: {
6
+ reporter: ['html', 'text-summary', 'cobertura'],
7
+ all: true,
8
+ include: ['src/**'],
9
+ },
10
+ },
11
+ });