@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.
- package/README.md +92 -55
- package/dist/commonjs/EggRouter.d.ts +102 -0
- package/dist/commonjs/EggRouter.js +235 -0
- package/dist/commonjs/Layer.d.ts +114 -0
- package/dist/commonjs/Layer.js +237 -0
- package/dist/commonjs/Router.d.ts +494 -0
- package/dist/commonjs/Router.js +760 -0
- package/dist/commonjs/index.d.ts +5 -0
- package/dist/commonjs/index.js +23 -0
- package/dist/commonjs/package.json +3 -0
- package/dist/commonjs/types.d.ts +18 -0
- package/dist/commonjs/types.js +3 -0
- package/dist/esm/EggRouter.d.ts +102 -0
- package/dist/esm/EggRouter.js +228 -0
- package/dist/esm/Layer.d.ts +114 -0
- package/dist/esm/Layer.js +230 -0
- package/dist/esm/Router.d.ts +494 -0
- package/dist/esm/Router.js +753 -0
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/types.d.ts +18 -0
- package/dist/esm/types.js +2 -0
- package/package.json +64 -32
- package/src/EggRouter.ts +338 -0
- package/src/Layer.ts +274 -0
- package/src/Router.ts +1060 -0
- package/src/index.ts +7 -0
- package/src/types.ts +15 -0
- package/History.md +0 -181
- package/index.js +0 -10
- package/lib/egg_router.js +0 -327
- package/lib/layer.js +0 -217
- package/lib/router.js +0 -728
- package/lib/utils.js +0 -18
package/src/Router.ts
ADDED
|
@@ -0,0 +1,1060 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RESTful resource routing middleware for eggjs.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { debuglog } from 'node:util';
|
|
6
|
+
import assert from 'node:assert';
|
|
7
|
+
import compose from 'koa-compose';
|
|
8
|
+
import HttpError from 'http-errors';
|
|
9
|
+
import methods from 'methods';
|
|
10
|
+
import { Layer, LayerURLOptions } from './Layer.js';
|
|
11
|
+
import { MiddlewareFunc, MiddlewareFuncWithRouter, Next, ParamMiddlewareFunc, ResourcesController } from './types.js';
|
|
12
|
+
|
|
13
|
+
const debug = debuglog('egg-router:router');
|
|
14
|
+
|
|
15
|
+
export type RouterMethod = typeof methods[0];
|
|
16
|
+
|
|
17
|
+
export interface RouterOptions {
|
|
18
|
+
methods?: string[];
|
|
19
|
+
prefix?: string;
|
|
20
|
+
sensitive?: boolean;
|
|
21
|
+
strict?: boolean;
|
|
22
|
+
routerPath?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface RegisterOptions {
|
|
26
|
+
name?: string;
|
|
27
|
+
prefix?: string;
|
|
28
|
+
sensitive?: boolean;
|
|
29
|
+
strict?: boolean;
|
|
30
|
+
ignoreCaptures?: boolean;
|
|
31
|
+
end?: boolean;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface AllowedMethodsOptions {
|
|
35
|
+
throw?: boolean;
|
|
36
|
+
notImplemented?: () => Error;
|
|
37
|
+
methodNotAllowed?: () => Error;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface MatchedResult {
|
|
41
|
+
// matched path
|
|
42
|
+
path: Layer[];
|
|
43
|
+
// matched path and method(including none method)
|
|
44
|
+
pathAndMethod: Layer[];
|
|
45
|
+
// method matched or not
|
|
46
|
+
route: boolean;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export class Router {
|
|
50
|
+
readonly opts: RouterOptions;
|
|
51
|
+
readonly methods: string[];
|
|
52
|
+
/** Layer stack */
|
|
53
|
+
readonly stack: Layer[] = [];
|
|
54
|
+
readonly params: Record<string, ParamMiddlewareFunc> = {};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Create a new router.
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
*
|
|
61
|
+
* Basic usage:
|
|
62
|
+
*
|
|
63
|
+
* ```javascript
|
|
64
|
+
* var Koa = require('koa');
|
|
65
|
+
* var Router = require('koa-router');
|
|
66
|
+
*
|
|
67
|
+
* var app = new Koa();
|
|
68
|
+
* var router = new Router();
|
|
69
|
+
*
|
|
70
|
+
* router.get('/', (ctx, next) => {
|
|
71
|
+
* // ctx.router available
|
|
72
|
+
* });
|
|
73
|
+
*
|
|
74
|
+
* app
|
|
75
|
+
* .use(router.routes())
|
|
76
|
+
* .use(router.allowedMethods());
|
|
77
|
+
* ```
|
|
78
|
+
*
|
|
79
|
+
* @alias module:koa-router
|
|
80
|
+
* @param {Object=} opts optional
|
|
81
|
+
* @param {String=} opts.prefix prefix router paths
|
|
82
|
+
* @class
|
|
83
|
+
*/
|
|
84
|
+
constructor(opts?: RouterOptions) {
|
|
85
|
+
this.opts = opts ?? {};
|
|
86
|
+
this.methods = this.opts.methods ?? [
|
|
87
|
+
'HEAD',
|
|
88
|
+
'OPTIONS',
|
|
89
|
+
'GET',
|
|
90
|
+
'PUT',
|
|
91
|
+
'PATCH',
|
|
92
|
+
'POST',
|
|
93
|
+
'DELETE',
|
|
94
|
+
];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Use given middleware.
|
|
99
|
+
*
|
|
100
|
+
* Middleware run in the order they are defined by `.use()`. They are invoked
|
|
101
|
+
* sequentially, requests start at the first middleware and work their way
|
|
102
|
+
* "down" the middleware stack.
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
*
|
|
106
|
+
* ```javascript
|
|
107
|
+
* // session middleware will run before authorize
|
|
108
|
+
* router
|
|
109
|
+
* .use(session())
|
|
110
|
+
* .use(authorize());
|
|
111
|
+
*
|
|
112
|
+
* // use middleware only with given path
|
|
113
|
+
* router.use('/users', userAuth());
|
|
114
|
+
*
|
|
115
|
+
* // or with an array of paths
|
|
116
|
+
* router.use(['/users', '/admin'], userAuth());
|
|
117
|
+
*
|
|
118
|
+
* app.use(router.routes());
|
|
119
|
+
* ```
|
|
120
|
+
*
|
|
121
|
+
* @param {String=} path path string
|
|
122
|
+
* @param {Function} middleware middleware function
|
|
123
|
+
* @return {Router} router instance
|
|
124
|
+
*/
|
|
125
|
+
use(...middlewares: MiddlewareFunc[]): Router;
|
|
126
|
+
use(path: string | string[], ...middlewares: MiddlewareFunc[]): Router;
|
|
127
|
+
use(pathOrMiddleware: string | string[] | MiddlewareFunc, ...middlewares: MiddlewareFunc[]): Router {
|
|
128
|
+
// support array of paths
|
|
129
|
+
// use(paths, ...middlewares)
|
|
130
|
+
if (Array.isArray(pathOrMiddleware) && typeof pathOrMiddleware[0] === 'string') {
|
|
131
|
+
for (const path of pathOrMiddleware) {
|
|
132
|
+
this.use(path, ...middlewares);
|
|
133
|
+
}
|
|
134
|
+
return this;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
let path = '';
|
|
138
|
+
let hasPath = false;
|
|
139
|
+
if (typeof pathOrMiddleware === 'string') {
|
|
140
|
+
// use(path, ...middlewares)
|
|
141
|
+
path = pathOrMiddleware;
|
|
142
|
+
hasPath = true;
|
|
143
|
+
} else if (typeof pathOrMiddleware === 'function') {
|
|
144
|
+
// use(...middlewares)
|
|
145
|
+
middlewares = [ pathOrMiddleware, ...middlewares ];
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
for (const m of middlewares as MiddlewareFuncWithRouter<Router>[]) {
|
|
149
|
+
if (m.router) {
|
|
150
|
+
for (const nestedLayer of m.router.stack) {
|
|
151
|
+
if (path) {
|
|
152
|
+
nestedLayer.setPrefix(path);
|
|
153
|
+
}
|
|
154
|
+
if (this.opts.prefix) {
|
|
155
|
+
nestedLayer.setPrefix(this.opts.prefix);
|
|
156
|
+
}
|
|
157
|
+
this.stack.push(nestedLayer);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (this.params) {
|
|
161
|
+
for (const key in this.params) {
|
|
162
|
+
m.router.param(key, this.params[key]);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
} else {
|
|
166
|
+
this.register(path || '(.*)', [], m, { end: false, ignoreCaptures: !hasPath });
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return this;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Set the path prefix for a Router instance that was already initialized.
|
|
175
|
+
*
|
|
176
|
+
* @example
|
|
177
|
+
*
|
|
178
|
+
* ```javascript
|
|
179
|
+
* router.prefix('/things/:thing_id')
|
|
180
|
+
* ```
|
|
181
|
+
*
|
|
182
|
+
* @param {String} prefix prefix string
|
|
183
|
+
* @return {Router} router instance
|
|
184
|
+
*/
|
|
185
|
+
prefix(prefix: string): Router {
|
|
186
|
+
prefix = prefix.replace(/\/$/, '');
|
|
187
|
+
this.opts.prefix = prefix;
|
|
188
|
+
|
|
189
|
+
for (const layer of this.stack) {
|
|
190
|
+
layer.setPrefix(prefix);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return this;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Returns router middleware which dispatches a route matching the request.
|
|
198
|
+
*
|
|
199
|
+
* @return {Function} middleware function
|
|
200
|
+
*/
|
|
201
|
+
routes(): MiddlewareFuncWithRouter<Router> {
|
|
202
|
+
const dispatch = (ctx: any, next: Next) => {
|
|
203
|
+
const routerPath: string = this.opts.routerPath || ctx.routerPath || ctx.path;
|
|
204
|
+
const matched = this.match(routerPath, ctx.method);
|
|
205
|
+
debug('dispatch: %s %s, routerPath: %s, matched: %s',
|
|
206
|
+
ctx.method, ctx.path, routerPath, matched.route);
|
|
207
|
+
|
|
208
|
+
if (ctx.matched) {
|
|
209
|
+
(ctx.matched as Layer[]).push(...matched.path);
|
|
210
|
+
} else {
|
|
211
|
+
ctx.matched = matched.path;
|
|
212
|
+
}
|
|
213
|
+
ctx.router = this;
|
|
214
|
+
|
|
215
|
+
if (!matched.route) {
|
|
216
|
+
return next();
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const matchedLayers = matched.pathAndMethod;
|
|
220
|
+
const layerChain = matchedLayers.reduce<MiddlewareFunc[]>((memo, layer) => {
|
|
221
|
+
memo.push((ctx, next) => {
|
|
222
|
+
// ctx.captures = layer.captures(routerPath, ctx.captures);
|
|
223
|
+
ctx.captures = layer.captures(routerPath);
|
|
224
|
+
ctx.params = layer.params(routerPath, ctx.captures, ctx.params);
|
|
225
|
+
// ctx._matchedRouteName & ctx._matchedRoute for compatibility
|
|
226
|
+
ctx._matchedRouteName = ctx.routerName = layer.name;
|
|
227
|
+
if (!layer.name) {
|
|
228
|
+
ctx._matchedRouteName = undefined;
|
|
229
|
+
}
|
|
230
|
+
ctx._matchedRoute = ctx.routerPath = layer.path;
|
|
231
|
+
return next();
|
|
232
|
+
});
|
|
233
|
+
return memo.concat(layer.stack);
|
|
234
|
+
}, []);
|
|
235
|
+
|
|
236
|
+
return compose(layerChain)(ctx, next);
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
dispatch.router = this;
|
|
240
|
+
return dispatch;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* @alias to routes()
|
|
245
|
+
*/
|
|
246
|
+
middleware() {
|
|
247
|
+
return this.routes();
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Returns separate middleware for responding to `OPTIONS` requests with
|
|
252
|
+
* an `Allow` header containing the allowed methods, as well as responding
|
|
253
|
+
* with `405 Method Not Allowed` and `501 Not Implemented` as appropriate.
|
|
254
|
+
*
|
|
255
|
+
* @example
|
|
256
|
+
*
|
|
257
|
+
* ```javascript
|
|
258
|
+
* var Koa = require('koa');
|
|
259
|
+
* var Router = require('koa-router');
|
|
260
|
+
*
|
|
261
|
+
* var app = new Koa();
|
|
262
|
+
* var router = new Router();
|
|
263
|
+
*
|
|
264
|
+
* app.use(router.routes());
|
|
265
|
+
* app.use(router.allowedMethods());
|
|
266
|
+
* ```
|
|
267
|
+
*
|
|
268
|
+
* **Example with [Boom](https://github.com/hapijs/boom)**
|
|
269
|
+
*
|
|
270
|
+
* ```javascript
|
|
271
|
+
* var Koa = require('koa');
|
|
272
|
+
* var Router = require('koa-router');
|
|
273
|
+
* var Boom = require('boom');
|
|
274
|
+
*
|
|
275
|
+
* var app = new Koa();
|
|
276
|
+
* var router = new Router();
|
|
277
|
+
*
|
|
278
|
+
* app.use(router.routes());
|
|
279
|
+
* app.use(router.allowedMethods({
|
|
280
|
+
* throw: true,
|
|
281
|
+
* notImplemented: () => new Boom.notImplemented(),
|
|
282
|
+
* methodNotAllowed: () => new Boom.methodNotAllowed()
|
|
283
|
+
* }));
|
|
284
|
+
* ```
|
|
285
|
+
*
|
|
286
|
+
* @param {Object=} options optional params
|
|
287
|
+
* @param {Boolean=} options.throw throw error instead of setting status and header
|
|
288
|
+
* @param {Function=} options.notImplemented throw the returned value in place of the default NotImplemented error
|
|
289
|
+
* @param {Function=} options.methodNotAllowed throw the returned value in place of the default MethodNotAllowed error
|
|
290
|
+
* @return {Function} middleware function
|
|
291
|
+
*/
|
|
292
|
+
allowedMethods(options?: AllowedMethodsOptions): MiddlewareFunc {
|
|
293
|
+
const implemented = this.methods;
|
|
294
|
+
|
|
295
|
+
return async function allowedMethods(ctx: any, next: Next) {
|
|
296
|
+
await next();
|
|
297
|
+
if (ctx.status && ctx.status !== 404) return;
|
|
298
|
+
|
|
299
|
+
const allowed: Record<string, string> = {};
|
|
300
|
+
ctx.matched.forEach((route: Router) => {
|
|
301
|
+
route.methods.forEach(method => {
|
|
302
|
+
allowed[method] = method;
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
const allowedMethods = Object.keys(allowed);
|
|
306
|
+
|
|
307
|
+
if (!implemented.includes(ctx.method)) {
|
|
308
|
+
if (options?.throw) {
|
|
309
|
+
let notImplementedThrowable: Error;
|
|
310
|
+
if (typeof options?.notImplemented === 'function') {
|
|
311
|
+
notImplementedThrowable = options.notImplemented(); // set whatever the user returns from their function
|
|
312
|
+
} else {
|
|
313
|
+
notImplementedThrowable = new HttpError.NotImplemented();
|
|
314
|
+
}
|
|
315
|
+
throw notImplementedThrowable;
|
|
316
|
+
} else {
|
|
317
|
+
ctx.status = 501;
|
|
318
|
+
ctx.set('Allow', allowedMethods.join(', '));
|
|
319
|
+
}
|
|
320
|
+
} else if (allowedMethods.length > 0) {
|
|
321
|
+
if (ctx.method === 'OPTIONS') {
|
|
322
|
+
ctx.status = 200;
|
|
323
|
+
ctx.body = '';
|
|
324
|
+
ctx.set('Allow', allowedMethods.join(', '));
|
|
325
|
+
} else if (!allowed[ctx.method]) {
|
|
326
|
+
if (options?.throw) {
|
|
327
|
+
let notAllowedThrowable: Error;
|
|
328
|
+
if (typeof options?.methodNotAllowed === 'function') {
|
|
329
|
+
notAllowedThrowable = options.methodNotAllowed(); // set whatever the user returns from their function
|
|
330
|
+
} else {
|
|
331
|
+
notAllowedThrowable = new HttpError.MethodNotAllowed();
|
|
332
|
+
}
|
|
333
|
+
throw notAllowedThrowable;
|
|
334
|
+
} else {
|
|
335
|
+
ctx.status = 405;
|
|
336
|
+
ctx.set('Allow', allowedMethods.join(', '));
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Redirect `source` to `destination` URL with optional 30x status `code`.
|
|
345
|
+
*
|
|
346
|
+
* Both `source` and `destination` can be route names.
|
|
347
|
+
*
|
|
348
|
+
* ```javascript
|
|
349
|
+
* router.redirect('/login', 'sign-in');
|
|
350
|
+
* ```
|
|
351
|
+
*
|
|
352
|
+
* This is equivalent to:
|
|
353
|
+
*
|
|
354
|
+
* ```javascript
|
|
355
|
+
* router.all('/login', ctx => {
|
|
356
|
+
* ctx.redirect('/sign-in');
|
|
357
|
+
* ctx.status = 301;
|
|
358
|
+
* });
|
|
359
|
+
* ```
|
|
360
|
+
*
|
|
361
|
+
* @param {String} source URL or route name.
|
|
362
|
+
* @param {String} destination URL or route name.
|
|
363
|
+
* @param {Number=} status HTTP status code (default: 301).
|
|
364
|
+
* @return {Router} router instance
|
|
365
|
+
*/
|
|
366
|
+
redirect(source: string, destination: string, status: number = 301): Router {
|
|
367
|
+
// lookup source route by name
|
|
368
|
+
if (source[0] !== '/') {
|
|
369
|
+
const routeUrl = this.url(source);
|
|
370
|
+
if (routeUrl instanceof Error) {
|
|
371
|
+
throw routeUrl;
|
|
372
|
+
}
|
|
373
|
+
source = routeUrl;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// lookup destination route by name
|
|
377
|
+
if (destination[0] !== '/') {
|
|
378
|
+
const routeUrl = this.url(destination);
|
|
379
|
+
if (routeUrl instanceof Error) {
|
|
380
|
+
throw routeUrl;
|
|
381
|
+
}
|
|
382
|
+
destination = routeUrl;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
return this.all(source, ctx => {
|
|
386
|
+
ctx.redirect(destination);
|
|
387
|
+
ctx.status = status;
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Create and register a route.
|
|
393
|
+
*
|
|
394
|
+
* @param {String|RegExp|(String|RegExp)[]} path Path string.
|
|
395
|
+
* @param {String[]} methods Array of HTTP verbs.
|
|
396
|
+
* @param {Function|Function[]} middleware Multiple middleware also accepted.
|
|
397
|
+
* @param {Object} [opts] optional params
|
|
398
|
+
* @private
|
|
399
|
+
*/
|
|
400
|
+
register(path: string | RegExp | (string | RegExp)[],
|
|
401
|
+
methods: string[],
|
|
402
|
+
middleware: MiddlewareFunc | MiddlewareFunc[],
|
|
403
|
+
opts?: RegisterOptions): Layer | Layer[] {
|
|
404
|
+
// support array of paths
|
|
405
|
+
if (Array.isArray(path)) {
|
|
406
|
+
const routes: Layer[] = [];
|
|
407
|
+
for (const p of path) {
|
|
408
|
+
const route = this.#register(p, methods, middleware, opts);
|
|
409
|
+
routes.push(route);
|
|
410
|
+
}
|
|
411
|
+
return routes;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// create route
|
|
415
|
+
const route = this.#register(path, methods, middleware, opts);
|
|
416
|
+
return route;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
#register(path: string | RegExp,
|
|
420
|
+
methods: string[],
|
|
421
|
+
middleware: MiddlewareFunc | MiddlewareFunc[],
|
|
422
|
+
opts?: RegisterOptions): Layer {
|
|
423
|
+
opts = opts ?? {};
|
|
424
|
+
// create route
|
|
425
|
+
const route = new Layer(path, methods, middleware, {
|
|
426
|
+
end: opts.end === false ? opts.end : true,
|
|
427
|
+
name: opts.name,
|
|
428
|
+
sensitive: opts.sensitive ?? this.opts.sensitive ?? false,
|
|
429
|
+
strict: opts.strict ?? this.opts.strict ?? false,
|
|
430
|
+
prefix: opts.prefix ?? this.opts.prefix ?? '',
|
|
431
|
+
ignoreCaptures: opts.ignoreCaptures,
|
|
432
|
+
});
|
|
433
|
+
|
|
434
|
+
// FIXME: why???
|
|
435
|
+
if (this.opts.prefix) {
|
|
436
|
+
route.setPrefix(this.opts.prefix);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// add parameter middleware to the new route layer
|
|
440
|
+
for (const param in this.params) {
|
|
441
|
+
route.param(param, this.params[param]);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
this.stack.push(route);
|
|
445
|
+
return route;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
/**
|
|
449
|
+
* Lookup route with given `name`.
|
|
450
|
+
*
|
|
451
|
+
* @param {String} name route name
|
|
452
|
+
* @return {Layer|false} layer instance of false
|
|
453
|
+
*/
|
|
454
|
+
route(name: string): Layer | false {
|
|
455
|
+
for (const route of this.stack) {
|
|
456
|
+
if (route.name === name) {
|
|
457
|
+
return route;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
return false;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/**
|
|
464
|
+
* Generate URL for route. Takes a route name and map of named `params`.
|
|
465
|
+
*
|
|
466
|
+
* @example
|
|
467
|
+
*
|
|
468
|
+
* ```javascript
|
|
469
|
+
* router.get('user', '/users/:id', (ctx, next) => {
|
|
470
|
+
* // ...
|
|
471
|
+
* });
|
|
472
|
+
*
|
|
473
|
+
* router.url('user', 3);
|
|
474
|
+
* // => "/users/3"
|
|
475
|
+
*
|
|
476
|
+
* router.url('user', { id: 3 });
|
|
477
|
+
* // => "/users/3"
|
|
478
|
+
*
|
|
479
|
+
* router.use((ctx, next) => {
|
|
480
|
+
* // redirect to named route
|
|
481
|
+
* ctx.redirect(ctx.router.url('sign-in'));
|
|
482
|
+
* })
|
|
483
|
+
*
|
|
484
|
+
* router.url('user', { id: 3 }, { query: { limit: 1 } });
|
|
485
|
+
* // => "/users/3?limit=1"
|
|
486
|
+
*
|
|
487
|
+
* router.url('user', { id: 3 }, { query: "limit=1" });
|
|
488
|
+
* // => "/users/3?limit=1"
|
|
489
|
+
* ```
|
|
490
|
+
*/
|
|
491
|
+
url(name: string, params?: string | number | object,
|
|
492
|
+
...paramsOrOptions: (string | number | object | LayerURLOptions)[]): string | Error {
|
|
493
|
+
const route = this.route(name);
|
|
494
|
+
if (route) {
|
|
495
|
+
return route.url(params, ...paramsOrOptions);
|
|
496
|
+
}
|
|
497
|
+
return new Error(`No route found for name: ${name}`);
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/**
|
|
501
|
+
* Generate URL from url pattern and given `params`.
|
|
502
|
+
*
|
|
503
|
+
* @example
|
|
504
|
+
*
|
|
505
|
+
* ```javascript
|
|
506
|
+
* var url = Router.url('/users/:id', { id: 1 });
|
|
507
|
+
* // => "/users/1"
|
|
508
|
+
* ```
|
|
509
|
+
*
|
|
510
|
+
* @param {String} path url pattern
|
|
511
|
+
* @param {Object} params url parameters
|
|
512
|
+
* @return {String} url string
|
|
513
|
+
*/
|
|
514
|
+
static url(path: string, params?: string | number | object,
|
|
515
|
+
...paramsOrOptions: (string | number | object | LayerURLOptions)[]): string {
|
|
516
|
+
return Layer.prototype.url.call({ path }, params, ...paramsOrOptions);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
/**
|
|
520
|
+
* Match given `path` and return corresponding routes.
|
|
521
|
+
*
|
|
522
|
+
* @param {String} path path string
|
|
523
|
+
* @param {String} method method name
|
|
524
|
+
* @return {Object.<path, pathAndMethod>} returns layers that matched path and
|
|
525
|
+
* path and method.
|
|
526
|
+
* @private
|
|
527
|
+
*/
|
|
528
|
+
match(path: string, method: string): MatchedResult {
|
|
529
|
+
const matched: MatchedResult = {
|
|
530
|
+
// matched path
|
|
531
|
+
path: [],
|
|
532
|
+
// matched path and method(including none method)
|
|
533
|
+
pathAndMethod: [],
|
|
534
|
+
// method matched or not
|
|
535
|
+
route: false,
|
|
536
|
+
};
|
|
537
|
+
|
|
538
|
+
for (const layer of this.stack) {
|
|
539
|
+
debug('test %s %s', layer.path, layer.regexp);
|
|
540
|
+
|
|
541
|
+
if (layer.match(path)) {
|
|
542
|
+
matched.path.push(layer);
|
|
543
|
+
|
|
544
|
+
if (layer.methods.length === 0 || layer.methods.includes(method)) {
|
|
545
|
+
matched.pathAndMethod.push(layer);
|
|
546
|
+
if (layer.methods.length > 0) {
|
|
547
|
+
matched.route = true;
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
// if (layer.methods.length === 0) {
|
|
551
|
+
// matched.pathAndMethod.push(layer);
|
|
552
|
+
// } else if (layer.methods.includes(method)) {
|
|
553
|
+
// matched.pathAndMethod.push(layer);
|
|
554
|
+
// matched.route = true;
|
|
555
|
+
// }
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
return matched;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
/**
|
|
563
|
+
* Run middleware for named route parameters. Useful for auto-loading or
|
|
564
|
+
* validation.
|
|
565
|
+
*
|
|
566
|
+
* @example
|
|
567
|
+
*
|
|
568
|
+
* ```javascript
|
|
569
|
+
* router
|
|
570
|
+
* .param('user', (id, ctx, next) => {
|
|
571
|
+
* ctx.user = users[id];
|
|
572
|
+
* if (!ctx.user) return ctx.status = 404;
|
|
573
|
+
* return next();
|
|
574
|
+
* })
|
|
575
|
+
* .get('/users/:user', ctx => {
|
|
576
|
+
* ctx.body = ctx.user;
|
|
577
|
+
* })
|
|
578
|
+
* .get('/users/:user/friends', ctx => {
|
|
579
|
+
* return ctx.user.getFriends().then(function(friends) {
|
|
580
|
+
* ctx.body = friends;
|
|
581
|
+
* });
|
|
582
|
+
* })
|
|
583
|
+
* // /users/3 => {"id": 3, "name": "Alex"}
|
|
584
|
+
* // /users/3/friends => [{"id": 4, "name": "TJ"}]
|
|
585
|
+
* ```
|
|
586
|
+
*
|
|
587
|
+
* @param {String} param param
|
|
588
|
+
* @param {Function} middleware route middleware
|
|
589
|
+
* @return {Router} instance
|
|
590
|
+
*/
|
|
591
|
+
param(param: string, middleware: ParamMiddlewareFunc): Router {
|
|
592
|
+
this.params[param] = middleware;
|
|
593
|
+
for (const route of this.stack) {
|
|
594
|
+
route.param(param, middleware);
|
|
595
|
+
}
|
|
596
|
+
return this;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
protected _formatRouteParams(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
600
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc | ResourcesController,
|
|
601
|
+
middlewares: (MiddlewareFunc | string | ResourcesController)[]) {
|
|
602
|
+
const options: RegisterOptions = {};
|
|
603
|
+
let path: string | RegExp | (string | RegExp)[];
|
|
604
|
+
if (typeof pathOrMiddleware === 'string' || pathOrMiddleware instanceof RegExp) {
|
|
605
|
+
// verb(method, name, path, ...middlewares)
|
|
606
|
+
path = pathOrMiddleware;
|
|
607
|
+
assert(typeof nameOrPath === 'string', 'route name should be string');
|
|
608
|
+
options.name = nameOrPath;
|
|
609
|
+
} else if (Array.isArray(pathOrMiddleware)) {
|
|
610
|
+
// verb(method, name, paths, ...middlewares)
|
|
611
|
+
path = pathOrMiddleware;
|
|
612
|
+
assert(typeof nameOrPath === 'string', 'route name should be string');
|
|
613
|
+
options.name = nameOrPath;
|
|
614
|
+
} else {
|
|
615
|
+
// verb(method, path, ...middlewares)
|
|
616
|
+
path = nameOrPath;
|
|
617
|
+
middlewares = [ pathOrMiddleware, ...middlewares ];
|
|
618
|
+
}
|
|
619
|
+
return {
|
|
620
|
+
path,
|
|
621
|
+
middlewares,
|
|
622
|
+
options,
|
|
623
|
+
};
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
/**
|
|
627
|
+
* Create `router.verb()` methods, where *verb* is one of the HTTP verbs such
|
|
628
|
+
* as `router.get()` or `router.post()`.
|
|
629
|
+
*
|
|
630
|
+
* Match URL patterns to callback functions or controller actions using `router.verb()`,
|
|
631
|
+
* where **verb** is one of the HTTP verbs such as `router.get()` or `router.post()`.
|
|
632
|
+
*
|
|
633
|
+
* Additionally, `router.all()` can be used to match against all methods.
|
|
634
|
+
*
|
|
635
|
+
* ```javascript
|
|
636
|
+
* router
|
|
637
|
+
* .get('/', (ctx, next) => {
|
|
638
|
+
* ctx.body = 'Hello World!';
|
|
639
|
+
* })
|
|
640
|
+
* .post('/users', (ctx, next) => {
|
|
641
|
+
* // ...
|
|
642
|
+
* })
|
|
643
|
+
* .put('/users/:id', (ctx, next) => {
|
|
644
|
+
* // ...
|
|
645
|
+
* })
|
|
646
|
+
* .del('/users/:id', (ctx, next) => {
|
|
647
|
+
* // ...
|
|
648
|
+
* })
|
|
649
|
+
* .all('/users/:id', (ctx, next) => {
|
|
650
|
+
* // ...
|
|
651
|
+
* });
|
|
652
|
+
* ```
|
|
653
|
+
*
|
|
654
|
+
* When a route is matched, its path is available at `ctx._matchedRoute` and if named,
|
|
655
|
+
* the name is available at `ctx._matchedRouteName`
|
|
656
|
+
*
|
|
657
|
+
* Route paths will be translated to regular expressions using
|
|
658
|
+
* [path-to-regexp](https://github.com/pillarjs/path-to-regexp).
|
|
659
|
+
*
|
|
660
|
+
* Query strings will not be considered when matching requests.
|
|
661
|
+
*
|
|
662
|
+
* #### Named routes
|
|
663
|
+
*
|
|
664
|
+
* Routes can optionally have names. This allows generation of URLs and easy
|
|
665
|
+
* renaming of URLs during development.
|
|
666
|
+
*
|
|
667
|
+
* ```javascript
|
|
668
|
+
* router.get('user', '/users/:id', (ctx, next) => {
|
|
669
|
+
* // ...
|
|
670
|
+
* });
|
|
671
|
+
*
|
|
672
|
+
* router.url('user', 3);
|
|
673
|
+
* // => "/users/3"
|
|
674
|
+
* ```
|
|
675
|
+
*
|
|
676
|
+
* #### Multiple middleware
|
|
677
|
+
*
|
|
678
|
+
* Multiple middleware may be given:
|
|
679
|
+
*
|
|
680
|
+
* ```javascript
|
|
681
|
+
* router.get(
|
|
682
|
+
* '/users/:id',
|
|
683
|
+
* (ctx, next) => {
|
|
684
|
+
* return User.findOne(ctx.params.id).then(function(user) {
|
|
685
|
+
* ctx.user = user;
|
|
686
|
+
* next();
|
|
687
|
+
* });
|
|
688
|
+
* },
|
|
689
|
+
* ctx => {
|
|
690
|
+
* console.log(ctx.user);
|
|
691
|
+
* // => { id: 17, name: "Alex" }
|
|
692
|
+
* }
|
|
693
|
+
* );
|
|
694
|
+
* ```
|
|
695
|
+
*
|
|
696
|
+
* ### Nested routers
|
|
697
|
+
*
|
|
698
|
+
* Nesting routers is supported:
|
|
699
|
+
*
|
|
700
|
+
* ```javascript
|
|
701
|
+
* var forums = new Router();
|
|
702
|
+
* var posts = new Router();
|
|
703
|
+
*
|
|
704
|
+
* posts.get('/', (ctx, next) => {...});
|
|
705
|
+
* posts.get('/:pid', (ctx, next) => {...});
|
|
706
|
+
* forums.use('/forums/:fid/posts', posts.routes(), posts.allowedMethods());
|
|
707
|
+
*
|
|
708
|
+
* // responds to "/forums/123/posts" and "/forums/123/posts/123"
|
|
709
|
+
* app.use(forums.routes());
|
|
710
|
+
* ```
|
|
711
|
+
*
|
|
712
|
+
* #### Router prefixes
|
|
713
|
+
*
|
|
714
|
+
* Route paths can be prefixed at the router level:
|
|
715
|
+
*
|
|
716
|
+
* ```javascript
|
|
717
|
+
* var router = new Router({
|
|
718
|
+
* prefix: '/users'
|
|
719
|
+
* });
|
|
720
|
+
*
|
|
721
|
+
* router.get('/', ...); // responds to "/users"
|
|
722
|
+
* router.get('/:id', ...); // responds to "/users/:id"
|
|
723
|
+
* ```
|
|
724
|
+
*
|
|
725
|
+
* #### URL parameters
|
|
726
|
+
*
|
|
727
|
+
* Named route parameters are captured and added to `ctx.params`.
|
|
728
|
+
*
|
|
729
|
+
* ```javascript
|
|
730
|
+
* router.get('/:category/:title', (ctx, next) => {
|
|
731
|
+
* console.log(ctx.params);
|
|
732
|
+
* // => { category: 'programming', title: 'how-to-node' }
|
|
733
|
+
* });
|
|
734
|
+
* ```
|
|
735
|
+
*
|
|
736
|
+
* The [path-to-regexp](https://github.com/pillarjs/path-to-regexp) module is
|
|
737
|
+
* used to convert paths to regular expressions.
|
|
738
|
+
*
|
|
739
|
+
*/
|
|
740
|
+
verb(method: string | string[],
|
|
741
|
+
nameOrPath: string | RegExp | (string | RegExp)[],
|
|
742
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
743
|
+
...middleware: MiddlewareFunc[]): Router {
|
|
744
|
+
const { options, path, middlewares } = this._formatRouteParams(nameOrPath, pathOrMiddleware, middleware);
|
|
745
|
+
if (typeof method === 'string') {
|
|
746
|
+
method = [ method ];
|
|
747
|
+
}
|
|
748
|
+
this.register(path, method, middlewares as MiddlewareFunc[], options);
|
|
749
|
+
return this;
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
/**
|
|
753
|
+
* Register route with all methods.
|
|
754
|
+
*
|
|
755
|
+
* @param {String} name Optional.
|
|
756
|
+
* @param {String} path path string
|
|
757
|
+
* @param {Function=} middleware You may also pass multiple middleware.
|
|
758
|
+
* @return {Router} router instance
|
|
759
|
+
* @private
|
|
760
|
+
*/
|
|
761
|
+
all(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
762
|
+
all(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
763
|
+
all(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
764
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
765
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
766
|
+
return this.verb(methods, nameOrPath, pathOrMiddleware, ...middlewares);
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
// "acl", "bind", "checkout", "connect", "copy", "delete", "get", "head", "link", "lock",
|
|
770
|
+
// "m-search", "merge", "mkactivity", "mkcalendar", "mkcol", "move", "notify", "options",
|
|
771
|
+
// "patch", "post", "propfind", "proppatch", "purge", "put", "rebind", "report", "search",
|
|
772
|
+
// "source", "subscribe", "trace", "unbind", "unlink", "unlock", "unsubscribe"
|
|
773
|
+
acl(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
774
|
+
acl(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
775
|
+
acl(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
776
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
777
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
778
|
+
return this.verb('acl', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
bind(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
782
|
+
bind(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
783
|
+
bind(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
784
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
785
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
786
|
+
return this.verb('bind', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
checkout(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
790
|
+
checkout(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
791
|
+
checkout(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
792
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
793
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
794
|
+
return this.verb('checkout', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
connect(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
798
|
+
connect(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
799
|
+
connect(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
800
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
801
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
802
|
+
return this.verb('connect', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
copy(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
806
|
+
copy(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
807
|
+
copy(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
808
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
809
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
810
|
+
return this.verb('copy', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
delete(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
814
|
+
delete(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
815
|
+
delete(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
816
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
817
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
818
|
+
return this.verb('delete', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
/** Alias for `router.delete()` because delete is a reserved word */
|
|
822
|
+
del(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
823
|
+
del(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
824
|
+
del(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
825
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
826
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
827
|
+
return this.verb('delete', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
get(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
831
|
+
get(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
832
|
+
get(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
833
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
834
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
835
|
+
return this.verb('get', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
query(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
839
|
+
query(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
840
|
+
query(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
841
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
842
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
843
|
+
return this.verb('query', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
head(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
847
|
+
head(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
848
|
+
head(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
849
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
850
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
851
|
+
return this.verb('head', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
link(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
855
|
+
link(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
856
|
+
link(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
857
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
858
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
859
|
+
return this.verb('link', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
lock(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
863
|
+
lock(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
864
|
+
lock(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
865
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
866
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
867
|
+
return this.verb('lock', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
['m-search'](path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
871
|
+
['m-search'](name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
872
|
+
['m-search'](nameOrPath: string | RegExp | (string | RegExp)[],
|
|
873
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
874
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
875
|
+
return this.verb('m-search', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
merge(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
879
|
+
merge(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
880
|
+
merge(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
881
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
882
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
883
|
+
return this.verb('merge', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
mkactivity(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
887
|
+
mkactivity(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
888
|
+
mkactivity(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
889
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
890
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
891
|
+
return this.verb('mkactivity', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
mkcalendar(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
895
|
+
mkcalendar(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
896
|
+
mkcalendar(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
897
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
898
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
899
|
+
return this.verb('mkcalendar', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
mkcol(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
903
|
+
mkcol(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
904
|
+
mkcol(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
905
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
906
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
907
|
+
return this.verb('mkcol', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
move(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
911
|
+
move(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
912
|
+
move(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
913
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
914
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
915
|
+
return this.verb('move', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
notify(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
919
|
+
notify(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
920
|
+
notify(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
921
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
922
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
923
|
+
return this.verb('notify', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
options(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
927
|
+
options(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
928
|
+
options(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
929
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
930
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
931
|
+
return this.verb('options', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
patch(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
935
|
+
patch(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
936
|
+
patch(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
937
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
938
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
939
|
+
return this.verb('patch', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
post(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
943
|
+
post(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
944
|
+
post(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
945
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
946
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
947
|
+
return this.verb('post', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
propfind(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
951
|
+
propfind(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
952
|
+
propfind(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
953
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
954
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
955
|
+
return this.verb('propfind', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
proppatch(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
959
|
+
proppatch(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
960
|
+
proppatch(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
961
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
962
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
963
|
+
return this.verb('proppatch', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
purge(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
967
|
+
purge(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
968
|
+
purge(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
969
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
970
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
971
|
+
return this.verb('purge', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
put(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
975
|
+
put(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
976
|
+
put(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
977
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
978
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
979
|
+
return this.verb('put', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
rebind(path: string | RegExp, ...middlewares: MiddlewareFunc[]): Router;
|
|
983
|
+
rebind(name: string, path: string | RegExp, ...middlewares: MiddlewareFunc[]): Router;
|
|
984
|
+
rebind(nameOrPath: string | RegExp, pathOrMiddleware: string | RegExp | MiddlewareFunc,
|
|
985
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
986
|
+
return this.verb('rebind', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
report(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
990
|
+
report(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
991
|
+
report(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
992
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
993
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
994
|
+
return this.verb('report', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
search(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
998
|
+
search(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
999
|
+
search(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
1000
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
1001
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
1002
|
+
return this.verb('search', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
source(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
1006
|
+
source(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
1007
|
+
source(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
1008
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
1009
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
1010
|
+
return this.verb('source', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
subscribe(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
1014
|
+
subscribe(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
1015
|
+
subscribe(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
1016
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
1017
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
1018
|
+
return this.verb('subscribe', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
trace(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
1022
|
+
trace(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
1023
|
+
trace(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
1024
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
1025
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
1026
|
+
return this.verb('trace', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
1027
|
+
}
|
|
1028
|
+
|
|
1029
|
+
unbind(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
1030
|
+
unbind(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
1031
|
+
unbind(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
1032
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
1033
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
1034
|
+
return this.verb('unbind', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1037
|
+
unlink(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
1038
|
+
unlink(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
1039
|
+
unlink(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
1040
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
1041
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
1042
|
+
return this.verb('unlink', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
unlock(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
1046
|
+
unlock(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
1047
|
+
unlock(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
1048
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
1049
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
1050
|
+
return this.verb('unlock', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
unsubscribe(path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
1054
|
+
unsubscribe(name: string, path: string | RegExp | (string | RegExp)[], ...middlewares: MiddlewareFunc[]): Router;
|
|
1055
|
+
unsubscribe(nameOrPath: string | RegExp | (string | RegExp)[],
|
|
1056
|
+
pathOrMiddleware: string | RegExp | (string | RegExp)[] | MiddlewareFunc,
|
|
1057
|
+
...middlewares: MiddlewareFunc[]): Router {
|
|
1058
|
+
return this.verb('unsubscribe', nameOrPath, pathOrMiddleware, ...middlewares);
|
|
1059
|
+
}
|
|
1060
|
+
}
|