/* =================== USAGE =================== import * as Router from "@koa/router"; var router = new Router(); =============================================== */ import * as Koa from "koa"; declare namespace Router { interface RouterOptions { /** * Prefix for all routes. */ prefix?: string | undefined; /** * Methods which should be supported by the router. */ methods?: string[] | undefined; routerPath?: string | undefined; /** * Whether or not routing should be case-sensitive. */ sensitive?: boolean | undefined; /** * Whether or not routes should matched strictly. * * If strict matching is enabled, the trailing slash is taken into * account when matching routes. */ strict?: boolean | undefined; /** * Only run last matched route's controller when there are multiple matches */ exclusive?: boolean | undefined; /** * Host for router match */ host?: string | RegExp | undefined; } interface RouterParamContext { /** * url params */ params: Record; /** * the router instance */ router: Router; /** * Matched route */ _matchedRoute: string | RegExp | undefined; _matchedRouteName: string | undefined; } type RouterContext = Koa.ParameterizedContext, BodyT>; type Middleware = Koa.Middleware< StateT, ContextT & RouterParamContext, BodyT >; interface ParamMiddleware { (param: string, ctx: RouterContext, next: Koa.Next): any; } interface RouterAllowedMethodsOptions { /** * throw error instead of setting status and header */ throw?: boolean | undefined; /** * throw the returned value in place of the default NotImplemented error */ notImplemented?: (() => any) | undefined; /** * throw the returned value in place of the default MethodNotAllowed error */ methodNotAllowed?: (() => any) | undefined; } interface LayerOptions { /** * Route name */ name: string | null; /** * Case sensitive (default: false) */ sensitive?: boolean | undefined; /** * Require the trailing slash (default: false) */ strict?: boolean | undefined; /** * (default: false) */ end?: boolean | undefined; /** * (default: '') */ prefix?: string | undefined; ignoreCaptures?: boolean | undefined; } interface UrlOptionsQuery { query: object | string; } interface RoutesMatch { path: Layer[]; pathAndMethod: Layer[]; route: boolean; } class ParamName { asterisk: boolean; delimiter: string; name: string; optional: boolean; partial: boolean; pattern: string; prefix: string; repeat: string; } class Layer { opts: LayerOptions; name: string | null; methods: string[]; paramNames: ParamName[]; stack: Middleware[]; regexp: RegExp; path: string | RegExp; constructor( path: string | RegExp, methods: string[], middleware: Middleware | Middleware[], opts?: LayerOptions, ); /** * Returns whether request `path` matches route. */ match(path: string): boolean; /** * Returns map of URL parameters for given `path` and `paramNames`. */ params( path: string | RegExp, captures: ParamT[], params?: Record, ): { [key in ParamT]?: string }; /** * Returns array of regexp url path captures. */ captures(path: string): string[]; /** * Generate URL for route using given `params`. * * @example * * ```javascript * const route = new Layer('/users/:id', ['GET'], fn); * * route.url({ id: 123 }); // => "/users/123" * ``` */ url(params: object): string; /** * Run validations on route named parameters. * * @example * * ```javascript * router * .param('user', function (id, ctx, next) { * ctx.user = users[id]; * if (!ctx.user) return ctx.status = 404; * next(); * }) * .get('/users/:user', function (ctx, next) { * ctx.body = ctx.user; * }); * ``` */ param(param: string, middleware: ParamMiddleware): Layer; /** * Prefix route path. */ setPrefix(prefix: string): Layer; } } declare class Router { opts: Router.RouterOptions; methods: string[]; params: object; stack: Router.Layer[]; /** * Create a new router. */ constructor(opt?: Router.RouterOptions); /** * Use given middleware. * * Middleware run in the order they are defined by `.use()`. They are invoked * sequentially, requests start at the first middleware and work their way * "down" the middleware stack. */ use(...middleware: Array>): Router; /** * Use given middleware. * * Middleware run in the order they are defined by `.use()`. They are invoked * sequentially, requests start at the first middleware and work their way * "down" the middleware stack. */ use( path: string | string[] | RegExp, ...middleware: Array> ): Router; /** * HTTP get method */ get( name: string, path: string | RegExp, ...middleware: Array> ): Router; /** * HTTP get method */ get( path: string | RegExp | Array, ...middleware: Array> ): Router; /** * HTTP post method */ post( name: string, path: string | RegExp, ...middleware: Array> ): Router; /** * HTTP post method */ post( path: string | RegExp | Array, ...middleware: Array> ): Router; /** * HTTP put method */ put( name: string, path: string | RegExp, ...middleware: Array> ): Router; /** * HTTP put method */ put( path: string | RegExp | Array, ...middleware: Array> ): Router; /** * HTTP link method */ link( name: string, path: string | RegExp, ...middleware: Array> ): Router; /** * HTTP link method */ link( path: string | RegExp | Array, ...middleware: Array> ): Router; /** * HTTP unlink method */ unlink( name: string, path: string | RegExp, ...middleware: Array> ): Router; /** * HTTP unlink method */ unlink( path: string | RegExp | Array, ...middleware: Array> ): Router; /** * HTTP delete method */ delete( name: string, path: string | RegExp, ...middleware: Array> ): Router; /** * HTTP delete method */ delete( path: string | RegExp | Array, ...middleware: Array> ): Router; /** * Alias for `router.delete()` because delete is a reserved word */ del( name: string, path: string | RegExp, ...middleware: Array> ): Router; /** * Alias for `router.delete()` because delete is a reserved word */ del( path: string | RegExp | Array, ...middleware: Array> ): Router; /** * HTTP head method */ head( name: string, path: string | RegExp, ...middleware: Array> ): Router; /** * HTTP head method */ head( path: string | RegExp | Array, ...middleware: Array> ): Router; /** * HTTP options method */ options( name: string, path: string | RegExp, ...middleware: Array> ): Router; /** * HTTP options method */ options( path: string | RegExp | Array, ...middleware: Array> ): Router; /** * HTTP patch method */ patch( name: string, path: string | RegExp, ...middleware: Array> ): Router; /** * HTTP patch method */ patch( path: string | RegExp | Array, ...middleware: Array> ): Router; /** * Register route with all methods. */ all( name: string, path: string | RegExp, ...middleware: Array> ): Router; /** * Register route with all methods. */ all( path: string | RegExp | Array, ...middleware: Array> ): Router; /** * Set the path prefix for a Router instance that was already initialized. * * @example * * ```javascript * router.prefix('/things/:thing_id') * ``` */ prefix(prefix: string): Router; /** * Returns router middleware which dispatches a route matching the request. */ routes(): Router.Middleware; /** * Returns router middleware which dispatches a route matching the request. */ middleware(): Router.Middleware; /** * Returns separate middleware for responding to `OPTIONS` requests with * an `Allow` header containing the allowed methods, as well as responding * with `405 Method Not Allowed` and `501 Not Implemented` as appropriate. * * @example * * ```javascript * var Koa = require('koa'); * var Router = require('koa-router'); * * var app = new Koa(); * var router = new Router(); * * app.use(router.routes()); * app.use(router.allowedMethods()); * ``` * * **Example with [Boom](https://github.com/hapijs/boom)** * * ```javascript * var Koa = require('koa'); * var Router = require('koa-router'); * var Boom = require('boom'); * * var app = new Koa(); * var router = new Router(); * * app.use(router.routes()); * app.use(router.allowedMethods({ * throw: true, * notImplemented: () => new Boom.notImplemented(), * methodNotAllowed: () => new Boom.methodNotAllowed() * })); * ``` */ allowedMethods( options?: Router.RouterAllowedMethodsOptions, ): Router.Middleware; /** * Redirect `source` to `destination` URL with optional 30x status `code`. * * Both `source` and `destination` can be route names. * * ```javascript * router.redirect('/login', 'sign-in'); * ``` * * This is equivalent to: * * ```javascript * router.all('/login', ctx => { * ctx.redirect('/sign-in'); * ctx.status = 301; * }); * ``` */ redirect(source: string, destination: string, code?: number): Router; /** * Create and register a route. */ register( path: string | RegExp, methods: string[], middleware: Router.Middleware | Array>, opts?: Router.LayerOptions, ): Router.Layer; /** * Lookup route with given `name`. */ route(name: string): Router.Layer | boolean; /** * Generate URL for route. Takes either map of named `params` or series of * arguments (for regular expression routes) * * router = new Router(); * router.get('user', "/users/:id", ... * * router.url('user', { id: 3 }); * // => "/users/3" * * Query can be generated from third argument: * * router.url('user', { id: 3 }, { query: { limit: 1 } }); * // => "/users/3?limit=1" * * router.url('user', { id: 3 }, { query: "limit=1" }); * // => "/users/3?limit=1" */ url(name: string, params?: any, options?: Router.UrlOptionsQuery): Error | string; /** * Match given `path` and return corresponding routes. */ match(path: string, method: string): Router.RoutesMatch; /** * Run middleware for named route parameters. Useful for auto-loading or * validation. * * @example * * ```javascript * router * .param('user', (id, ctx, next) => { * ctx.user = users[id]; * if (!ctx.user) return ctx.status = 404; * return next(); * }) * .get('/users/:user', ctx => { * ctx.body = ctx.user; * }) * .get('/users/:user/friends', ctx => { * return ctx.user.getFriends().then(function(friends) { * ctx.body = friends; * }); * }) * // /users/3 => {"id": 3, "name": "Alex"} * // /users/3/friends => [{"id": 4, "name": "TJ"}] * ``` */ param( param: string, middleware: Router.ParamMiddleware, ): Router; /** * Generate URL for route. Takes a route name and map of named `params`. * * @example * * ```javascript * router.get('user', '/users/:id', (ctx, next) => { * // ... * }); * * router.url('user', 3); * // => "/users/3" * * router.url('user', { id: 3 }); * // => "/users/3" * * router.use((ctx, next) => { * // redirect to named route * ctx.redirect(ctx.router.url('sign-in')); * }) * * router.url('user', { id: 3 }, { query: { limit: 1 } }); * // => "/users/3?limit=1" * * router.url('user', { id: 3 }, { query: "limit=1" }); * // => "/users/3?limit=1" * ``` */ static url(path: string | RegExp, params: object): string; } export = Router;