UNPKG

16.8 kBTypeScriptView Raw
1/* =================== USAGE ===================
2
3 import * as Router from "koa-router";
4 var router = new Router();
5
6 =============================================== */
7
8import * as Koa from "koa";
9
10declare namespace Router {
11 export interface IRouterOptions {
12 /**
13 * Prefix for all routes.
14 */
15 prefix?: string | undefined;
16 /**
17 * Methods which should be supported by the router.
18 */
19 methods?: string[] | undefined;
20 routerPath?: string | undefined;
21 /**
22 * Whether or not routing should be case-sensitive.
23 */
24 sensitive?: boolean | undefined;
25 /**
26 * Whether or not routes should matched strictly.
27 *
28 * If strict matching is enabled, the trailing slash is taken into
29 * account when matching routes.
30 */
31 strict?: boolean | undefined;
32 }
33
34 export interface IRouterParamContext<StateT = any, CustomT = {}> {
35 /**
36 * url params
37 */
38 params: Record<string, string>;
39 /**
40 * the router instance
41 */
42 router: Router<StateT, CustomT>;
43 /**
44 * Matched route
45 */
46 _matchedRoute: string | RegExp | undefined;
47 _matchedRouteName: string | undefined;
48 }
49
50 export type RouterContext<StateT = any, CustomT = {}> = Koa.ParameterizedContext<
51 StateT,
52 CustomT & IRouterParamContext<StateT, CustomT>
53 >;
54
55 // For backward compatibility IRouterContext needs to be an interface
56 // But it's deprecated - please use `RouterContext` instead
57 export interface IRouterContext extends RouterContext {}
58
59 export type IMiddleware<StateT = any, CustomT = {}> = Koa.Middleware<
60 StateT,
61 CustomT & IRouterParamContext<StateT, CustomT>
62 >;
63
64 export interface IParamMiddleware<STateT = any, CustomT = {}> {
65 (param: string, ctx: RouterContext<STateT, CustomT>, next: () => Promise<any>): any;
66 }
67
68 export interface IRouterAllowedMethodsOptions {
69 /**
70 * throw error instead of setting status and header
71 */
72 throw?: boolean | undefined;
73 /**
74 * throw the returned value in place of the default NotImplemented error
75 */
76 notImplemented?: (() => any) | undefined;
77 /**
78 * throw the returned value in place of the default MethodNotAllowed error
79 */
80 methodNotAllowed?: (() => any) | undefined;
81 }
82
83 export interface ILayerOptions {
84 name: string;
85 sensitive?: boolean | undefined;
86 strict?: boolean | undefined;
87 end?: boolean | undefined;
88 prefix?: string | undefined;
89 ignoreCaptures?: boolean | undefined;
90 }
91
92 export interface IUrlOptionsQuery {
93 query: object | string;
94 }
95
96 export interface IRoutesMatch {
97 path: Layer[];
98 pathAndMethod: Layer[];
99 route: boolean;
100 }
101
102 export class ParamName {
103 asterisk: boolean;
104 delimiter: string;
105 name: string;
106 optional: boolean;
107 partial: boolean;
108 pattern: string;
109 prefix: string;
110 repeat: string;
111 }
112
113 export class Layer {
114 opts: ILayerOptions;
115 name: string;
116 methods: string[];
117 paramNames: ParamName[];
118 stack: Router.IMiddleware[];
119 regexp: RegExp;
120 path: string;
121
122 constructor(path: string | RegExp, methods: string[], middleware: Router.IMiddleware, opts?: ILayerOptions);
123 constructor(
124 path: string | RegExp,
125 methods: string[],
126 middleware: Router.IMiddleware[],
127 opts?: ILayerOptions,
128 );
129
130 /**
131 * Returns whether request `path` matches route.
132 */
133 match(path: string): boolean;
134
135 /**
136 * Returns map of URL parameters for given `path` and `paramNames`.
137 */
138 params(path: string | RegExp, captures: string[], existingParams?: Object): Object;
139
140 /**
141 * Returns array of regexp url path captures.
142 */
143 captures(path: string): string[];
144
145 /**
146 * Generate URL for route using given `params`.
147 */
148 url(params: Object): string;
149
150 /**
151 * Run validations on route named parameters.
152 */
153 param(param: string, fn: Router.IMiddleware): Layer;
154
155 /**
156 * Prefix route path.
157 */
158 setPrefix(prefix: string): Layer;
159 }
160}
161
162declare class Router<StateT = any, CustomT = {}> {
163 params: Object;
164 stack: Router.Layer[];
165
166 /**
167 * Create a new router.
168 */
169 constructor(opt?: Router.IRouterOptions);
170
171 /**
172 * Use given middleware.
173 *
174 * Middleware run in the order they are defined by `.use()`. They are invoked
175 * sequentially, requests start at the first middleware and work their way
176 * "down" the middleware stack.
177 */
178 use(...middleware: Array<Router.IMiddleware<StateT, CustomT>>): Router<StateT, CustomT>;
179 use(
180 path: string | string[] | RegExp,
181 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
182 ): Router<StateT, CustomT>;
183
184 /**
185 * HTTP get method
186 */
187 get(
188 name: string,
189 path: string | RegExp,
190 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
191 ): Router<StateT, CustomT>;
192 get(
193 path: string | RegExp | Array<string | RegExp>,
194 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
195 ): Router<StateT, CustomT>;
196 get<T, U>(
197 name: string,
198 path: string | RegExp,
199 middleware: Koa.Middleware<T, U>,
200 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
201 ): Router<StateT & T, CustomT & U>;
202 get<T, U>(
203 path: string | RegExp | Array<string | RegExp>,
204 middleware: Koa.Middleware<T, U>,
205 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
206 ): Router<StateT & T, CustomT & U>;
207
208 /**
209 * HTTP post method
210 */
211 post(
212 name: string,
213 path: string | RegExp,
214 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
215 ): Router<StateT, CustomT>;
216 post(
217 path: string | RegExp | Array<string | RegExp>,
218 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
219 ): Router<StateT, CustomT>;
220 post<T, U>(
221 name: string,
222 path: string | RegExp,
223 middleware: Koa.Middleware<T, U>,
224 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
225 ): Router<StateT & T, CustomT & U>;
226 post<T, U>(
227 path: string | RegExp | Array<string | RegExp>,
228 middleware: Koa.Middleware<T, U>,
229 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
230 ): Router<StateT & T, CustomT & U>;
231
232 /**
233 * HTTP put method
234 */
235 put(
236 name: string,
237 path: string | RegExp,
238 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
239 ): Router<StateT, CustomT>;
240 put(
241 path: string | RegExp | Array<string | RegExp>,
242 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
243 ): Router<StateT, CustomT>;
244 put<T, U>(
245 name: string,
246 path: string | RegExp,
247 middleware: Koa.Middleware<T, U>,
248 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
249 ): Router<StateT & T, CustomT & U>;
250 put<T, U>(
251 path: string | RegExp | Array<string | RegExp>,
252 middleware: Koa.Middleware<T, U>,
253 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
254 ): Router<StateT & T, CustomT & U>;
255
256 /**
257 * HTTP link method
258 */
259 link(
260 name: string,
261 path: string | RegExp,
262 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
263 ): Router<StateT, CustomT>;
264 link(
265 path: string | RegExp | Array<string | RegExp>,
266 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
267 ): Router<StateT, CustomT>;
268 link<T, U>(
269 name: string,
270 path: string | RegExp,
271 middleware: Koa.Middleware<T, U>,
272 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
273 ): Router<StateT & T, CustomT & U>;
274 link<T, U>(
275 path: string | RegExp | Array<string | RegExp>,
276 middleware: Koa.Middleware<T, U>,
277 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
278 ): Router<StateT & T, CustomT & U>;
279
280 /**
281 * HTTP unlink method
282 */
283 unlink(
284 name: string,
285 path: string | RegExp,
286 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
287 ): Router<StateT, CustomT>;
288 unlink(
289 path: string | RegExp | Array<string | RegExp>,
290 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
291 ): Router<StateT, CustomT>;
292 unlink<T, U>(
293 name: string,
294 path: string | RegExp,
295 middleware: Koa.Middleware<T, U>,
296 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
297 ): Router<StateT & T, CustomT & U>;
298 unlink<T, U>(
299 path: string | RegExp | Array<string | RegExp>,
300 middleware: Koa.Middleware<T, U>,
301 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
302 ): Router<StateT & T, CustomT & U>;
303
304 /**
305 * HTTP delete method
306 */
307 delete(
308 name: string,
309 path: string | RegExp,
310 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
311 ): Router<StateT, CustomT>;
312 delete(
313 path: string | RegExp | Array<string | RegExp>,
314 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
315 ): Router<StateT, CustomT>;
316 delete<T, U>(
317 name: string,
318 path: string | RegExp,
319 middleware: Koa.Middleware<T, U>,
320 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
321 ): Router<StateT & T, CustomT & U>;
322 delete<T, U>(
323 path: string | RegExp | Array<string | RegExp>,
324 middleware: Koa.Middleware<T, U>,
325 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
326 ): Router<StateT & T, CustomT & U>;
327
328 /**
329 * Alias for `router.delete()` because delete is a reserved word
330 */
331 del(
332 name: string,
333 path: string | RegExp,
334 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
335 ): Router<StateT, CustomT>;
336 del(
337 path: string | RegExp | Array<string | RegExp>,
338 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
339 ): Router<StateT, CustomT>;
340 del<T, U>(
341 name: string,
342 path: string | RegExp,
343 middleware: Koa.Middleware<T, U>,
344 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
345 ): Router<StateT & T, CustomT & U>;
346 del<T, U>(
347 path: string | RegExp | Array<string | RegExp>,
348 middleware: Koa.Middleware<T, U>,
349 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
350 ): Router<StateT & T, CustomT & U>;
351
352 /**
353 * HTTP head method
354 */
355 head(
356 name: string,
357 path: string | RegExp,
358 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
359 ): Router<StateT, CustomT>;
360 head(
361 path: string | RegExp | Array<string | RegExp>,
362 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
363 ): Router<StateT, CustomT>;
364 head<T, U>(
365 name: string,
366 path: string | RegExp,
367 middleware: Koa.Middleware<T, U>,
368 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
369 ): Router<StateT & T, CustomT & U>;
370 head<T, U>(
371 path: string | RegExp | Array<string | RegExp>,
372 middleware: Koa.Middleware<T, U>,
373 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
374 ): Router<StateT & T, CustomT & U>;
375
376 /**
377 * HTTP options method
378 */
379 options(
380 name: string,
381 path: string | RegExp,
382 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
383 ): Router<StateT, CustomT>;
384 options(
385 path: string | RegExp | Array<string | RegExp>,
386 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
387 ): Router<StateT, CustomT>;
388 options<T, U>(
389 name: string,
390 path: string | RegExp,
391 middleware: Koa.Middleware<T, U>,
392 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
393 ): Router<StateT & T, CustomT & U>;
394 options<T, U>(
395 path: string | RegExp | Array<string | RegExp>,
396 middleware: Koa.Middleware<T, U>,
397 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
398 ): Router<StateT & T, CustomT & U>;
399
400 /**
401 * HTTP patch method
402 */
403 patch(
404 name: string,
405 path: string | RegExp,
406 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
407 ): Router<StateT, CustomT>;
408 patch(
409 path: string | RegExp | Array<string | RegExp>,
410 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
411 ): Router<StateT, CustomT>;
412 patch<T, U>(
413 name: string,
414 path: string | RegExp,
415 middleware: Koa.Middleware<T, U>,
416 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
417 ): Router<StateT & T, CustomT & U>;
418 patch<T, U>(
419 path: string | RegExp | Array<string | RegExp>,
420 middleware: Koa.Middleware<T, U>,
421 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
422 ): Router<StateT & T, CustomT & U>;
423
424 /**
425 * Register route with all methods.
426 */
427 all(
428 name: string,
429 path: string | RegExp,
430 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
431 ): Router<StateT, CustomT>;
432 all(
433 path: string | RegExp | Array<string | RegExp>,
434 ...middleware: Array<Router.IMiddleware<StateT, CustomT>>
435 ): Router<StateT, CustomT>;
436 all<T, U>(
437 name: string,
438 path: string | RegExp,
439 middleware: Koa.Middleware<T, U>,
440 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
441 ): Router<StateT & T, CustomT & U>;
442 all<T, U>(
443 path: string | RegExp | Array<string | RegExp>,
444 middleware: Koa.Middleware<T, U>,
445 routeHandler: Router.IMiddleware<StateT & T, CustomT & U>,
446 ): Router<StateT & T, CustomT & U>;
447
448 /**
449 * Set the path prefix for a Router instance that was already initialized.
450 */
451 prefix(prefix: string): Router<StateT, CustomT>;
452
453 /**
454 * Returns router middleware which dispatches a route matching the request.
455 */
456 routes(): Router.IMiddleware<StateT, CustomT>;
457
458 /**
459 * Returns router middleware which dispatches a route matching the request.
460 */
461 middleware(): Router.IMiddleware<StateT, CustomT>;
462
463 /**
464 * Returns separate middleware for responding to `OPTIONS` requests with
465 * an `Allow` header containing the allowed methods, as well as responding
466 * with `405 Method Not Allowed` and `501 Not Implemented` as appropriate.
467 */
468 allowedMethods(options?: Router.IRouterAllowedMethodsOptions): Router.IMiddleware<StateT, CustomT>;
469
470 /**
471 * Redirect `source` to `destination` URL with optional 30x status `code`.
472 *
473 * Both `source` and `destination` can be route names.
474 */
475 redirect(source: string, destination: string, code?: number): Router<StateT, CustomT>;
476
477 /**
478 * Create and register a route.
479 */
480 register(
481 path: string | RegExp,
482 methods: string[],
483 middleware: Router.IMiddleware<StateT, CustomT> | Array<Router.IMiddleware<StateT, CustomT>>,
484 opts?: Router.ILayerOptions,
485 ): Router.Layer;
486
487 /**
488 * Lookup route with given `name`.
489 */
490 route(name: string): Router.Layer;
491 route(name: string): boolean;
492
493 /**
494 * Generate URL for route. Takes either map of named `params` or series of
495 * arguments (for regular expression routes)
496 *
497 * router = new Router();
498 * router.get('user', "/users/:id", ...
499 *
500 * router.url('user', { id: 3 });
501 * // => "/users/3"
502 *
503 * Query can be generated from third argument:
504 *
505 * router.url('user', { id: 3 }, { query: { limit: 1 } });
506 * // => "/users/3?limit=1"
507 *
508 * router.url('user', { id: 3 }, { query: "limit=1" });
509 * // => "/users/3?limit=1"
510 */
511 url(name: string, params: any, options?: Router.IUrlOptionsQuery): string;
512 url(name: string, params: any, options?: Router.IUrlOptionsQuery): Error;
513
514 /**
515 * Match given `path` and return corresponding routes.
516 */
517 match(path: string, method: string): Router.IRoutesMatch;
518
519 /**
520 * Run middleware for named route parameters. Useful for auto-loading or validation.
521 */
522 param(param: string, middleware: Router.IParamMiddleware<StateT, CustomT>): Router<StateT, CustomT>;
523
524 /**
525 * Generate URL from url pattern and given `params`.
526 */
527 static url(path: string | RegExp, params: Object): string;
528}
529
530export = Router;
531
\No newline at end of file