types for @pollyjs monorepo

* @pollyjs/core
    * @pollyjs/utils
    * @pollyjs/adapter
    * @pollyjs/persister
    * @pollyjs/persister-fs
    * @pollyjs/adapter-fetch
This commit is contained in:
feinoujc 2018-11-15 19:18:21 -05:00
parent cff4ff4231
commit 891bb6ce5d
24 changed files with 531 additions and 0 deletions

View File

@ -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 <https://github.com/feinoujc>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// TypeScript Version: 2.4
import Adapter from '@pollyjs/adapter';
export default class FetchAdapter extends Adapter {}

View File

@ -0,0 +1,8 @@
import FetchAdapter from '@pollyjs/adapter-fetch';
import { Polly } from '@pollyjs/core';
Polly.register(FetchAdapter);
new Polly('<recording>', {
adapters: ['xhr', FetchAdapter]
});

View File

@ -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"
]
}

View File

@ -0,0 +1 @@
{ "extends": "dtslint/dt.json" }

10
types/pollyjs__adapter/index.d.ts vendored Normal file
View File

@ -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 <https://github.com/feinoujc>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
export default class Adapter {
static readonly name: string;
static readonly type: string;
connect(): void;
disconnect(): void;
}

View File

@ -0,0 +1,4 @@
import Adapter from '@pollyjs/adapter';
Adapter.name;
Adapter.type;

View File

@ -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"
]
}

View File

@ -0,0 +1 @@
{ "extends": "dtslint/dt.json" }

167
types/pollyjs__core/index.d.ts vendored Normal file
View File

@ -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 <https://github.com/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<void>;
relative(ratio: number): (ms: number) => Promise<void>;
};
export interface PollyConfig {
mode?: MODES;
adapters?: Array<string | typeof Adapter>;
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<void>) | (() => Promise<void>);
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<string, string>;
body: any;
query: any;
params: any;
recordingName: string;
responseTime?: number;
}
export interface Response {
statusCode?: number;
headers: Record<string, string>;
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<Response>;
}
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<void>;
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<void>;
flush: () => Promise<void>;
configure(config: PollyConfig): void;
connectTo(name: string | typeof Adapter): void;
disconnectFrom(name: string | typeof Adapter): void;
disconnect(): void;
}

View File

@ -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'] = '<ACCESS_TOKEN>';
req.query.email = 'test@app.com';
});
server.get('/session').on('beforeResponse', (req, res) => {
res.setHeader('X-AUTH', '<ACCESS_TOKEN>');
});
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'] = '<ACCESS_TOKEN>';
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();
}

View File

@ -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"
]
}

View File

@ -0,0 +1 @@
{ "extends": "dtslint/dt.json" }

View File

@ -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 <https://github.com/feinoujc>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// TypeScript Version: 2.4
import Persister from '@pollyjs/persister';
export default class FSPersister extends Persister {}

View File

@ -0,0 +1,8 @@
import FSPersister from '@pollyjs/persister-fs';
import { Polly } from '@pollyjs/core';
Polly.register(FSPersister);
new Polly('<recording>', {
persister: FSPersister
});

View File

@ -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"
]
}

View File

@ -0,0 +1 @@
{ "extends": "dtslint/dt.json" }

10
types/pollyjs__persister/index.d.ts vendored Normal file
View File

@ -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 <https://github.com/feinoujc>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
export default class Persister {
static readonly name: string;
static readonly type: string;
persist(): Promise<void>;
}

View File

@ -0,0 +1,4 @@
import Persister from '@pollyjs/persister';
Persister.name;
Persister.type;

View File

@ -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"
]
}

View File

@ -0,0 +1 @@
{ "extends": "dtslint/dt.json" }

12
types/pollyjs__utils/index.d.ts vendored Normal file
View File

@ -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 <https://github.com/feinoujc>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// TypeScript Version: 2.4
export enum MODES {
RECORD = 'record',
REPLAY = 'replay',
PASSTHROUGH = 'passthrough',
STOPPED = 'stopped'
}

View File

@ -0,0 +1,6 @@
import { MODES } from '@pollyjs/utils';
MODES.PASSTHROUGH;
MODES.RECORD;
MODES.REPLAY;
MODES.STOPPED;

View File

@ -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"
]
}

View File

@ -0,0 +1 @@
{ "extends": "dtslint/dt.json" }