@eggjs/router 2.0.0 → 3.0.0

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