diff --git a/types/pollyjs__adapter-fetch/index.d.ts b/types/pollyjs__adapter-fetch/index.d.ts new file mode 100644 index 0000000000..3d93435d51 --- /dev/null +++ b/types/pollyjs__adapter-fetch/index.d.ts @@ -0,0 +1,9 @@ +// Type definitions for @pollyjs/adapter-fetch 1.2 +// Project: https://github.com/netflix/pollyjs/tree/master/packages/@pollyjs/adapter-fetch +// Definitions by: feinoujc +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.4 + +import Adapter from '@pollyjs/adapter'; + +export default class FetchAdapter extends Adapter {} diff --git a/types/pollyjs__adapter-fetch/pollyjs__adapter-fetch-tests.ts b/types/pollyjs__adapter-fetch/pollyjs__adapter-fetch-tests.ts new file mode 100644 index 0000000000..61b8ef734d --- /dev/null +++ b/types/pollyjs__adapter-fetch/pollyjs__adapter-fetch-tests.ts @@ -0,0 +1,8 @@ +import FetchAdapter from '@pollyjs/adapter-fetch'; +import { Polly } from '@pollyjs/core'; + +Polly.register(FetchAdapter); + +new Polly('', { + adapters: ['xhr', FetchAdapter] +}); diff --git a/types/pollyjs__adapter-fetch/tsconfig.json b/types/pollyjs__adapter-fetch/tsconfig.json new file mode 100644 index 0000000000..03d3076b3c --- /dev/null +++ b/types/pollyjs__adapter-fetch/tsconfig.json @@ -0,0 +1,40 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true, + "paths": { + "@pollyjs/core": [ + "pollyjs__core" + ], + "@pollyjs/adapter": [ + "pollyjs__adapter" + ], + "@pollyjs/adapter-fetch": [ + "pollyjs__adapter-fetch" + ], + "@pollyjs/persister": [ + "pollyjs__persister" + ], + "@pollyjs/utils": [ + "pollyjs__utils" + ] + } + }, + "files": [ + "index.d.ts", + "pollyjs__adapter-fetch-tests.ts" + ] +} diff --git a/types/pollyjs__adapter-fetch/tslint.json b/types/pollyjs__adapter-fetch/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/pollyjs__adapter-fetch/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" } diff --git a/types/pollyjs__adapter/index.d.ts b/types/pollyjs__adapter/index.d.ts new file mode 100644 index 0000000000..b3810a67bb --- /dev/null +++ b/types/pollyjs__adapter/index.d.ts @@ -0,0 +1,10 @@ +// Type definitions for @pollyjs/adapter 1.2 +// Project: https://github.com/netflix/pollyjs/tree/master/packages/@pollyjs/adapter +// Definitions by: feinoujc +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +export default class Adapter { + static readonly name: string; + static readonly type: string; + connect(): void; + disconnect(): void; +} diff --git a/types/pollyjs__adapter/pollyjs__adapter-tests.ts b/types/pollyjs__adapter/pollyjs__adapter-tests.ts new file mode 100644 index 0000000000..1e5c82a586 --- /dev/null +++ b/types/pollyjs__adapter/pollyjs__adapter-tests.ts @@ -0,0 +1,4 @@ +import Adapter from '@pollyjs/adapter'; + +Adapter.name; +Adapter.type; diff --git a/types/pollyjs__adapter/tsconfig.json b/types/pollyjs__adapter/tsconfig.json new file mode 100644 index 0000000000..ad121d2d9d --- /dev/null +++ b/types/pollyjs__adapter/tsconfig.json @@ -0,0 +1,37 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true, + "paths": { + "@pollyjs/core": [ + "pollyjs__core" + ], + "@pollyjs/adapter": [ + "pollyjs__adapter" + ], + "@pollyjs/persister": [ + "pollyjs__persister" + ], + "@pollyjs/utils": [ + "pollyjs__utils" + ] + } + }, + "files": [ + "index.d.ts", + "pollyjs__adapter-tests.ts" + ] +} diff --git a/types/pollyjs__adapter/tslint.json b/types/pollyjs__adapter/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/pollyjs__adapter/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" } diff --git a/types/pollyjs__core/index.d.ts b/types/pollyjs__core/index.d.ts new file mode 100644 index 0000000000..83b6b933b9 --- /dev/null +++ b/types/pollyjs__core/index.d.ts @@ -0,0 +1,167 @@ +// Type definitions for @pollyjs/core 1.2 +// Project: https://github.com/netflix/pollyjs/tree/master/packages/@pollyjs/core +// Definitions by: feinoujc +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.4 + +import { MODES } from '@pollyjs/utils'; +import Adapter from '@pollyjs/adapter'; +import Persister from '@pollyjs/persister'; + +export const Timing: { + fixed(ms: number): () => Promise; + relative(ratio: number): (ms: number) => Promise; +}; +export interface PollyConfig { + mode?: MODES; + + adapters?: Array; + adapterOptions?: any; + + persister?: string | typeof Persister; + persisterOptions?: { + keepUnusedRequests?: boolean; + [key: string]: any; + }; + + logging?: boolean; + + recordIfMissing?: boolean; + recordIfExpired?: boolean; + recordFailedRequests?: boolean; + + expiresIn?: string | null; + timing?: ((ms: number) => Promise) | (() => Promise); + + matchRequestsBy?: { + method?: boolean; + headers?: any; + body?: boolean; + order?: boolean; + + url?: { + protocol?: boolean; + username?: boolean; + password?: boolean; + hostname?: boolean; + port?: boolean; + pathname?: boolean; + query?: boolean; + hash?: boolean; + }; + }; +} +export interface Request { + getHeader(name: string): string | null; + setHeader(name: string, value: string): Request; + setHeaders(headers: any): Request; + hasHeader(name: string): boolean; + type(contentType: string): Request; + send(body: any): Request; + json(body: any): Request; + jsonBody(): any; + + method: string; + url: string; + protocol: string; + hostname: string; + port: string; + pathname: string; + hash: string; + headers: Record; + body: any; + query: any; + params: any; + recordingName: string; + responseTime?: number; +} +export interface Response { + statusCode?: number; + headers: Record; + body: any; + status(status: number): Response; + getHeader(name: string): string | null; + setHeader(name: string, value: string): Response; + setHeaders(headers: any): Response; + hasHeader(name: string): boolean; + type(contentType: string): Response; + send(body: any): Response; + sendStatus(status: number): Response; + json(body: any): Response; + jsonBody(): any; + end(): Readonly; +} +export interface Intercept { + abort(): void; + passthrough(): void; +} +export type RequestRouteEvent = 'request'; +export type RecordingRouteEvent = 'beforeReplay' | 'beforePersist'; +export type ResponseRouteEvent = 'beforeResponse' | 'response'; + +export type EventListenerResponse = any; +export type RequestEventListener = (req: Request) => EventListenerResponse; +export type RecordingEventListener = (req: Request, recording: any) => EventListenerResponse; +export type ResponseEventListener = (req: Request, res: Response) => EventListenerResponse; +export type InterceptHandler = ( + req: Request, + res: Response, + intercept: Intercept +) => EventListenerResponse; +export class RouteHandler { + on(event: RequestRouteEvent, listener: RequestEventListener): RouteHandler; + on(event: RecordingRouteEvent, listener: RecordingEventListener): RouteHandler; + on(event: ResponseRouteEvent, listener: ResponseEventListener): RouteHandler; + off(event: RequestRouteEvent, listener: RequestEventListener): RouteHandler; + off(event: RecordingRouteEvent, listener: RecordingEventListener): RouteHandler; + off(event: ResponseRouteEvent, listener: ResponseEventListener): RouteHandler; + once(event: RequestRouteEvent, listener: RequestEventListener): RouteHandler; + once(event: RecordingRouteEvent, listener: RecordingEventListener): RouteHandler; + once(event: ResponseRouteEvent, listener: ResponseEventListener): RouteHandler; + + passthrough(value?: boolean): RouteHandler; + intercept( + fn: (req: Request, res: Response, intercept: Intercept) => EventListenerResponse + ): RouteHandler; + recordingName(recordingName: string): RouteHandler; + configure(config: PollyConfig): RouteHandler; +} +export class PollyServer { + timeout: (ms: number) => Promise; + get: (...args: any[]) => RouteHandler; + put: (...args: any[]) => RouteHandler; + post: (...args: any[]) => RouteHandler; + delete: (...args: any[]) => RouteHandler; + patch: (...args: any[]) => RouteHandler; + head: (...args: any[]) => RouteHandler; + options: (...args: any[]) => RouteHandler; + any: (...args: any[]) => RouteHandler; + host(host: string, callback: () => void): void; + namespace(path: string, callback: () => void): void; +} +export type PollyEvent = 'create' | 'stop' | 'register'; +export type PollyEventListener = (poll: Polly) => void; +export class Polly { + static register(Factory: typeof Adapter | typeof Persister): void; + static on(event: PollyEvent, listener: PollyEventListener): void; + static off(event: PollyEvent, listener: PollyEventListener): void; + static once(event: PollyEvent, listener: PollyEventListener): void; + + constructor(name: string, options?: PollyConfig); + + readonly recordingName: string | null; + mode: MODES; + server: PollyServer; + persister: Persister; + + pause: () => void; + play: () => void; + replay: () => void; + record: () => void; + stop: () => Promise; + flush: () => Promise; + configure(config: PollyConfig): void; + connectTo(name: string | typeof Adapter): void; + disconnectFrom(name: string | typeof Adapter): void; + disconnect(): void; +} diff --git a/types/pollyjs__core/pollyjs__core-tests.ts b/types/pollyjs__core/pollyjs__core-tests.ts new file mode 100644 index 0000000000..22f5516646 --- /dev/null +++ b/types/pollyjs__core/pollyjs__core-tests.ts @@ -0,0 +1,64 @@ +import { Polly, Timing } from '@pollyjs/core'; +import { MODES } from '@pollyjs/utils'; + +const polly = new Polly('test recording', { + mode: MODES.PASSTHROUGH, + recordFailedRequests: true, + adapters: ['xhr', 'fetch'], + persister: 'rest', + timing: Timing.relative(3) +}); + +function log(_: string) { + // no op +} + +async function test() { + polly.pause(); + polly.play(); + const { server } = polly; + server.get('/session').on('request', req => { + req.headers['X-AUTH'] = ''; + req.query.email = 'test@app.com'; + }); + server.get('/session').on('beforeResponse', (req, res) => { + res.setHeader('X-AUTH', ''); + }); + server.get('/session').on('response', (req, res) => { + log(`${req.url} took ${req.responseTime}ms with a status of ${res.statusCode}.`); + }); + + polly.configure({ + adapterOptions: { + fetch: { + context: null + } + } + }); + + server + .get('/session') + .once('request', req => { + req.headers['X-AUTH'] = ''; + req.query.email = 'test@app.com'; + }) + .once('request', () => { + /* Do something else */ + }); + + /* Intercept all Google Analytic requests and respond with a 200 */ + server.get('/google-analytics/*path').intercept((req, res, intercept) => { + if (req.pathname === 'test') { + intercept.abort(); + } else { + res.sendStatus(200); + } + }); + + /* Pass-through all GET requests to /coverage */ + server.get('/coverage') + .configure({ expiresIn: '5d' }) + .passthrough(); + + await polly.flush(); +} diff --git a/types/pollyjs__core/tsconfig.json b/types/pollyjs__core/tsconfig.json new file mode 100644 index 0000000000..4b91defc70 --- /dev/null +++ b/types/pollyjs__core/tsconfig.json @@ -0,0 +1,37 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true, + "paths": { + "@pollyjs/core": [ + "pollyjs__core" + ], + "@pollyjs/utils": [ + "pollyjs__utils" + ], + "@pollyjs/persister": [ + "pollyjs__persister" + ], + "@pollyjs/adapter": [ + "pollyjs__adapter" + ] + } + }, + "files": [ + "index.d.ts", + "pollyjs__core-tests.ts" + ] +} diff --git a/types/pollyjs__core/tslint.json b/types/pollyjs__core/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/pollyjs__core/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" } diff --git a/types/pollyjs__persister-fs/index.d.ts b/types/pollyjs__persister-fs/index.d.ts new file mode 100644 index 0000000000..3d97b382f7 --- /dev/null +++ b/types/pollyjs__persister-fs/index.d.ts @@ -0,0 +1,9 @@ +// Type definitions for @pollyjs/persister-fs 1.2 +// Project: https://github.com/netflix/pollyjs/tree/master/packages/@pollyjs/persister-fs +// Definitions by: feinoujc +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.4 + +import Persister from '@pollyjs/persister'; + +export default class FSPersister extends Persister {} diff --git a/types/pollyjs__persister-fs/pollyjs__persister-fs-tests.ts b/types/pollyjs__persister-fs/pollyjs__persister-fs-tests.ts new file mode 100644 index 0000000000..2d624a0f8d --- /dev/null +++ b/types/pollyjs__persister-fs/pollyjs__persister-fs-tests.ts @@ -0,0 +1,8 @@ +import FSPersister from '@pollyjs/persister-fs'; +import { Polly } from '@pollyjs/core'; + +Polly.register(FSPersister); + +new Polly('', { + persister: FSPersister +}); diff --git a/types/pollyjs__persister-fs/tsconfig.json b/types/pollyjs__persister-fs/tsconfig.json new file mode 100644 index 0000000000..7a7eb6733c --- /dev/null +++ b/types/pollyjs__persister-fs/tsconfig.json @@ -0,0 +1,41 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true, + "paths": { + "@pollyjs/persister": [ + "pollyjs__persister" + ], + "@pollyjs/persister-fs": [ + "pollyjs__persister-fs" + ], + "@pollyjs/core": [ + "pollyjs__core" + ], + "@pollyjs/utils": [ + "pollyjs__utils" + ], + "@pollyjs/adapter": [ + "pollyjs__adapter" + ] + } + + }, + "files": [ + "index.d.ts", + "pollyjs__persister-fs-tests.ts" + ] +} diff --git a/types/pollyjs__persister-fs/tslint.json b/types/pollyjs__persister-fs/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/pollyjs__persister-fs/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" } diff --git a/types/pollyjs__persister/index.d.ts b/types/pollyjs__persister/index.d.ts new file mode 100644 index 0000000000..45fc1fc250 --- /dev/null +++ b/types/pollyjs__persister/index.d.ts @@ -0,0 +1,10 @@ +// Type definitions for @pollyjs/persister 1.2 +// Project: https://github.com/netflix/pollyjs/tree/master/packages/@pollyjs/persister +// Definitions by: feinoujc +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +export default class Persister { + static readonly name: string; + static readonly type: string; + persist(): Promise; +} diff --git a/types/pollyjs__persister/pollyjs__persister-tests.ts b/types/pollyjs__persister/pollyjs__persister-tests.ts new file mode 100644 index 0000000000..7e9448aae0 --- /dev/null +++ b/types/pollyjs__persister/pollyjs__persister-tests.ts @@ -0,0 +1,4 @@ +import Persister from '@pollyjs/persister'; + +Persister.name; +Persister.type; diff --git a/types/pollyjs__persister/tsconfig.json b/types/pollyjs__persister/tsconfig.json new file mode 100644 index 0000000000..b47bfbaa9f --- /dev/null +++ b/types/pollyjs__persister/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true, + "paths": { + "@pollyjs/core": [ + "pollyjs__core" + ], + "@pollyjs/persister": [ + "pollyjs__persister" + ] + } + }, + "files": [ + "index.d.ts", + "pollyjs__persister-tests.ts" + ] +} diff --git a/types/pollyjs__persister/tslint.json b/types/pollyjs__persister/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/pollyjs__persister/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" } diff --git a/types/pollyjs__utils/index.d.ts b/types/pollyjs__utils/index.d.ts new file mode 100644 index 0000000000..e87392fcee --- /dev/null +++ b/types/pollyjs__utils/index.d.ts @@ -0,0 +1,12 @@ +// Type definitions for @pollyjs/utils 1.2 +// Project: https://github.com/netflix/pollyjs/tree/master/packages/@pollyjs/utils +// Definitions by: feinoujc +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.4 + +export enum MODES { + RECORD = 'record', + REPLAY = 'replay', + PASSTHROUGH = 'passthrough', + STOPPED = 'stopped' +} diff --git a/types/pollyjs__utils/pollyjs__utils-tests.ts b/types/pollyjs__utils/pollyjs__utils-tests.ts new file mode 100644 index 0000000000..463a4b4329 --- /dev/null +++ b/types/pollyjs__utils/pollyjs__utils-tests.ts @@ -0,0 +1,6 @@ +import { MODES } from '@pollyjs/utils'; + +MODES.PASSTHROUGH; +MODES.RECORD; +MODES.REPLAY; +MODES.STOPPED; diff --git a/types/pollyjs__utils/tsconfig.json b/types/pollyjs__utils/tsconfig.json new file mode 100644 index 0000000000..7b5421a32f --- /dev/null +++ b/types/pollyjs__utils/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true, + "paths": { + "@pollyjs/utils": [ + "pollyjs__utils" + ] + } + }, + "files": [ + "index.d.ts", + "pollyjs__utils-tests.ts" + ] +} diff --git a/types/pollyjs__utils/tslint.json b/types/pollyjs__utils/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/pollyjs__utils/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" }