Skip to content

Instantly share code, notes, and snippets.

@Ashoat
Created October 2, 2019 00:49
Show Gist options
  • Save Ashoat/2dbf10c209a9460f0d0a7c24e3376e6a to your computer and use it in GitHub Desktop.
Save Ashoat/2dbf10c209a9460f0d0a7c24e3376e6a to your computer and use it in GitHub Desktop.
diff --git a/definitions/npm/express_v4.x.x/flow_v0.104.x-/express_v4.x.x.js b/definitions/npm/express_v4.x.x/flow_v0.104.x-/express_v4.x.x.js
index 84393084..7e29c7e3 100644
--- a/definitions/npm/express_v4.x.x/flow_v0.104.x-/express_v4.x.x.js
+++ b/definitions/npm/express_v4.x.x/flow_v0.104.x-/express_v4.x.x.js
@@ -98,13 +98,97 @@ declare class express$Response extends http$ServerResponse mixins express$Reques
}
declare type express$NextFunction = (err?: ?Error | 'route') => mixed;
-declare type express$Middleware =
- ((req: express$Request, res: express$Response, next: express$NextFunction) => mixed) |
- ((error: Error, req: express$Request, res: express$Response, next: express$NextFunction) => mixed);
+declare type express$Middleware<Req: express$Request, Res: express$Response> =
+ ((req: Req, res: Res, next: express$NextFunction) => mixed) |
+ ((error: Error, req: Req, res: Res, next: express$NextFunction) => mixed);
declare interface express$RouteMethodType<T> {
- (middleware: express$Middleware): T;
- (...middleware: Array<express$Middleware>): T;
- (path: express$Path|express$Path[], ...middleware: Array<express$Middleware>): T;
+ <Req: express$Request, Res: express$Response>(
+ middleware: express$Middleware<Req, Res>,
+ ): T;
+ <
+ Req1: express$Request,
+ Res1: express$Response,
+ Req2: express$Request,
+ Res2: express$Response,
+ >(
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ ): T;
+ <
+ Req1: express$Request,
+ Res1: express$Response,
+ Req2: express$Request,
+ Res2: express$Response,
+ Req3: express$Request,
+ Res3: express$Response,
+ >(
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ middleware3: express$Middleware<Req3, Res3>,
+ ): T;
+ <
+ Req1: express$Request,
+ Res1: express$Response,
+ Req2: express$Request,
+ Res2: express$Response,
+ Req3: express$Request,
+ Res3: express$Response,
+ Req4: express$Request,
+ Res4: express$Response,
+ >(
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ middleware3: express$Middleware<Req3, Res3>,
+ middleware4: express$Middleware<Req4, Res4>,
+ ): T;
+ <Req: express$Request, Res: express$Response>(
+ path: express$Path | $ReadOnlyArray<express$Path>,
+ middleware1: express$Middleware<Req, Res>,
+ ): T;
+ <
+ Req1: express$Request,
+ Res1: express$Response,
+ Req2: express$Request,
+ Res2: express$Response,
+ >(
+ path: express$Path | $ReadOnlyArray<express$Path>,
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ ): T;
+ <
+ Req1: express$Request,
+ Res1: express$Response,
+ Req2: express$Request,
+ Res2: express$Response,
+ Req3: express$Request,
+ Res3: express$Response,
+ >(
+ path: express$Path | $ReadOnlyArray<express$Path>,
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ middleware3: express$Middleware<Req3, Res3>,
+ ): T;
+ <
+ Req1: express$Request,
+ Res1: express$Response,
+ Req2: express$Request,
+ Res2: express$Response,
+ Req3: express$Request,
+ Res3: express$Response,
+ Req4: express$Request,
+ Res4: express$Response,
+ >(
+ path: express$Path | $ReadOnlyArray<express$Path>,
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ middleware3: express$Middleware<Req3, Res3>,
+ middleware4: express$Middleware<Req4, Res4>,
+ ): T;
+ (...middleware: Array<express$Middleware<mixed, mixed>>): T;
+ (
+ path: express$Path | $ReadOnlyArray<express$Path>,
+ ...middleware: Array<express$Middleware<mixed, mixed>>
+ ): T;
}
declare class express$Route {
all: express$RouteMethodType<this>;
@@ -138,22 +222,138 @@ declare class express$Route {
connect: express$RouteMethodType<this>;
}
-declare class express$Router extends express$Route {
+declare class express$Router<
+ Req: express$Request,
+ Res: express$Response,
+> extends express$Route {
constructor(options?: express$RouterOptions): void;
route(path: string): express$Route;
static (options?: express$RouterOptions): express$Router;
- use(middleware: express$Middleware): this;
- use(...middleware: Array<express$Middleware>): this;
- use(path: express$Path|express$Path[], ...middleware: Array<express$Middleware>): this;
+ use<Req: express$Request, Res: express$Response>(
+ middleware: express$Middleware<Req, Res>,
+ ): this;
+ use<
+ Req1: express$Request,
+ Res1: express$Response,
+ Req2: express$Request,
+ Res2: express$Response,
+ >(
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ ): this;
+ use<
+ Req1: express$Request,
+ Res1: express$Response,
+ Req2: express$Request,
+ Res2: express$Response,
+ Req3: express$Request,
+ Res3: express$Response,
+ >(
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ middleware3: express$Middleware<Req3, Res3>,
+ ): this;
+ use<
+ Req1: express$Request,
+ Res1: express$Response,
+ Req2: express$Request,
+ Res2: express$Response,
+ Req3: express$Request,
+ Res3: express$Response,
+ Req4: express$Request,
+ Res4: express$Response,
+ >(
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ middleware3: express$Middleware<Req3, Res3>,
+ middleware4: express$Middleware<Req4, Res4>,
+ ): this;
+ use<
+ Req1: express$Request,
+ Res1: express$Response,
+ Req2: express$Request,
+ Res2: express$Response,
+ Req3: express$Request,
+ Res3: express$Response,
+ Req4: express$Request,
+ Res4: express$Response,
+ >(
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ middleware3: express$Middleware<Req3, Res3>,
+ middleware4: express$Middleware<Req4, Res4>,
+ ...middlewares: Array<express$Middleware<mixed, mixed>>
+ ): this;
+ use<Req: express$Request, Res: express$Response>(
+ path: express$Path | $ReadOnlyArray<express$Path>,
+ middleware: express$Middleware<Req, Res>,
+ ): this;
+ use<
+ Req1: express$Request,
+ Res1: express$Response,
+ Req2: express$Request,
+ Res2: express$Response,
+ >(
+ path: express$Path | $ReadOnlyArray<express$Path>,
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ ): this;
+ use<
+ Req1: express$Request,
+ Res1: express$Response,
+ Req2: express$Request,
+ Res2: express$Response,
+ Req3: express$Request,
+ Res3: express$Response,
+ >(
+ path: express$Path | $ReadOnlyArray<express$Path>,
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ middleware3: express$Middleware<Req3, Res3>,
+ ): this;
+ use<
+ Req1: express$Request,
+ Res1: express$Response,
+ Req2: express$Request,
+ Res2: express$Response,
+ Req3: express$Request,
+ Res3: express$Response,
+ Req4: express$Request,
+ Res4: express$Response,
+ >(
+ path: express$Path | $ReadOnlyArray<express$Path>,
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ middleware3: express$Middleware<Req3, Res3>,
+ middleware4: express$Middleware<Req4, Res4>,
+ ): this;
+ use<
+ Req1: express$Request,
+ Res1: express$Response,
+ Req2: express$Request,
+ Res2: express$Response,
+ Req3: express$Request,
+ Res3: express$Response,
+ Req4: express$Request,
+ Res4: express$Response,
+ >(
+ path: express$Path | $ReadOnlyArray<express$Path>,
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ middleware3: express$Middleware<Req3, Res3>,
+ middleware4: express$Middleware<Req4, Res4>,
+ ...middlewares: Array<express$Middleware<mixed, mixed>>
+ ): this;
use(path: string, router: express$Router): this;
handle(req: http$IncomingMessage<>, res: http$ServerResponse, next: express$NextFunction): void;
- param(
+ param<Req: express$Request>(
param: string,
callback: (
- req: express$Request,
+ req: Req,
res: express$Response,
next: express$NextFunction,
- id: string
+ value: string,
+ paramName: string,
) => mixed
): void;
(req: http$IncomingMessage<>, res: http$ServerResponse, next?: ?express$NextFunction): void;
@@ -187,7 +387,10 @@ declare class express$Application extends express$Router mixins events$EventEmit
declare module 'express' {
declare export type RouterOptions = express$RouterOptions;
declare export type CookieOptions = express$CookieOptions;
- declare export type Middleware = express$Middleware;
+ declare export type Middleware<
+ Req: express$Request,
+ Res: express$Reseponse,
+ > = express$Middleware<Req, Res>;
declare export type NextFunction = express$NextFunction;
declare export type RequestParams = express$RequestParams;
declare export type $Response = express$Response;
@@ -198,7 +401,7 @@ declare module 'express' {
// If you try to call like a function, it will use this signature
(): express$Application,
// `static` property on the function
- static: (root: string, options?: Object) => express$Middleware,
+ static: <Req: express$Request>(root: string, options?: Object) => express$Middleware<Req>,
// `Router` property on the function
Router: typeof express$Router,
...
diff --git a/definitions/npm/express_v4.x.x/flow_v0.104.x-/test_overrideUseMethodClassExtension.js b/definitions/npm/express_v4.x.x/flow_v0.104.x-/test_overrideUseMethodClassExtension.js
index 525b9198..1b988935 100644
--- a/definitions/npm/express_v4.x.x/flow_v0.104.x-/test_overrideUseMethodClassExtension.js
+++ b/definitions/npm/express_v4.x.x/flow_v0.104.x-/test_overrideUseMethodClassExtension.js
@@ -14,16 +14,123 @@ declare type test_express$CustomPath = string | RegExp;
declare type test_express$CustomNextFunction = express$NextFunction;
-declare type test_express$CustomMiddleware =
- ((req: test_express$CustomRequest, res: test_express$CustomResponse, next: test_express$CustomNextFunction) => mixed) |
- ((error: Error, req: test_express$CustomRequest, res: test_express$CustomResponse, next: test_express$CustomNextFunction) => mixed);
-
declare class test_express$CustomApplication extends express$Application {
constructor(expressConstructor: () => express$Application): this;
- use(middleware: test_express$CustomMiddleware): this;
- use(...middleware: Array<test_express$CustomMiddleware>): this;
- use(path: test_express$CustomPath|test_express$CustomPath[], ...middleware: Array<test_express$CustomMiddleware>): this;
- use(path: string, router: express$Router): this;
+ use<Req: test_express$CustomRequest, Res: test_express$CustomResponse>(
+ middleware: express$Middleware<Req, Res>,
+ ): this;
+ use<
+ Req1: test_express$CustomRequest,
+ Res1: test_express$CustomResponse,
+ Req2: test_express$CustomRequest,
+ Res2: test_express$CustomResponse,
+ >(
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ ): this;
+ use<
+ Req1: test_express$CustomRequest,
+ Res1: test_express$CustomResponse,
+ Req2: test_express$CustomRequest,
+ Res2: test_express$CustomResponse,
+ Req3: test_express$CustomRequest,
+ Res3: test_express$CustomResponse,
+ >(
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ middleware3: express$Middleware<Req3, Res3>,
+ ): this;
+ use<
+ Req1: test_express$CustomRequest,
+ Res1: test_express$CustomResponse,
+ Req2: test_express$CustomRequest,
+ Res2: test_express$CustomResponse,
+ Req3: test_express$CustomRequest,
+ Res3: test_express$CustomResponse,
+ Req4: test_express$CustomRequest,
+ Res4: test_express$CustomResponse,
+ >(
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ middleware3: express$Middleware<Req3, Res3>,
+ middleware4: express$Middleware<Req4, Res4>,
+ ): this;
+ use<
+ Req1: test_express$CustomRequest,
+ Res1: test_express$CustomResponse,
+ Req2: test_express$CustomRequest,
+ Res2: test_express$CustomResponse,
+ Req3: test_express$CustomRequest,
+ Res3: test_express$CustomResponse,
+ Req4: test_express$CustomRequest,
+ Res4: test_express$CustomResponse,
+ >(
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ middleware3: express$Middleware<Req3, Res3>,
+ middleware4: express$Middleware<Req4, Res4>,
+ ...middlewares: Array<express$Middleware<mixed, mixed>>
+ ): this;
+ use<Req: test_express$CustomRequest, Res: test_express$CustomResponse>(
+ path: express$Path | $ReadOnlyArray<express$Path>,
+ middleware: express$Middleware<Req, Res>,
+ ): this;
+ use<
+ Req1: test_express$CustomRequest,
+ Res1: test_express$CustomResponse,
+ Req2: test_express$CustomRequest,
+ Res2: test_express$CustomResponse,
+ >(
+ path: express$Path | $ReadOnlyArray<express$Path>,
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ ): this;
+ use<
+ Req1: test_express$CustomRequest,
+ Res1: test_express$CustomResponse,
+ Req2: test_express$CustomRequest,
+ Res2: test_express$CustomResponse,
+ Req3: test_express$CustomRequest,
+ Res3: test_express$CustomResponse,
+ >(
+ path: express$Path | $ReadOnlyArray<express$Path>,
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ middleware3: express$Middleware<Req3, Res3>,
+ ): this;
+ use<
+ Req1: test_express$CustomRequest,
+ Res1: test_express$CustomResponse,
+ Req2: test_express$CustomRequest,
+ Res2: test_express$CustomResponse,
+ Req3: test_express$CustomRequest,
+ Res3: test_express$CustomResponse,
+ Req4: test_express$CustomRequest,
+ Res4: test_express$CustomResponse,
+ >(
+ path: express$Path | $ReadOnlyArray<express$Path>,
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ middleware3: express$Middleware<Req3, Res3>,
+ middleware4: express$Middleware<Req4, Res4>,
+ ): this;
+ use<
+ Req1: test_express$CustomRequest,
+ Res1: test_express$CustomResponse,
+ Req2: test_express$CustomRequest,
+ Res2: test_express$CustomResponse,
+ Req3: test_express$CustomRequest,
+ Res3: test_express$CustomResponse,
+ Req4: test_express$CustomRequest,
+ Res4: test_express$CustomResponse,
+ >(
+ path: express$Path | $ReadOnlyArray<express$Path>,
+ middleware1: express$Middleware<Req1, Res1>,
+ middleware2: express$Middleware<Req2, Res2>,
+ middleware3: express$Middleware<Req3, Res3>,
+ middleware4: express$Middleware<Req4, Res4>,
+ ...middlewares: Array<express$Middleware<mixed, mixed>>
+ ): this;
}
// Class Extensions: Test Functions
@@ -31,7 +138,11 @@ function test_express$CustomApplication(
expressConstructor: () => express$Application
) {
const express = expressConstructor();
- express.use((req: any, res: any, next: express$NextFunction) => {
+ express.use((
+ req: test_express$CustomRequest,
+ res: test_express$CustomResponse,
+ next: express$NextFunction,
+ ) => {
// Private Constructor Mutation: Add new properties
req.foo = 'hello';
res.bar = 'goodbye';
diff --git a/definitions/npm/express_v4.x.x/flow_v0.104.x-/test_response.js b/definitions/npm/express_v4.x.x/flow_v0.104.x-/test_response.js
index b604c403..3514604e 100644
--- a/definitions/npm/express_v4.x.x/flow_v0.104.x-/test_response.js
+++ b/definitions/npm/express_v4.x.x/flow_v0.104.x-/test_response.js
@@ -27,6 +27,18 @@ app.use(
);
app.post("/post-router-callable", router);
+// Can set a custom param on request
+app.param('test', (
+ req: express$Request & { testValue: string, ... },
+ res: express$Response,
+ next: express$NextFunction,
+ id: string,
+ paramName: string,
+) => {
+ req.testValue = id;
+ next();
+});
+
// Can use an express app directly as a server listener
const httpServer = http.createServer(app);
httpServer.listen(9000);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment