From ca788e669fc517efbaa2ba2b1e21ab918705d191 Mon Sep 17 00:00:00 2001 From: Emily Marigold Klassen Date: Thu, 11 Oct 2018 21:18:41 -0700 Subject: [PATCH] Add types for follow-redirects --- .../follow-redirects-tests.ts | 32 +++++ types/follow-redirects/http.d.ts | 3 + types/follow-redirects/https.d.ts | 3 + types/follow-redirects/index.d.ts | 118 ++++++++++++++++++ types/follow-redirects/tsconfig.json | 25 ++++ types/follow-redirects/tslint.json | 1 + 6 files changed, 182 insertions(+) create mode 100644 types/follow-redirects/follow-redirects-tests.ts create mode 100644 types/follow-redirects/http.d.ts create mode 100644 types/follow-redirects/https.d.ts create mode 100644 types/follow-redirects/index.d.ts create mode 100644 types/follow-redirects/tsconfig.json create mode 100644 types/follow-redirects/tslint.json diff --git a/types/follow-redirects/follow-redirects-tests.ts b/types/follow-redirects/follow-redirects-tests.ts new file mode 100644 index 0000000000..96219ad2a8 --- /dev/null +++ b/types/follow-redirects/follow-redirects-tests.ts @@ -0,0 +1,32 @@ +import { http, https } from 'follow-redirects'; + +http.request({ + host: 'localhost', + path: '/a/b', + port: 8000, + maxRedirects: 12, +}, (response) => { + console.log(response.responseUrl, response.redirects); + response.on('data', (chunk) => { + console.log(chunk); + }); +}).on('error', (err) => { + console.error(err); +}); + +http.get('http://bit.ly/900913', (response) => { + response.on('data', (chunk) => { + console.log(chunk); + }); +}).on('error', (err) => { + console.error(err); +}); + +https.get('http://bit.ly/900913', (response) => { + console.log(response.responseUrl, response.redirects); + response.on('data', (chunk) => { + console.log(chunk); + }); +}).on('error', (err: Error) => { + console.error(err); +}); diff --git a/types/follow-redirects/http.d.ts b/types/follow-redirects/http.d.ts new file mode 100644 index 0000000000..43206e2838 --- /dev/null +++ b/types/follow-redirects/http.d.ts @@ -0,0 +1,3 @@ +import { http } from '.'; + +export = http; diff --git a/types/follow-redirects/https.d.ts b/types/follow-redirects/https.d.ts new file mode 100644 index 0000000000..12e081c8f5 --- /dev/null +++ b/types/follow-redirects/https.d.ts @@ -0,0 +1,3 @@ +import { https } from '.'; + +export = https; diff --git a/types/follow-redirects/index.d.ts b/types/follow-redirects/index.d.ts new file mode 100644 index 0000000000..b67c17654b --- /dev/null +++ b/types/follow-redirects/index.d.ts @@ -0,0 +1,118 @@ +// Type definitions for follow-redirects 1.5 +// Project: https://github.com/olalonde/follow-redirects +// Definitions by: Emily Klassen +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.8 + +/// + +import * as coreHttp from 'http'; +import * as coreHttps from 'https'; +import { Writable } from 'stream'; + +export interface WrappableRequest { + getHeader?(...args: any[]): any; + setHeader(...args: any[]): any; + removeHeader(...args: any[]): any; + + abort?(...args: any[]): any; + flushHeaders?(...args: any[]): any; + setNoDelay?(...args: any[]): any; + setSocketKeepAlive?(...args: any[]): any; + setTimeout?(...args: any[]): any; +} +export interface WrappableResponse { + statusCode?: number; + headers: { + location?: string + }; + destroy(): any; +} + +export interface Scheme { + request(options: Options, callback?: (res: Response) => any): Request; +} + +export interface RedirectableRequest extends Writable { + setHeader: Request['setHeader']; + removeHeader: Request['removeHeader']; + abort: Request['abort']; + flushHeaders: Request['flushHeaders']; + getHeader: Request['getHeader']; + setNoDelay: Request['setNoDelay']; + setSocketKeepAlive: Request['setSocketKeepAlive']; + setTimeout: Request['setTimeout']; + + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "response", listener: (response: Response) => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "response", response: Response): boolean; + emit(event: "error", err: Error): boolean; + + on(event: string, listener: (...args: any[]) => void): this; + on(event: "response", listener: (response: Response) => void): this; + on(event: "error", listener: (err: Error) => void): this; + + once(event: string, listener: (...args: any[]) => void): this; + once(event: "response", listener: (response: Response) => void): this; + once(event: "error", listener: (err: Error) => void): this; + + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "response", listener: (response: Response) => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "response", listener: (response: Response) => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; +} + +export interface RedirectScheme { + request( + options: string | Options & FollowOptions, + callback?: (res: Response & FollowResponse) => void + ): RedirectableRequest; + get( + options: string | Options & FollowOptions, + callback?: (res: Response & FollowResponse) => void + ): RedirectableRequest; +} + +export type Override = Pick> & U; +export interface FollowOptions { + maxRedirects?: number; + maxBodyLength?: number; +} + +export interface FollowResponse { + responseUrl: string; + redirects: Redirect[]; +} + +export interface Redirect { + url: string; + headers: coreHttp.IncomingHttpHeaders; + statusCode: number; +} + +export const http: Override>; +export const https: Override>; + +export type WrappedScheme> = Override ? Options : never, + T extends Scheme ? Request : never, + T extends Scheme ? Response : never +>>; + +export function wrap}>(protocols: T): { + [K in keyof T]: WrappedScheme +}; diff --git a/types/follow-redirects/tsconfig.json b/types/follow-redirects/tsconfig.json new file mode 100644 index 0000000000..1b3c66288e --- /dev/null +++ b/types/follow-redirects/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "http.d.ts", + "https.d.ts", + "follow-redirects-tests.ts" + ] +} diff --git a/types/follow-redirects/tslint.json b/types/follow-redirects/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/follow-redirects/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" }