UNPKG

9.12 kBTypeScriptView Raw
1import { Iterable, AsyncIterable } from './utils/internal/isIterable.js';
2import { MaybePromise, NoInfer } from './typeUtils.js';
3
4interface HandlersExecutionResult {
5 handler: RequestHandler;
6 parsedResult?: any;
7 response?: Response;
8}
9interface ResponseResolutionContext {
10 baseUrl?: string;
11}
12/**
13 * Executes the list of request handlers against the given request.
14 * Returns the execution result object containing any matching request
15 * handler and any mocked response it returned.
16 */
17declare const executeHandlers: <Handlers extends Array<RequestHandler>>({ request, requestId, handlers, resolutionContext, }: {
18 request: Request;
19 requestId: string;
20 handlers: Handlers;
21 resolutionContext?: ResponseResolutionContext;
22}) => Promise<HandlersExecutionResult | null>;
23
24type DefaultRequestMultipartBody = Record<string, string | File | Array<string | File>>;
25type DefaultBodyType = Record<string, any> | DefaultRequestMultipartBody | string | number | boolean | null | undefined;
26type JsonBodyType = Record<string, any> | string | number | boolean | null | undefined;
27interface RequestHandlerDefaultInfo {
28 header: string;
29}
30interface RequestHandlerInternalInfo {
31 callFrame?: string;
32}
33type ResponseResolverReturnType<ResponseBodyType extends DefaultBodyType = undefined> = ([ResponseBodyType] extends [undefined] ? Response : StrictResponse<ResponseBodyType>) | undefined | void;
34type MaybeAsyncResponseResolverReturnType<ResponseBodyType extends DefaultBodyType> = MaybePromise<ResponseResolverReturnType<ResponseBodyType>>;
35type AsyncResponseResolverReturnType<ResponseBodyType extends DefaultBodyType> = MaybePromise<ResponseResolverReturnType<ResponseBodyType> | Iterable<MaybeAsyncResponseResolverReturnType<ResponseBodyType>, MaybeAsyncResponseResolverReturnType<ResponseBodyType>, MaybeAsyncResponseResolverReturnType<ResponseBodyType>> | AsyncIterable<MaybeAsyncResponseResolverReturnType<ResponseBodyType>, MaybeAsyncResponseResolverReturnType<ResponseBodyType>, MaybeAsyncResponseResolverReturnType<ResponseBodyType>>>;
36type ResponseResolverInfo<ResolverExtraInfo extends Record<string, unknown>, RequestBodyType extends DefaultBodyType = DefaultBodyType> = {
37 request: StrictRequest<RequestBodyType>;
38 requestId: string;
39} & ResolverExtraInfo;
40type ResponseResolver<ResolverExtraInfo extends Record<string, unknown> = Record<string, unknown>, RequestBodyType extends DefaultBodyType = DefaultBodyType, ResponseBodyType extends DefaultBodyType = undefined> = (info: ResponseResolverInfo<ResolverExtraInfo, RequestBodyType>) => AsyncResponseResolverReturnType<ResponseBodyType>;
41interface RequestHandlerArgs<HandlerInfo, HandlerOptions extends RequestHandlerOptions> {
42 info: HandlerInfo;
43 resolver: ResponseResolver<any>;
44 options?: HandlerOptions;
45}
46interface RequestHandlerOptions {
47 once?: boolean;
48}
49interface RequestHandlerExecutionResult<ParsedResult extends Record<string, unknown> | undefined> {
50 handler: RequestHandler;
51 parsedResult?: ParsedResult;
52 request: Request;
53 requestId: string;
54 response?: Response;
55}
56declare abstract class RequestHandler<HandlerInfo extends RequestHandlerDefaultInfo = RequestHandlerDefaultInfo, ParsedResult extends Record<string, any> | undefined = any, ResolverExtras extends Record<string, unknown> = any, HandlerOptions extends RequestHandlerOptions = RequestHandlerOptions> {
57 static cache: WeakMap<StrictRequest<DefaultBodyType>, StrictRequest<DefaultBodyType>>;
58 private readonly __kind;
59 info: HandlerInfo & RequestHandlerInternalInfo;
60 /**
61 * Indicates whether this request handler has been used
62 * (its resolver has successfully executed).
63 */
64 isUsed: boolean;
65 protected resolver: ResponseResolver<ResolverExtras, any, any>;
66 private resolverIterator?;
67 private resolverIteratorResult?;
68 private options?;
69 constructor(args: RequestHandlerArgs<HandlerInfo, HandlerOptions>);
70 /**
71 * Determine if the intercepted request should be mocked.
72 */
73 abstract predicate(args: {
74 request: Request;
75 parsedResult: ParsedResult;
76 resolutionContext?: ResponseResolutionContext;
77 }): boolean;
78 /**
79 * Print out the successfully handled request.
80 */
81 abstract log(args: {
82 request: Request;
83 response: Response;
84 parsedResult: ParsedResult;
85 }): void;
86 /**
87 * Parse the intercepted request to extract additional information from it.
88 * Parsed result is then exposed to other methods of this request handler.
89 */
90 parse(_args: {
91 request: Request;
92 resolutionContext?: ResponseResolutionContext;
93 }): Promise<ParsedResult>;
94 /**
95 * Test if this handler matches the given request.
96 *
97 * This method is not used internally but is exposed
98 * as a convenience method for consumers writing custom
99 * handlers.
100 */
101 test(args: {
102 request: Request;
103 resolutionContext?: ResponseResolutionContext;
104 }): Promise<boolean>;
105 protected extendResolverArgs(_args: {
106 request: Request;
107 parsedResult: ParsedResult;
108 }): ResolverExtras;
109 private cloneRequestOrGetFromCache;
110 /**
111 * Execute this request handler and produce a mocked response
112 * using the given resolver function.
113 */
114 run(args: {
115 request: StrictRequest<any>;
116 requestId: string;
117 resolutionContext?: ResponseResolutionContext;
118 }): Promise<RequestHandlerExecutionResult<ParsedResult> | null>;
119 private wrapResolver;
120 private createExecutionResult;
121}
122
123interface HttpResponseInit extends ResponseInit {
124 type?: ResponseType;
125}
126declare const bodyType: unique symbol;
127interface StrictRequest<BodyType extends DefaultBodyType> extends Request {
128 json(): Promise<BodyType>;
129}
130/**
131 * Opaque `Response` type that supports strict body type.
132 */
133interface StrictResponse<BodyType extends DefaultBodyType> extends Response {
134 readonly [bodyType]: BodyType;
135}
136/**
137 * A drop-in replacement for the standard `Response` class
138 * to allow additional features, like mocking the response `Set-Cookie` header.
139 *
140 * @example
141 * new HttpResponse('Hello world', { status: 201 })
142 * HttpResponse.json({ name: 'John' })
143 * HttpResponse.formData(form)
144 *
145 * @see {@link https://mswjs.io/docs/api/http-response `HttpResponse` API reference}
146 */
147declare class HttpResponse extends Response {
148 constructor(body?: BodyInit | null, init?: HttpResponseInit);
149 /**
150 * Create a `Response` with a `Content-Type: "text/plain"` body.
151 * @example
152 * HttpResponse.text('hello world')
153 * HttpResponse.text('Error', { status: 500 })
154 */
155 static text<BodyType extends string>(body?: NoInfer<BodyType> | null, init?: HttpResponseInit): StrictResponse<BodyType>;
156 /**
157 * Create a `Response` with a `Content-Type: "application/json"` body.
158 * @example
159 * HttpResponse.json({ firstName: 'John' })
160 * HttpResponse.json({ error: 'Not Authorized' }, { status: 401 })
161 */
162 static json<BodyType extends JsonBodyType>(body?: NoInfer<BodyType> | null, init?: HttpResponseInit): StrictResponse<BodyType>;
163 /**
164 * Create a `Response` with a `Content-Type: "application/xml"` body.
165 * @example
166 * HttpResponse.xml(`<user name="John" />`)
167 * HttpResponse.xml(`<article id="abc-123" />`, { status: 201 })
168 */
169 static xml<BodyType extends string>(body?: BodyType | null, init?: HttpResponseInit): Response;
170 /**
171 * Create a `Response` with a `Content-Type: "text/html"` body.
172 * @example
173 * HttpResponse.html(`<p class="author">Jane Doe</p>`)
174 * HttpResponse.html(`<main id="abc-123">Main text</main>`, { status: 201 })
175 */
176 static html<BodyType extends string>(body?: BodyType | null, init?: HttpResponseInit): Response;
177 /**
178 * Create a `Response` with an `ArrayBuffer` body.
179 * @example
180 * const buffer = new ArrayBuffer(3)
181 * const view = new Uint8Array(buffer)
182 * view.set([1, 2, 3])
183 *
184 * HttpResponse.arrayBuffer(buffer)
185 */
186 static arrayBuffer(body?: ArrayBuffer | SharedArrayBuffer, init?: HttpResponseInit): Response;
187 /**
188 * Create a `Response` with a `FormData` body.
189 * @example
190 * const data = new FormData()
191 * data.set('name', 'Alice')
192 *
193 * HttpResponse.formData(data)
194 */
195 static formData(body?: FormData, init?: HttpResponseInit): Response;
196}
197
198export { type AsyncResponseResolverReturnType as A, type DefaultBodyType as D, type HttpResponseInit as H, type JsonBodyType as J, type MaybeAsyncResponseResolverReturnType as M, RequestHandler as R, type StrictRequest as S, type ResponseResolver as a, type ResponseResolverReturnType as b, type RequestHandlerOptions as c, type DefaultRequestMultipartBody as d, type StrictResponse as e, HttpResponse as f, type RequestHandlerDefaultInfo as g, type ResponseResolutionContext as h, type HandlersExecutionResult as i, executeHandlers as j, type RequestHandlerInternalInfo as k, type ResponseResolverInfo as l, type RequestHandlerArgs as m, type RequestHandlerExecutionResult as n };