@eggjs/router 4.0.0-beta.34 → 4.0.0-beta.36

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/dist/Router.js CHANGED
@@ -1,779 +1,678 @@
1
- /**
2
- * RESTful resource routing middleware for eggjs.
3
- */
4
- import { debuglog } from 'node:util';
5
- import assert from 'node:assert';
6
- import compose from 'koa-compose';
7
- import HttpError from 'http-errors';
8
- import methods from 'methods';
9
1
  import { Layer } from "./Layer.js";
10
- import {} from "./types.js";
11
- const debug = debuglog('egg/router:Router');
12
- export class Router {
13
- opts;
14
- methods;
15
- /** Layer stack */
16
- stack = [];
17
- params = {};
18
- /**
19
- * Create a new router.
20
- *
21
- * @example
22
- *
23
- * Basic usage:
24
- *
25
- * ```javascript
26
- * var Koa = require('koa');
27
- * var Router = require('koa-router');
28
- *
29
- * var app = new Koa();
30
- * var router = new Router();
31
- *
32
- * router.get('/', (ctx, next) => {
33
- * // ctx.router available
34
- * });
35
- *
36
- * app
37
- * .use(router.routes())
38
- * .use(router.allowedMethods());
39
- * ```
40
- *
41
- * @alias module:koa-router
42
- * @param {Object=} opts optional
43
- * @param {String=} opts.prefix prefix router paths
44
- * @class
45
- */
46
- constructor(opts) {
47
- this.opts = opts ?? {};
48
- this.methods = this.opts.methods ?? ['HEAD', 'OPTIONS', 'GET', 'PUT', 'PATCH', 'POST', 'DELETE'];
49
- }
50
- use(pathOrMiddleware, ...middlewares) {
51
- // support array of paths
52
- // use(paths, ...middlewares)
53
- if (Array.isArray(pathOrMiddleware) && typeof pathOrMiddleware[0] === 'string') {
54
- for (const path of pathOrMiddleware) {
55
- this.use(path, ...middlewares);
56
- }
57
- return this;
58
- }
59
- let path = '';
60
- let hasPath = false;
61
- if (typeof pathOrMiddleware === 'string') {
62
- // use(path, ...middlewares)
63
- path = pathOrMiddleware;
64
- hasPath = true;
65
- }
66
- else if (typeof pathOrMiddleware === 'function') {
67
- // use(...middlewares)
68
- middlewares = [pathOrMiddleware, ...middlewares];
69
- }
70
- for (const m of middlewares) {
71
- if (m.router) {
72
- for (const nestedLayer of m.router.stack) {
73
- if (path) {
74
- nestedLayer.setPrefix(path);
75
- }
76
- if (this.opts.prefix) {
77
- nestedLayer.setPrefix(this.opts.prefix);
78
- }
79
- this.stack.push(nestedLayer);
80
- }
81
- if (this.params) {
82
- for (const key in this.params) {
83
- m.router.param(key, this.params[key]);
84
- }
85
- }
86
- }
87
- else {
88
- this.register(path || '(.*)', [], m, {
89
- end: false,
90
- ignoreCaptures: !hasPath,
91
- });
92
- }
93
- }
94
- return this;
95
- }
96
- /**
97
- * Set the path prefix for a Router instance that was already initialized.
98
- *
99
- * @example
100
- *
101
- * ```javascript
102
- * router.prefix('/things/:thing_id')
103
- * ```
104
- *
105
- * @param {String} prefix prefix string
106
- * @return {Router} router instance
107
- */
108
- prefix(prefix) {
109
- prefix = prefix.replace(/\/$/, '');
110
- this.opts.prefix = prefix;
111
- for (const layer of this.stack) {
112
- layer.setPrefix(prefix);
113
- }
114
- return this;
115
- }
116
- /**
117
- * Returns router middleware which dispatches a route matching the request.
118
- *
119
- * @return {Function} middleware function
120
- */
121
- routes() {
122
- const dispatch = (ctx, next) => {
123
- const routerPath = this.opts.routerPath || ctx.routerPath || ctx.path;
124
- const matched = this.match(routerPath, ctx.method);
125
- debug('dispatch: %s %s, routerPath: %s, matched: %s', ctx.method, ctx.path, routerPath, matched.route);
126
- if (ctx.matched) {
127
- ctx.matched.push(...matched.path);
128
- }
129
- else {
130
- ctx.matched = matched.path;
131
- }
132
- ctx.router = this;
133
- if (!matched.route) {
134
- return next();
135
- }
136
- const matchedLayers = matched.pathAndMethod;
137
- const layerChain = matchedLayers.reduce((memo, layer) => {
138
- memo.push((ctx, next) => {
139
- // ctx.captures = layer.captures(routerPath, ctx.captures);
140
- ctx.captures = layer.captures(routerPath);
141
- ctx.params = layer.params(routerPath, ctx.captures, ctx.params);
142
- // ctx._matchedRouteName & ctx._matchedRoute for compatibility
143
- ctx._matchedRouteName = ctx.routerName = layer.name;
144
- if (!layer.name) {
145
- ctx._matchedRouteName = undefined;
146
- }
147
- ctx._matchedRoute = ctx.routerPath = layer.path;
148
- return next();
149
- });
150
- return memo.concat(layer.stack);
151
- }, []);
152
- return compose(layerChain)(ctx, next);
153
- };
154
- dispatch.router = this;
155
- return dispatch;
156
- }
157
- /**
158
- * @alias to routes()
159
- */
160
- middleware() {
161
- return this.routes();
162
- }
163
- /**
164
- * Returns separate middleware for responding to `OPTIONS` requests with
165
- * an `Allow` header containing the allowed methods, as well as responding
166
- * with `405 Method Not Allowed` and `501 Not Implemented` as appropriate.
167
- *
168
- * @example
169
- *
170
- * ```javascript
171
- * var Koa = require('koa');
172
- * var Router = require('koa-router');
173
- *
174
- * var app = new Koa();
175
- * var router = new Router();
176
- *
177
- * app.use(router.routes());
178
- * app.use(router.allowedMethods());
179
- * ```
180
- *
181
- * **Example with [Boom](https://github.com/hapijs/boom)**
182
- *
183
- * ```javascript
184
- * var Koa = require('koa');
185
- * var Router = require('koa-router');
186
- * var Boom = require('boom');
187
- *
188
- * var app = new Koa();
189
- * var router = new Router();
190
- *
191
- * app.use(router.routes());
192
- * app.use(router.allowedMethods({
193
- * throw: true,
194
- * notImplemented: () => new Boom.notImplemented(),
195
- * methodNotAllowed: () => new Boom.methodNotAllowed()
196
- * }));
197
- * ```
198
- *
199
- * @param {Object=} options optional params
200
- * @param {Boolean=} options.throw throw error instead of setting status and header
201
- * @param {Function=} options.notImplemented throw the returned value in place of the default NotImplemented error
202
- * @param {Function=} options.methodNotAllowed throw the returned value in place of the default MethodNotAllowed error
203
- * @return {Function} middleware function
204
- */
205
- allowedMethods(options) {
206
- const implemented = this.methods;
207
- return async function allowedMethods(ctx, next) {
208
- await next();
209
- if (ctx.status && ctx.status !== 404)
210
- return;
211
- const allowed = {};
212
- ctx.matched.forEach((route) => {
213
- route.methods.forEach((method) => {
214
- allowed[method] = method;
215
- });
216
- });
217
- const allowedMethods = Object.keys(allowed);
218
- if (!implemented.includes(ctx.method)) {
219
- if (options?.throw) {
220
- let notImplementedThrowable;
221
- if (typeof options?.notImplemented === 'function') {
222
- notImplementedThrowable = options.notImplemented(); // set whatever the user returns from their function
223
- }
224
- else {
225
- notImplementedThrowable = new HttpError.NotImplemented();
226
- }
227
- throw notImplementedThrowable;
228
- }
229
- else {
230
- ctx.status = 501;
231
- ctx.set('Allow', allowedMethods.join(', '));
232
- }
233
- }
234
- else if (allowedMethods.length > 0) {
235
- if (ctx.method === 'OPTIONS') {
236
- ctx.status = 200;
237
- ctx.body = '';
238
- ctx.set('Allow', allowedMethods.join(', '));
239
- }
240
- else if (!allowed[ctx.method]) {
241
- if (options?.throw) {
242
- let notAllowedThrowable;
243
- if (typeof options?.methodNotAllowed === 'function') {
244
- notAllowedThrowable = options.methodNotAllowed(); // set whatever the user returns from their function
245
- }
246
- else {
247
- notAllowedThrowable = new HttpError.MethodNotAllowed();
248
- }
249
- throw notAllowedThrowable;
250
- }
251
- else {
252
- ctx.status = 405;
253
- ctx.set('Allow', allowedMethods.join(', '));
254
- }
255
- }
256
- }
257
- };
258
- }
259
- /**
260
- * Redirect `source` to `destination` URL with optional 30x status `code`.
261
- *
262
- * Both `source` and `destination` can be route names.
263
- *
264
- * ```javascript
265
- * router.redirect('/login', 'sign-in');
266
- * ```
267
- *
268
- * This is equivalent to:
269
- *
270
- * ```javascript
271
- * router.all('/login', ctx => {
272
- * ctx.redirect('/sign-in');
273
- * ctx.status = 301;
274
- * });
275
- * ```
276
- *
277
- * @param {String} source URL or route name.
278
- * @param {String} destination URL or route name.
279
- * @param {Number=} status HTTP status code (default: 301).
280
- * @return {Router} router instance
281
- */
282
- redirect(source, destination, status = 301) {
283
- // lookup source route by name
284
- if (source[0] !== '/') {
285
- const routeUrl = this.url(source);
286
- if (routeUrl instanceof Error) {
287
- throw routeUrl;
288
- }
289
- source = routeUrl;
290
- }
291
- // lookup destination route by name
292
- if (destination[0] !== '/') {
293
- const routeUrl = this.url(destination);
294
- if (routeUrl instanceof Error) {
295
- throw routeUrl;
296
- }
297
- destination = routeUrl;
298
- }
299
- return this.all(source, (ctx) => {
300
- ctx.redirect(destination);
301
- ctx.status = status;
302
- });
303
- }
304
- /**
305
- * Create and register a route.
306
- *
307
- * @param {String|RegExp|(String|RegExp)[]} path Path string.
308
- * @param {String[]} methods Array of HTTP verbs.
309
- * @param {Function|Function[]} middleware Multiple middleware also accepted.
310
- * @param {Object} [opts] optional params
311
- * @private
312
- */
313
- register(path, methods, middleware, opts) {
314
- // support array of paths
315
- if (Array.isArray(path)) {
316
- const routes = [];
317
- for (const p of path) {
318
- const route = this.#register(p, methods, middleware, opts);
319
- routes.push(route);
320
- }
321
- return routes;
322
- }
323
- // create route
324
- const route = this.#register(path, methods, middleware, opts);
325
- return route;
326
- }
327
- #register(path, methods, middleware, opts) {
328
- opts = opts ?? {};
329
- // create route
330
- const route = new Layer(path, methods, middleware, {
331
- end: opts.end === false ? opts.end : true,
332
- name: opts.name,
333
- sensitive: opts.sensitive ?? this.opts.sensitive ?? false,
334
- strict: opts.strict ?? this.opts.strict ?? false,
335
- prefix: opts.prefix ?? this.opts.prefix ?? '',
336
- ignoreCaptures: opts.ignoreCaptures,
337
- });
338
- // FIXME: why???
339
- if (this.opts.prefix) {
340
- route.setPrefix(this.opts.prefix);
341
- }
342
- // add parameter middleware to the new route layer
343
- for (const param in this.params) {
344
- route.param(param, this.params[param]);
345
- }
346
- this.stack.push(route);
347
- return route;
348
- }
349
- /**
350
- * Lookup route with given `name`.
351
- *
352
- * @param {String} name route name
353
- * @return {Layer|false} layer instance of false
354
- */
355
- route(name) {
356
- for (const route of this.stack) {
357
- if (route.name === name) {
358
- return route;
359
- }
360
- }
361
- return false;
362
- }
363
- /**
364
- * Generate URL for route. Takes a route name and map of named `params`.
365
- *
366
- * @example
367
- *
368
- * ```javascript
369
- * router.get('user', '/users/:id', (ctx, next) => {
370
- * // ...
371
- * });
372
- *
373
- * router.url('user', 3);
374
- * // => "/users/3"
375
- *
376
- * router.url('user', { id: 3 });
377
- * // => "/users/3"
378
- *
379
- * router.use((ctx, next) => {
380
- * // redirect to named route
381
- * ctx.redirect(ctx.router.url('sign-in'));
382
- * })
383
- *
384
- * router.url('user', { id: 3 }, { query: { limit: 1 } });
385
- * // => "/users/3?limit=1"
386
- *
387
- * router.url('user', { id: 3 }, { query: "limit=1" });
388
- * // => "/users/3?limit=1"
389
- * ```
390
- */
391
- url(name, params, ...paramsOrOptions) {
392
- const route = this.route(name);
393
- if (route) {
394
- return route.url(params, ...paramsOrOptions);
395
- }
396
- return new Error(`No route found for name: ${name}`);
397
- }
398
- /**
399
- * Generate URL from url pattern and given `params`.
400
- *
401
- * @example
402
- *
403
- * ```javascript
404
- * var url = Router.url('/users/:id', { id: 1 });
405
- * // => "/users/1"
406
- * ```
407
- *
408
- * @param {String} path url pattern
409
- * @param {Object} params url parameters
410
- * @return {String} url string
411
- */
412
- static url(path, params, ...paramsOrOptions) {
413
- return Layer.prototype.url.call({ path }, params, ...paramsOrOptions);
414
- }
415
- /**
416
- * Match given `path` and return corresponding routes.
417
- *
418
- * @param {String} path path string
419
- * @param {String} method method name
420
- * @return {Object.<path, pathAndMethod>} returns layers that matched path and
421
- * path and method.
422
- * @private
423
- */
424
- match(path, method) {
425
- const matched = {
426
- // matched path
427
- path: [],
428
- // matched path and method(including none method)
429
- pathAndMethod: [],
430
- // method matched or not
431
- route: false,
432
- };
433
- for (const layer of this.stack) {
434
- debug('test %s %s', layer.path, layer.regexp);
435
- if (layer.match(path)) {
436
- matched.path.push(layer);
437
- if (layer.methods.length === 0 || layer.methods.includes(method)) {
438
- matched.pathAndMethod.push(layer);
439
- if (layer.methods.length > 0) {
440
- matched.route = true;
441
- }
442
- }
443
- // if (layer.methods.length === 0) {
444
- // matched.pathAndMethod.push(layer);
445
- // } else if (layer.methods.includes(method)) {
446
- // matched.pathAndMethod.push(layer);
447
- // matched.route = true;
448
- // }
449
- }
450
- }
451
- return matched;
452
- }
453
- /**
454
- * Run middleware for named route parameters. Useful for auto-loading or
455
- * validation.
456
- *
457
- * @example
458
- *
459
- * ```javascript
460
- * router
461
- * .param('user', (id, ctx, next) => {
462
- * ctx.user = users[id];
463
- * if (!ctx.user) return ctx.status = 404;
464
- * return next();
465
- * })
466
- * .get('/users/:user', ctx => {
467
- * ctx.body = ctx.user;
468
- * })
469
- * .get('/users/:user/friends', ctx => {
470
- * return ctx.user.getFriends().then(function(friends) {
471
- * ctx.body = friends;
472
- * });
473
- * })
474
- * // /users/3 => {"id": 3, "name": "Alex"}
475
- * // /users/3/friends => [{"id": 4, "name": "TJ"}]
476
- * ```
477
- *
478
- * @param {String} param param
479
- * @param {Function} middleware route middleware
480
- * @return {Router} instance
481
- */
482
- param(param, middleware) {
483
- this.params[param] = middleware;
484
- for (const route of this.stack) {
485
- route.param(param, middleware);
486
- }
487
- return this;
488
- }
489
- _formatRouteParams(nameOrPath, pathOrMiddleware, middlewares) {
490
- const options = {};
491
- let path;
492
- if (typeof nameOrPath === 'string' && nameOrPath.startsWith('/')) {
493
- // verb(method, path, ...middlewares)
494
- path = nameOrPath;
495
- middlewares = [pathOrMiddleware, ...middlewares];
496
- if (typeof pathOrMiddleware === 'string') {
497
- // verb(method, path, controllerString)
498
- // set controller name to router name
499
- options.name = pathOrMiddleware;
500
- }
501
- }
502
- else if (nameOrPath instanceof RegExp) {
503
- // verb(method, pathRegex, ...middlewares)
504
- path = nameOrPath;
505
- middlewares = [pathOrMiddleware, ...middlewares];
506
- if (typeof pathOrMiddleware === 'string') {
507
- // verb(method, pathRegex, controllerString)
508
- // set controller name to router name
509
- options.name = pathOrMiddleware;
510
- }
511
- }
512
- else if (Array.isArray(nameOrPath)) {
513
- // verb(method, paths, ...middlewares)
514
- path = nameOrPath;
515
- middlewares = [pathOrMiddleware, ...middlewares];
516
- if (typeof pathOrMiddleware === 'string') {
517
- // verb(method, pathRegex, controllerString)
518
- // set controller name to router name
519
- options.name = pathOrMiddleware;
520
- }
521
- }
522
- else if (typeof pathOrMiddleware === 'string' || pathOrMiddleware instanceof RegExp) {
523
- // verb(method, name, path, ...middlewares)
524
- path = pathOrMiddleware;
525
- assert(typeof nameOrPath === 'string', 'route name should be string');
526
- options.name = nameOrPath;
527
- }
528
- else if (Array.isArray(pathOrMiddleware)) {
529
- // verb(method, name, paths, ...middlewares)
530
- path = pathOrMiddleware;
531
- assert(typeof nameOrPath === 'string', 'route name should be string');
532
- options.name = nameOrPath;
533
- }
534
- else {
535
- // verb(method, path, ...middlewares)
536
- path = nameOrPath;
537
- middlewares = [pathOrMiddleware, ...middlewares];
538
- }
539
- return {
540
- path,
541
- middlewares,
542
- options,
543
- };
544
- }
545
- /**
546
- * Create `router.verb()` methods, where *verb* is one of the HTTP verbs such
547
- * as `router.get()` or `router.post()`.
548
- *
549
- * Match URL patterns to callback functions or controller actions using `router.verb()`,
550
- * where **verb** is one of the HTTP verbs such as `router.get()` or `router.post()`.
551
- *
552
- * Additionally, `router.all()` can be used to match against all methods.
553
- *
554
- * ```javascript
555
- * router
556
- * .get('/', (ctx, next) => {
557
- * ctx.body = 'Hello World!';
558
- * })
559
- * .post('/users', (ctx, next) => {
560
- * // ...
561
- * })
562
- * .put('/users/:id', (ctx, next) => {
563
- * // ...
564
- * })
565
- * .del('/users/:id', (ctx, next) => {
566
- * // ...
567
- * })
568
- * .all('/users/:id', (ctx, next) => {
569
- * // ...
570
- * });
571
- * ```
572
- *
573
- * When a route is matched, its path is available at `ctx._matchedRoute` and if named,
574
- * the name is available at `ctx._matchedRouteName`
575
- *
576
- * Route paths will be translated to regular expressions using
577
- * [path-to-regexp](https://github.com/pillarjs/path-to-regexp).
578
- *
579
- * Query strings will not be considered when matching requests.
580
- *
581
- * #### Named routes
582
- *
583
- * Routes can optionally have names. This allows generation of URLs and easy
584
- * renaming of URLs during development.
585
- *
586
- * ```javascript
587
- * router.get('user', '/users/:id', (ctx, next) => {
588
- * // ...
589
- * });
590
- *
591
- * router.url('user', 3);
592
- * // => "/users/3"
593
- * ```
594
- *
595
- * #### Multiple middleware
596
- *
597
- * Multiple middleware may be given:
598
- *
599
- * ```javascript
600
- * router.get(
601
- * '/users/:id',
602
- * (ctx, next) => {
603
- * return User.findOne(ctx.params.id).then(function(user) {
604
- * ctx.user = user;
605
- * next();
606
- * });
607
- * },
608
- * ctx => {
609
- * console.log(ctx.user);
610
- * // => { id: 17, name: "Alex" }
611
- * }
612
- * );
613
- * ```
614
- *
615
- * ### Nested routers
616
- *
617
- * Nesting routers is supported:
618
- *
619
- * ```javascript
620
- * var forums = new Router();
621
- * var posts = new Router();
622
- *
623
- * posts.get('/', (ctx, next) => {...});
624
- * posts.get('/:pid', (ctx, next) => {...});
625
- * forums.use('/forums/:fid/posts', posts.routes(), posts.allowedMethods());
626
- *
627
- * // responds to "/forums/123/posts" and "/forums/123/posts/123"
628
- * app.use(forums.routes());
629
- * ```
630
- *
631
- * #### Router prefixes
632
- *
633
- * Route paths can be prefixed at the router level:
634
- *
635
- * ```javascript
636
- * var router = new Router({
637
- * prefix: '/users'
638
- * });
639
- *
640
- * router.get('/', ...); // responds to "/users"
641
- * router.get('/:id', ...); // responds to "/users/:id"
642
- * ```
643
- *
644
- * #### URL parameters
645
- *
646
- * Named route parameters are captured and added to `ctx.params`.
647
- *
648
- * ```javascript
649
- * router.get('/:category/:title', (ctx, next) => {
650
- * console.log(ctx.params);
651
- * // => { category: 'programming', title: 'how-to-node' }
652
- * });
653
- * ```
654
- *
655
- * The [path-to-regexp](https://github.com/pillarjs/path-to-regexp) module is
656
- * used to convert paths to regular expressions.
657
- *
658
- */
659
- verb(method, nameOrPath, pathOrMiddleware, ...middleware) {
660
- const { options, path, middlewares } = this._formatRouteParams(nameOrPath, pathOrMiddleware, middleware);
661
- if (typeof method === 'string') {
662
- method = [method];
663
- }
664
- this.register(path, method, middlewares, options);
665
- return this;
666
- }
667
- all(nameOrPath, pathOrMiddleware, ...middlewares) {
668
- return this.verb(methods, nameOrPath, pathOrMiddleware, ...middlewares);
669
- }
670
- acl(nameOrPath, pathOrMiddleware, ...middlewares) {
671
- return this.verb('acl', nameOrPath, pathOrMiddleware, ...middlewares);
672
- }
673
- bind(nameOrPath, pathOrMiddleware, ...middlewares) {
674
- return this.verb('bind', nameOrPath, pathOrMiddleware, ...middlewares);
675
- }
676
- checkout(nameOrPath, pathOrMiddleware, ...middlewares) {
677
- return this.verb('checkout', nameOrPath, pathOrMiddleware, ...middlewares);
678
- }
679
- connect(nameOrPath, pathOrMiddleware, ...middlewares) {
680
- return this.verb('connect', nameOrPath, pathOrMiddleware, ...middlewares);
681
- }
682
- copy(nameOrPath, pathOrMiddleware, ...middlewares) {
683
- return this.verb('copy', nameOrPath, pathOrMiddleware, ...middlewares);
684
- }
685
- delete(nameOrPath, pathOrMiddleware, ...middlewares) {
686
- return this.verb('delete', nameOrPath, pathOrMiddleware, ...middlewares);
687
- }
688
- del(nameOrPath, pathOrMiddleware, ...middlewares) {
689
- return this.verb('delete', nameOrPath, pathOrMiddleware, ...middlewares);
690
- }
691
- get(nameOrPath, pathOrMiddleware, ...middlewares) {
692
- return this.verb('get', nameOrPath, pathOrMiddleware, ...middlewares);
693
- }
694
- query(nameOrPath, pathOrMiddleware, ...middlewares) {
695
- return this.verb('query', nameOrPath, pathOrMiddleware, ...middlewares);
696
- }
697
- head(nameOrPath, pathOrMiddleware, ...middlewares) {
698
- return this.verb('head', nameOrPath, pathOrMiddleware, ...middlewares);
699
- }
700
- link(nameOrPath, pathOrMiddleware, ...middlewares) {
701
- return this.verb('link', nameOrPath, pathOrMiddleware, ...middlewares);
702
- }
703
- lock(nameOrPath, pathOrMiddleware, ...middlewares) {
704
- return this.verb('lock', nameOrPath, pathOrMiddleware, ...middlewares);
705
- }
706
- ['m-search'](nameOrPath, pathOrMiddleware, ...middlewares) {
707
- return this.verb('m-search', nameOrPath, pathOrMiddleware, ...middlewares);
708
- }
709
- merge(nameOrPath, pathOrMiddleware, ...middlewares) {
710
- return this.verb('merge', nameOrPath, pathOrMiddleware, ...middlewares);
711
- }
712
- mkactivity(nameOrPath, pathOrMiddleware, ...middlewares) {
713
- return this.verb('mkactivity', nameOrPath, pathOrMiddleware, ...middlewares);
714
- }
715
- mkcalendar(nameOrPath, pathOrMiddleware, ...middlewares) {
716
- return this.verb('mkcalendar', nameOrPath, pathOrMiddleware, ...middlewares);
717
- }
718
- mkcol(nameOrPath, pathOrMiddleware, ...middlewares) {
719
- return this.verb('mkcol', nameOrPath, pathOrMiddleware, ...middlewares);
720
- }
721
- move(nameOrPath, pathOrMiddleware, ...middlewares) {
722
- return this.verb('move', nameOrPath, pathOrMiddleware, ...middlewares);
723
- }
724
- notify(nameOrPath, pathOrMiddleware, ...middlewares) {
725
- return this.verb('notify', nameOrPath, pathOrMiddleware, ...middlewares);
726
- }
727
- options(nameOrPath, pathOrMiddleware, ...middlewares) {
728
- return this.verb('options', nameOrPath, pathOrMiddleware, ...middlewares);
729
- }
730
- patch(nameOrPath, pathOrMiddleware, ...middlewares) {
731
- return this.verb('patch', nameOrPath, pathOrMiddleware, ...middlewares);
732
- }
733
- post(nameOrPath, pathOrMiddleware, ...middlewares) {
734
- return this.verb('post', nameOrPath, pathOrMiddleware, ...middlewares);
735
- }
736
- propfind(nameOrPath, pathOrMiddleware, ...middlewares) {
737
- return this.verb('propfind', nameOrPath, pathOrMiddleware, ...middlewares);
738
- }
739
- proppatch(nameOrPath, pathOrMiddleware, ...middlewares) {
740
- return this.verb('proppatch', nameOrPath, pathOrMiddleware, ...middlewares);
741
- }
742
- purge(nameOrPath, pathOrMiddleware, ...middlewares) {
743
- return this.verb('purge', nameOrPath, pathOrMiddleware, ...middlewares);
744
- }
745
- put(nameOrPath, pathOrMiddleware, ...middlewares) {
746
- return this.verb('put', nameOrPath, pathOrMiddleware, ...middlewares);
747
- }
748
- rebind(nameOrPath, pathOrMiddleware, ...middlewares) {
749
- return this.verb('rebind', nameOrPath, pathOrMiddleware, ...middlewares);
750
- }
751
- report(nameOrPath, pathOrMiddleware, ...middlewares) {
752
- return this.verb('report', nameOrPath, pathOrMiddleware, ...middlewares);
753
- }
754
- search(nameOrPath, pathOrMiddleware, ...middlewares) {
755
- return this.verb('search', nameOrPath, pathOrMiddleware, ...middlewares);
756
- }
757
- source(nameOrPath, pathOrMiddleware, ...middlewares) {
758
- return this.verb('source', nameOrPath, pathOrMiddleware, ...middlewares);
759
- }
760
- subscribe(nameOrPath, pathOrMiddleware, ...middlewares) {
761
- return this.verb('subscribe', nameOrPath, pathOrMiddleware, ...middlewares);
762
- }
763
- trace(nameOrPath, pathOrMiddleware, ...middlewares) {
764
- return this.verb('trace', nameOrPath, pathOrMiddleware, ...middlewares);
765
- }
766
- unbind(nameOrPath, pathOrMiddleware, ...middlewares) {
767
- return this.verb('unbind', nameOrPath, pathOrMiddleware, ...middlewares);
768
- }
769
- unlink(nameOrPath, pathOrMiddleware, ...middlewares) {
770
- return this.verb('unlink', nameOrPath, pathOrMiddleware, ...middlewares);
771
- }
772
- unlock(nameOrPath, pathOrMiddleware, ...middlewares) {
773
- return this.verb('unlock', nameOrPath, pathOrMiddleware, ...middlewares);
774
- }
775
- unsubscribe(nameOrPath, pathOrMiddleware, ...middlewares) {
776
- return this.verb('unsubscribe', nameOrPath, pathOrMiddleware, ...middlewares);
777
- }
778
- }
779
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckMsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sT0FBTyxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLFNBQVMsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBRSxLQUFLLEVBQXdCLE1BQU0sWUFBWSxDQUFDO0FBQ3pELE9BQU8sRUFNTixNQUFNLFlBQVksQ0FBQztBQUVwQixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQW9DNUMsTUFBTSxPQUFPLE1BQU07SUFDUixJQUFJLENBQWdCO0lBQ3BCLE9BQU8sQ0FBVztJQUMzQixrQkFBa0I7SUFDVCxLQUFLLEdBQVksRUFBRSxDQUFDO0lBQ3BCLE1BQU0sR0FBd0MsRUFBRSxDQUFDO0lBRTFEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0EyQkc7SUFDSCxZQUFZLElBQW9CO1FBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkcsQ0FBQztJQWdDRCxHQUFHLENBQUMsZ0JBQW9ELEVBQUUsR0FBRyxXQUE2QjtRQUN4Rix5QkFBeUI7UUFDekIsNkJBQTZCO1FBQzdCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLE9BQU8sZ0JBQWdCLENBQUMsQ0FBQyxD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
2
+ import assert from "node:assert";
3
+ import { debuglog } from "node:util";
4
+ import HttpError from "http-errors";
5
+ import compose from "koa-compose";
6
+ import methods from "methods";
7
+
8
+ //#region src/Router.ts
9
+ /**
10
+ * RESTful resource routing middleware for eggjs.
11
+ */
12
+ const debug = debuglog("egg/router:Router");
13
+ var Router = class {
14
+ opts;
15
+ methods;
16
+ /** Layer stack */
17
+ stack = [];
18
+ params = {};
19
+ /**
20
+ * Create a new router.
21
+ *
22
+ * @example
23
+ *
24
+ * Basic usage:
25
+ *
26
+ * ```javascript
27
+ * var Koa = require('koa');
28
+ * var Router = require('koa-router');
29
+ *
30
+ * var app = new Koa();
31
+ * var router = new Router();
32
+ *
33
+ * router.get('/', (ctx, next) => {
34
+ * // ctx.router available
35
+ * });
36
+ *
37
+ * app
38
+ * .use(router.routes())
39
+ * .use(router.allowedMethods());
40
+ * ```
41
+ *
42
+ * @alias module:koa-router
43
+ * @param {Object=} opts optional
44
+ * @param {String=} opts.prefix prefix router paths
45
+ * @class
46
+ */
47
+ constructor(opts) {
48
+ this.opts = opts ?? {};
49
+ this.methods = this.opts.methods ?? [
50
+ "HEAD",
51
+ "OPTIONS",
52
+ "GET",
53
+ "PUT",
54
+ "PATCH",
55
+ "POST",
56
+ "DELETE"
57
+ ];
58
+ }
59
+ use(pathOrMiddleware, ...middlewares) {
60
+ if (Array.isArray(pathOrMiddleware) && typeof pathOrMiddleware[0] === "string") {
61
+ for (const path$1 of pathOrMiddleware) this.use(path$1, ...middlewares);
62
+ return this;
63
+ }
64
+ let path = "";
65
+ let hasPath = false;
66
+ if (typeof pathOrMiddleware === "string") {
67
+ path = pathOrMiddleware;
68
+ hasPath = true;
69
+ } else if (typeof pathOrMiddleware === "function") middlewares = [pathOrMiddleware, ...middlewares];
70
+ for (const m of middlewares) if (m.router) {
71
+ for (const nestedLayer of m.router.stack) {
72
+ if (path) nestedLayer.setPrefix(path);
73
+ if (this.opts.prefix) nestedLayer.setPrefix(this.opts.prefix);
74
+ this.stack.push(nestedLayer);
75
+ }
76
+ if (this.params) for (const key in this.params) m.router.param(key, this.params[key]);
77
+ } else this.register(path || "(.*)", [], m, {
78
+ end: false,
79
+ ignoreCaptures: !hasPath
80
+ });
81
+ return this;
82
+ }
83
+ /**
84
+ * Set the path prefix for a Router instance that was already initialized.
85
+ *
86
+ * @example
87
+ *
88
+ * ```javascript
89
+ * router.prefix('/things/:thing_id')
90
+ * ```
91
+ *
92
+ * @param {String} prefix prefix string
93
+ * @return {Router} router instance
94
+ */
95
+ prefix(prefix) {
96
+ prefix = prefix.replace(/\/$/, "");
97
+ this.opts.prefix = prefix;
98
+ for (const layer of this.stack) layer.setPrefix(prefix);
99
+ return this;
100
+ }
101
+ /**
102
+ * Returns router middleware which dispatches a route matching the request.
103
+ *
104
+ * @return {Function} middleware function
105
+ */
106
+ routes() {
107
+ const dispatch = (ctx, next) => {
108
+ const routerPath = this.opts.routerPath || ctx.routerPath || ctx.path;
109
+ const matched = this.match(routerPath, ctx.method);
110
+ debug("dispatch: %s %s, routerPath: %s, matched: %s", ctx.method, ctx.path, routerPath, matched.route);
111
+ if (ctx.matched) ctx.matched.push(...matched.path);
112
+ else ctx.matched = matched.path;
113
+ ctx.router = this;
114
+ if (!matched.route) return next();
115
+ return compose(matched.pathAndMethod.reduce((memo, layer) => {
116
+ memo.push((ctx$1, next$1) => {
117
+ ctx$1.captures = layer.captures(routerPath);
118
+ ctx$1.params = layer.params(routerPath, ctx$1.captures, ctx$1.params);
119
+ ctx$1._matchedRouteName = ctx$1.routerName = layer.name;
120
+ if (!layer.name) ctx$1._matchedRouteName = void 0;
121
+ ctx$1._matchedRoute = ctx$1.routerPath = layer.path;
122
+ return next$1();
123
+ });
124
+ return memo.concat(layer.stack);
125
+ }, []))(ctx, next);
126
+ };
127
+ dispatch.router = this;
128
+ return dispatch;
129
+ }
130
+ /**
131
+ * @alias to routes()
132
+ */
133
+ middleware() {
134
+ return this.routes();
135
+ }
136
+ /**
137
+ * Returns separate middleware for responding to `OPTIONS` requests with
138
+ * an `Allow` header containing the allowed methods, as well as responding
139
+ * with `405 Method Not Allowed` and `501 Not Implemented` as appropriate.
140
+ *
141
+ * @example
142
+ *
143
+ * ```javascript
144
+ * var Koa = require('koa');
145
+ * var Router = require('koa-router');
146
+ *
147
+ * var app = new Koa();
148
+ * var router = new Router();
149
+ *
150
+ * app.use(router.routes());
151
+ * app.use(router.allowedMethods());
152
+ * ```
153
+ *
154
+ * **Example with [Boom](https://github.com/hapijs/boom)**
155
+ *
156
+ * ```javascript
157
+ * var Koa = require('koa');
158
+ * var Router = require('koa-router');
159
+ * var Boom = require('boom');
160
+ *
161
+ * var app = new Koa();
162
+ * var router = new Router();
163
+ *
164
+ * app.use(router.routes());
165
+ * app.use(router.allowedMethods({
166
+ * throw: true,
167
+ * notImplemented: () => new Boom.notImplemented(),
168
+ * methodNotAllowed: () => new Boom.methodNotAllowed()
169
+ * }));
170
+ * ```
171
+ *
172
+ * @param {Object=} options optional params
173
+ * @param {Boolean=} options.throw throw error instead of setting status and header
174
+ * @param {Function=} options.notImplemented throw the returned value in place of the default NotImplemented error
175
+ * @param {Function=} options.methodNotAllowed throw the returned value in place of the default MethodNotAllowed error
176
+ * @return {Function} middleware function
177
+ */
178
+ allowedMethods(options) {
179
+ const implemented = this.methods;
180
+ return async function allowedMethods(ctx, next) {
181
+ await next();
182
+ if (ctx.status && ctx.status !== 404) return;
183
+ const allowed = {};
184
+ ctx.matched.forEach((route) => {
185
+ route.methods.forEach((method) => {
186
+ allowed[method] = method;
187
+ });
188
+ });
189
+ const allowedMethods$1 = Object.keys(allowed);
190
+ if (!implemented.includes(ctx.method)) if (options?.throw) {
191
+ let notImplementedThrowable;
192
+ if (typeof options?.notImplemented === "function") notImplementedThrowable = options.notImplemented();
193
+ else notImplementedThrowable = new HttpError.NotImplemented();
194
+ throw notImplementedThrowable;
195
+ } else {
196
+ ctx.status = 501;
197
+ ctx.set("Allow", allowedMethods$1.join(", "));
198
+ }
199
+ else if (allowedMethods$1.length > 0) {
200
+ if (ctx.method === "OPTIONS") {
201
+ ctx.status = 200;
202
+ ctx.body = "";
203
+ ctx.set("Allow", allowedMethods$1.join(", "));
204
+ } else if (!allowed[ctx.method]) if (options?.throw) {
205
+ let notAllowedThrowable;
206
+ if (typeof options?.methodNotAllowed === "function") notAllowedThrowable = options.methodNotAllowed();
207
+ else notAllowedThrowable = new HttpError.MethodNotAllowed();
208
+ throw notAllowedThrowable;
209
+ } else {
210
+ ctx.status = 405;
211
+ ctx.set("Allow", allowedMethods$1.join(", "));
212
+ }
213
+ }
214
+ };
215
+ }
216
+ /**
217
+ * Redirect `source` to `destination` URL with optional 30x status `code`.
218
+ *
219
+ * Both `source` and `destination` can be route names.
220
+ *
221
+ * ```javascript
222
+ * router.redirect('/login', 'sign-in');
223
+ * ```
224
+ *
225
+ * This is equivalent to:
226
+ *
227
+ * ```javascript
228
+ * router.all('/login', ctx => {
229
+ * ctx.redirect('/sign-in');
230
+ * ctx.status = 301;
231
+ * });
232
+ * ```
233
+ *
234
+ * @param {String} source URL or route name.
235
+ * @param {String} destination URL or route name.
236
+ * @param {Number=} status HTTP status code (default: 301).
237
+ * @return {Router} router instance
238
+ */
239
+ redirect(source, destination, status = 301) {
240
+ if (source[0] !== "/") {
241
+ const routeUrl = this.url(source);
242
+ if (routeUrl instanceof Error) throw routeUrl;
243
+ source = routeUrl;
244
+ }
245
+ if (destination[0] !== "/") {
246
+ const routeUrl = this.url(destination);
247
+ if (routeUrl instanceof Error) throw routeUrl;
248
+ destination = routeUrl;
249
+ }
250
+ return this.all(source, (ctx) => {
251
+ ctx.redirect(destination);
252
+ ctx.status = status;
253
+ });
254
+ }
255
+ /**
256
+ * Create and register a route.
257
+ *
258
+ * @param {String|RegExp|(String|RegExp)[]} path Path string.
259
+ * @param {String[]} methods Array of HTTP verbs.
260
+ * @param {Function|Function[]} middleware Multiple middleware also accepted.
261
+ * @param {Object} [opts] optional params
262
+ * @private
263
+ */
264
+ register(path, methods$1, middleware, opts) {
265
+ if (Array.isArray(path)) {
266
+ const routes = [];
267
+ for (const p of path) {
268
+ const route = this.#register(p, methods$1, middleware, opts);
269
+ routes.push(route);
270
+ }
271
+ return routes;
272
+ }
273
+ return this.#register(path, methods$1, middleware, opts);
274
+ }
275
+ #register(path, methods$1, middleware, opts) {
276
+ opts = opts ?? {};
277
+ const route = new Layer(path, methods$1, middleware, {
278
+ end: opts.end === false ? opts.end : true,
279
+ name: opts.name,
280
+ sensitive: opts.sensitive ?? this.opts.sensitive ?? false,
281
+ strict: opts.strict ?? this.opts.strict ?? false,
282
+ prefix: opts.prefix ?? this.opts.prefix ?? "",
283
+ ignoreCaptures: opts.ignoreCaptures
284
+ });
285
+ if (this.opts.prefix) route.setPrefix(this.opts.prefix);
286
+ for (const param in this.params) route.param(param, this.params[param]);
287
+ this.stack.push(route);
288
+ return route;
289
+ }
290
+ /**
291
+ * Lookup route with given `name`.
292
+ *
293
+ * @param {String} name route name
294
+ * @return {Layer|false} layer instance of false
295
+ */
296
+ route(name) {
297
+ for (const route of this.stack) if (route.name === name) return route;
298
+ return false;
299
+ }
300
+ /**
301
+ * Generate URL for route. Takes a route name and map of named `params`.
302
+ *
303
+ * @example
304
+ *
305
+ * ```javascript
306
+ * router.get('user', '/users/:id', (ctx, next) => {
307
+ * // ...
308
+ * });
309
+ *
310
+ * router.url('user', 3);
311
+ * // => "/users/3"
312
+ *
313
+ * router.url('user', { id: 3 });
314
+ * // => "/users/3"
315
+ *
316
+ * router.use((ctx, next) => {
317
+ * // redirect to named route
318
+ * ctx.redirect(ctx.router.url('sign-in'));
319
+ * })
320
+ *
321
+ * router.url('user', { id: 3 }, { query: { limit: 1 } });
322
+ * // => "/users/3?limit=1"
323
+ *
324
+ * router.url('user', { id: 3 }, { query: "limit=1" });
325
+ * // => "/users/3?limit=1"
326
+ * ```
327
+ */
328
+ url(name, params, ...paramsOrOptions) {
329
+ const route = this.route(name);
330
+ if (route) return route.url(params, ...paramsOrOptions);
331
+ return /* @__PURE__ */ new Error(`No route found for name: ${name}`);
332
+ }
333
+ /**
334
+ * Generate URL from url pattern and given `params`.
335
+ *
336
+ * @example
337
+ *
338
+ * ```javascript
339
+ * var url = Router.url('/users/:id', { id: 1 });
340
+ * // => "/users/1"
341
+ * ```
342
+ *
343
+ * @param {String} path url pattern
344
+ * @param {Object} params url parameters
345
+ * @return {String} url string
346
+ */
347
+ static url(path, params, ...paramsOrOptions) {
348
+ return Layer.prototype.url.call({ path }, params, ...paramsOrOptions);
349
+ }
350
+ /**
351
+ * Match given `path` and return corresponding routes.
352
+ *
353
+ * @param {String} path path string
354
+ * @param {String} method method name
355
+ * @return {Object.<path, pathAndMethod>} returns layers that matched path and
356
+ * path and method.
357
+ * @private
358
+ */
359
+ match(path, method) {
360
+ const matched = {
361
+ path: [],
362
+ pathAndMethod: [],
363
+ route: false
364
+ };
365
+ for (const layer of this.stack) {
366
+ debug("test %s %s", layer.path, layer.regexp);
367
+ if (layer.match(path)) {
368
+ matched.path.push(layer);
369
+ if (layer.methods.length === 0 || layer.methods.includes(method)) {
370
+ matched.pathAndMethod.push(layer);
371
+ if (layer.methods.length > 0) matched.route = true;
372
+ }
373
+ }
374
+ }
375
+ return matched;
376
+ }
377
+ /**
378
+ * Run middleware for named route parameters. Useful for auto-loading or
379
+ * validation.
380
+ *
381
+ * @example
382
+ *
383
+ * ```javascript
384
+ * router
385
+ * .param('user', (id, ctx, next) => {
386
+ * ctx.user = users[id];
387
+ * if (!ctx.user) return ctx.status = 404;
388
+ * return next();
389
+ * })
390
+ * .get('/users/:user', ctx => {
391
+ * ctx.body = ctx.user;
392
+ * })
393
+ * .get('/users/:user/friends', ctx => {
394
+ * return ctx.user.getFriends().then(function(friends) {
395
+ * ctx.body = friends;
396
+ * });
397
+ * })
398
+ * // /users/3 => {"id": 3, "name": "Alex"}
399
+ * // /users/3/friends => [{"id": 4, "name": "TJ"}]
400
+ * ```
401
+ *
402
+ * @param {String} param param
403
+ * @param {Function} middleware route middleware
404
+ * @return {Router} instance
405
+ */
406
+ param(param, middleware) {
407
+ this.params[param] = middleware;
408
+ for (const route of this.stack) route.param(param, middleware);
409
+ return this;
410
+ }
411
+ _formatRouteParams(nameOrPath, pathOrMiddleware, middlewares) {
412
+ const options = {};
413
+ let path;
414
+ if (typeof nameOrPath === "string" && nameOrPath.startsWith("/")) {
415
+ path = nameOrPath;
416
+ middlewares = [pathOrMiddleware, ...middlewares];
417
+ if (typeof pathOrMiddleware === "string") options.name = pathOrMiddleware;
418
+ } else if (nameOrPath instanceof RegExp) {
419
+ path = nameOrPath;
420
+ middlewares = [pathOrMiddleware, ...middlewares];
421
+ if (typeof pathOrMiddleware === "string") options.name = pathOrMiddleware;
422
+ } else if (Array.isArray(nameOrPath)) {
423
+ path = nameOrPath;
424
+ middlewares = [pathOrMiddleware, ...middlewares];
425
+ if (typeof pathOrMiddleware === "string") options.name = pathOrMiddleware;
426
+ } else if (typeof pathOrMiddleware === "string" || pathOrMiddleware instanceof RegExp) {
427
+ path = pathOrMiddleware;
428
+ assert(typeof nameOrPath === "string", "route name should be string");
429
+ options.name = nameOrPath;
430
+ } else if (Array.isArray(pathOrMiddleware)) {
431
+ path = pathOrMiddleware;
432
+ assert(typeof nameOrPath === "string", "route name should be string");
433
+ options.name = nameOrPath;
434
+ } else {
435
+ path = nameOrPath;
436
+ middlewares = [pathOrMiddleware, ...middlewares];
437
+ }
438
+ return {
439
+ path,
440
+ middlewares,
441
+ options
442
+ };
443
+ }
444
+ /**
445
+ * Create `router.verb()` methods, where *verb* is one of the HTTP verbs such
446
+ * as `router.get()` or `router.post()`.
447
+ *
448
+ * Match URL patterns to callback functions or controller actions using `router.verb()`,
449
+ * where **verb** is one of the HTTP verbs such as `router.get()` or `router.post()`.
450
+ *
451
+ * Additionally, `router.all()` can be used to match against all methods.
452
+ *
453
+ * ```javascript
454
+ * router
455
+ * .get('/', (ctx, next) => {
456
+ * ctx.body = 'Hello World!';
457
+ * })
458
+ * .post('/users', (ctx, next) => {
459
+ * // ...
460
+ * })
461
+ * .put('/users/:id', (ctx, next) => {
462
+ * // ...
463
+ * })
464
+ * .del('/users/:id', (ctx, next) => {
465
+ * // ...
466
+ * })
467
+ * .all('/users/:id', (ctx, next) => {
468
+ * // ...
469
+ * });
470
+ * ```
471
+ *
472
+ * When a route is matched, its path is available at `ctx._matchedRoute` and if named,
473
+ * the name is available at `ctx._matchedRouteName`
474
+ *
475
+ * Route paths will be translated to regular expressions using
476
+ * [path-to-regexp](https://github.com/pillarjs/path-to-regexp).
477
+ *
478
+ * Query strings will not be considered when matching requests.
479
+ *
480
+ * #### Named routes
481
+ *
482
+ * Routes can optionally have names. This allows generation of URLs and easy
483
+ * renaming of URLs during development.
484
+ *
485
+ * ```javascript
486
+ * router.get('user', '/users/:id', (ctx, next) => {
487
+ * // ...
488
+ * });
489
+ *
490
+ * router.url('user', 3);
491
+ * // => "/users/3"
492
+ * ```
493
+ *
494
+ * #### Multiple middleware
495
+ *
496
+ * Multiple middleware may be given:
497
+ *
498
+ * ```javascript
499
+ * router.get(
500
+ * '/users/:id',
501
+ * (ctx, next) => {
502
+ * return User.findOne(ctx.params.id).then(function(user) {
503
+ * ctx.user = user;
504
+ * next();
505
+ * });
506
+ * },
507
+ * ctx => {
508
+ * console.log(ctx.user);
509
+ * // => { id: 17, name: "Alex" }
510
+ * }
511
+ * );
512
+ * ```
513
+ *
514
+ * ### Nested routers
515
+ *
516
+ * Nesting routers is supported:
517
+ *
518
+ * ```javascript
519
+ * var forums = new Router();
520
+ * var posts = new Router();
521
+ *
522
+ * posts.get('/', (ctx, next) => {...});
523
+ * posts.get('/:pid', (ctx, next) => {...});
524
+ * forums.use('/forums/:fid/posts', posts.routes(), posts.allowedMethods());
525
+ *
526
+ * // responds to "/forums/123/posts" and "/forums/123/posts/123"
527
+ * app.use(forums.routes());
528
+ * ```
529
+ *
530
+ * #### Router prefixes
531
+ *
532
+ * Route paths can be prefixed at the router level:
533
+ *
534
+ * ```javascript
535
+ * var router = new Router({
536
+ * prefix: '/users'
537
+ * });
538
+ *
539
+ * router.get('/', ...); // responds to "/users"
540
+ * router.get('/:id', ...); // responds to "/users/:id"
541
+ * ```
542
+ *
543
+ * #### URL parameters
544
+ *
545
+ * Named route parameters are captured and added to `ctx.params`.
546
+ *
547
+ * ```javascript
548
+ * router.get('/:category/:title', (ctx, next) => {
549
+ * console.log(ctx.params);
550
+ * // => { category: 'programming', title: 'how-to-node' }
551
+ * });
552
+ * ```
553
+ *
554
+ * The [path-to-regexp](https://github.com/pillarjs/path-to-regexp) module is
555
+ * used to convert paths to regular expressions.
556
+ *
557
+ */
558
+ verb(method, nameOrPath, pathOrMiddleware, ...middleware) {
559
+ const { options, path, middlewares } = this._formatRouteParams(nameOrPath, pathOrMiddleware, middleware);
560
+ if (typeof method === "string") method = [method];
561
+ this.register(path, method, middlewares, options);
562
+ return this;
563
+ }
564
+ all(nameOrPath, pathOrMiddleware, ...middlewares) {
565
+ return this.verb(methods, nameOrPath, pathOrMiddleware, ...middlewares);
566
+ }
567
+ acl(nameOrPath, pathOrMiddleware, ...middlewares) {
568
+ return this.verb("acl", nameOrPath, pathOrMiddleware, ...middlewares);
569
+ }
570
+ bind(nameOrPath, pathOrMiddleware, ...middlewares) {
571
+ return this.verb("bind", nameOrPath, pathOrMiddleware, ...middlewares);
572
+ }
573
+ checkout(nameOrPath, pathOrMiddleware, ...middlewares) {
574
+ return this.verb("checkout", nameOrPath, pathOrMiddleware, ...middlewares);
575
+ }
576
+ connect(nameOrPath, pathOrMiddleware, ...middlewares) {
577
+ return this.verb("connect", nameOrPath, pathOrMiddleware, ...middlewares);
578
+ }
579
+ copy(nameOrPath, pathOrMiddleware, ...middlewares) {
580
+ return this.verb("copy", nameOrPath, pathOrMiddleware, ...middlewares);
581
+ }
582
+ delete(nameOrPath, pathOrMiddleware, ...middlewares) {
583
+ return this.verb("delete", nameOrPath, pathOrMiddleware, ...middlewares);
584
+ }
585
+ del(nameOrPath, pathOrMiddleware, ...middlewares) {
586
+ return this.verb("delete", nameOrPath, pathOrMiddleware, ...middlewares);
587
+ }
588
+ get(nameOrPath, pathOrMiddleware, ...middlewares) {
589
+ return this.verb("get", nameOrPath, pathOrMiddleware, ...middlewares);
590
+ }
591
+ query(nameOrPath, pathOrMiddleware, ...middlewares) {
592
+ return this.verb("query", nameOrPath, pathOrMiddleware, ...middlewares);
593
+ }
594
+ head(nameOrPath, pathOrMiddleware, ...middlewares) {
595
+ return this.verb("head", nameOrPath, pathOrMiddleware, ...middlewares);
596
+ }
597
+ link(nameOrPath, pathOrMiddleware, ...middlewares) {
598
+ return this.verb("link", nameOrPath, pathOrMiddleware, ...middlewares);
599
+ }
600
+ lock(nameOrPath, pathOrMiddleware, ...middlewares) {
601
+ return this.verb("lock", nameOrPath, pathOrMiddleware, ...middlewares);
602
+ }
603
+ ["m-search"](nameOrPath, pathOrMiddleware, ...middlewares) {
604
+ return this.verb("m-search", nameOrPath, pathOrMiddleware, ...middlewares);
605
+ }
606
+ merge(nameOrPath, pathOrMiddleware, ...middlewares) {
607
+ return this.verb("merge", nameOrPath, pathOrMiddleware, ...middlewares);
608
+ }
609
+ mkactivity(nameOrPath, pathOrMiddleware, ...middlewares) {
610
+ return this.verb("mkactivity", nameOrPath, pathOrMiddleware, ...middlewares);
611
+ }
612
+ mkcalendar(nameOrPath, pathOrMiddleware, ...middlewares) {
613
+ return this.verb("mkcalendar", nameOrPath, pathOrMiddleware, ...middlewares);
614
+ }
615
+ mkcol(nameOrPath, pathOrMiddleware, ...middlewares) {
616
+ return this.verb("mkcol", nameOrPath, pathOrMiddleware, ...middlewares);
617
+ }
618
+ move(nameOrPath, pathOrMiddleware, ...middlewares) {
619
+ return this.verb("move", nameOrPath, pathOrMiddleware, ...middlewares);
620
+ }
621
+ notify(nameOrPath, pathOrMiddleware, ...middlewares) {
622
+ return this.verb("notify", nameOrPath, pathOrMiddleware, ...middlewares);
623
+ }
624
+ options(nameOrPath, pathOrMiddleware, ...middlewares) {
625
+ return this.verb("options", nameOrPath, pathOrMiddleware, ...middlewares);
626
+ }
627
+ patch(nameOrPath, pathOrMiddleware, ...middlewares) {
628
+ return this.verb("patch", nameOrPath, pathOrMiddleware, ...middlewares);
629
+ }
630
+ post(nameOrPath, pathOrMiddleware, ...middlewares) {
631
+ return this.verb("post", nameOrPath, pathOrMiddleware, ...middlewares);
632
+ }
633
+ propfind(nameOrPath, pathOrMiddleware, ...middlewares) {
634
+ return this.verb("propfind", nameOrPath, pathOrMiddleware, ...middlewares);
635
+ }
636
+ proppatch(nameOrPath, pathOrMiddleware, ...middlewares) {
637
+ return this.verb("proppatch", nameOrPath, pathOrMiddleware, ...middlewares);
638
+ }
639
+ purge(nameOrPath, pathOrMiddleware, ...middlewares) {
640
+ return this.verb("purge", nameOrPath, pathOrMiddleware, ...middlewares);
641
+ }
642
+ put(nameOrPath, pathOrMiddleware, ...middlewares) {
643
+ return this.verb("put", nameOrPath, pathOrMiddleware, ...middlewares);
644
+ }
645
+ rebind(nameOrPath, pathOrMiddleware, ...middlewares) {
646
+ return this.verb("rebind", nameOrPath, pathOrMiddleware, ...middlewares);
647
+ }
648
+ report(nameOrPath, pathOrMiddleware, ...middlewares) {
649
+ return this.verb("report", nameOrPath, pathOrMiddleware, ...middlewares);
650
+ }
651
+ search(nameOrPath, pathOrMiddleware, ...middlewares) {
652
+ return this.verb("search", nameOrPath, pathOrMiddleware, ...middlewares);
653
+ }
654
+ source(nameOrPath, pathOrMiddleware, ...middlewares) {
655
+ return this.verb("source", nameOrPath, pathOrMiddleware, ...middlewares);
656
+ }
657
+ subscribe(nameOrPath, pathOrMiddleware, ...middlewares) {
658
+ return this.verb("subscribe", nameOrPath, pathOrMiddleware, ...middlewares);
659
+ }
660
+ trace(nameOrPath, pathOrMiddleware, ...middlewares) {
661
+ return this.verb("trace", nameOrPath, pathOrMiddleware, ...middlewares);
662
+ }
663
+ unbind(nameOrPath, pathOrMiddleware, ...middlewares) {
664
+ return this.verb("unbind", nameOrPath, pathOrMiddleware, ...middlewares);
665
+ }
666
+ unlink(nameOrPath, pathOrMiddleware, ...middlewares) {
667
+ return this.verb("unlink", nameOrPath, pathOrMiddleware, ...middlewares);
668
+ }
669
+ unlock(nameOrPath, pathOrMiddleware, ...middlewares) {
670
+ return this.verb("unlock", nameOrPath, pathOrMiddleware, ...middlewares);
671
+ }
672
+ unsubscribe(nameOrPath, pathOrMiddleware, ...middlewares) {
673
+ return this.verb("unsubscribe", nameOrPath, pathOrMiddleware, ...middlewares);
674
+ }
675
+ };
676
+
677
+ //#endregion
678
+ export { Router };