From 7f819ab94630a268a82a517097b1da3b2bed1448 Mon Sep 17 00:00:00 2001 From: Philipp Katz Date: Sat, 9 Jun 2018 10:34:06 +0200 Subject: [PATCH] Add `named-routes` --- types/named-routes/index.d.ts | 47 ++++++++++++++++++++++++ types/named-routes/named-routes-tests.ts | 35 ++++++++++++++++++ types/named-routes/tsconfig.json | 23 ++++++++++++ types/named-routes/tslint.json | 1 + 4 files changed, 106 insertions(+) create mode 100644 types/named-routes/index.d.ts create mode 100644 types/named-routes/named-routes-tests.ts create mode 100644 types/named-routes/tsconfig.json create mode 100644 types/named-routes/tslint.json diff --git a/types/named-routes/index.d.ts b/types/named-routes/index.d.ts new file mode 100644 index 0000000000..b983ba1911 --- /dev/null +++ b/types/named-routes/index.d.ts @@ -0,0 +1,47 @@ +// Type definitions for named-routes 2.0 +// Project: https://github.com/alubbe/named-routes#readme +// Definitions by: Philipp Katz +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.2 + +import * as express from 'express'; + +declare module 'express-serve-static-core' { + interface Application { + namedRoutes: NamedRouter; + } + // tslint:disable-next-line interface-name + interface IRouterMatcher { + (path: PathParams, name: string, ...handlers: RequestHandler[]): T; + (path: PathParams, name: string, ...handlers: RequestHandlerParams[]): T; + } +} + +interface RouterOptions { + caseSensitive: boolean; +} + +interface RouteOptions { + name: string; + recursiveWildcard: boolean; + caseSensitive: boolean; + wildcardInPairs: boolean; +} + +interface RouteParams { + [ key: string ]: string | string[] | number | number[] | boolean | boolean[] | null; +} + +declare class NamedRouter { + constructor(options?: Partial); + match(req: express.Request): boolean | object; + add(method: string, path: string, callbacks: express.RequestHandler | express.RequestHandler[], options?: Partial): void; + build(name: string, params?: RouteParams, method?: string): string; + registerAppHelpers(app: express.Express): NamedRouter; + param(name: string, callback: express.RequestHandler): NamedRouter; + param(callback: express.RequestHandler): NamedRouter; + dispatch(req: express.Request, res?: express.Response, next?: express.NextFunction): void; + extendExpress(app: express.Express | express.Router): NamedRouter; +} + +export = NamedRouter; diff --git a/types/named-routes/named-routes-tests.ts b/types/named-routes/named-routes-tests.ts new file mode 100644 index 0000000000..9b424a2c45 --- /dev/null +++ b/types/named-routes/named-routes-tests.ts @@ -0,0 +1,35 @@ +import NamedRouter = require('named-routes'); +import * as express from 'express'; +const app = express(); + +// constructor and `RouterOptions` +let router = new NamedRouter(); +router = new NamedRouter({ caseSensitive: true }); + +router.extendExpress(app); // $ExpectType NamedRouter +router.registerAppHelpers(app); // $ExpectType NamedRouter +app.get('/path/:id', 'foo', () => {}); // $ExpectType Express +app.namedRoutes.build('foo', { id: 1 }); // $ExpectType string + +const expressRouter = express.Router(); +router.extendExpress(expressRouter); // $ExpectType NamedRouter +expressRouter.post('/path/:id', 'foo', () => {}); // $ExpectType Router + +// `RouteOptions` +router.add('get', '/path/:id', () => {}); // $ExpectType void +router.add('get', '/path/:id', () => {}, { name: 'foo' }); // $ExpectType void +router.add('get', '/path/:id', () => {}, { name: 'foo', recursiveWildcard: true }); // $ExpectType void +router.add('get', '/path/:id', () => {}, { name: 'foo', caseSensitive: true }); // $ExpectType void +router.add('get', '/path/:id', () => {}, { name: 'foo', wildcardInPairs: true }); // $ExpectType void + +// `RouteParams` +router.build('foo', { string: 'a' }); // $ExpectType string +router.build('foo', { stringArray: [ 'a', 'b' ] }); // $ExpectType string +router.build('foo', { number: 1 }); // $ExpectType string +router.build('foo', { numberArray: [ 1, 2 ] }); // $ExpectType string +router.build('foo', { boolean: true }); // $ExpectType string +router.build('foo', { booleanArray: [ true, false ] }); // $ExpectType string +router.build('foo', { null: null }); // $ExpectType string + +const req: express.Request = {} as any; +router.dispatch(req); // $ExpectType void diff --git a/types/named-routes/tsconfig.json b/types/named-routes/tsconfig.json new file mode 100644 index 0000000000..28060f592f --- /dev/null +++ b/types/named-routes/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "named-routes-tests.ts" + ] +} diff --git a/types/named-routes/tslint.json b/types/named-routes/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/named-routes/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" }