1 | import { Iterable, AsyncIterable } from './utils/internal/isIterable.js';
|
2 | import { MaybePromise, NoInfer } from './typeUtils.js';
|
3 |
|
4 | interface HandlersExecutionResult {
|
5 | handler: RequestHandler;
|
6 | parsedResult?: any;
|
7 | response?: Response;
|
8 | }
|
9 | interface ResponseResolutionContext {
|
10 | baseUrl?: string;
|
11 | }
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 | declare 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 |
|
24 | type DefaultRequestMultipartBody = Record<string, string | File | Array<string | File>>;
|
25 | type DefaultBodyType = Record<string, any> | DefaultRequestMultipartBody | string | number | boolean | null | undefined;
|
26 | type JsonBodyType = Record<string, any> | string | number | boolean | null | undefined;
|
27 | interface RequestHandlerDefaultInfo {
|
28 | header: string;
|
29 | }
|
30 | interface RequestHandlerInternalInfo {
|
31 | callFrame?: string;
|
32 | }
|
33 | type ResponseResolverReturnType<ResponseBodyType extends DefaultBodyType = undefined> = ([ResponseBodyType] extends [undefined] ? Response : StrictResponse<ResponseBodyType>) | undefined | void;
|
34 | type MaybeAsyncResponseResolverReturnType<ResponseBodyType extends DefaultBodyType> = MaybePromise<ResponseResolverReturnType<ResponseBodyType>>;
|
35 | type AsyncResponseResolverReturnType<ResponseBodyType extends DefaultBodyType> = MaybePromise<ResponseResolverReturnType<ResponseBodyType> | Iterable<MaybeAsyncResponseResolverReturnType<ResponseBodyType>, MaybeAsyncResponseResolverReturnType<ResponseBodyType>, MaybeAsyncResponseResolverReturnType<ResponseBodyType>> | AsyncIterable<MaybeAsyncResponseResolverReturnType<ResponseBodyType>, MaybeAsyncResponseResolverReturnType<ResponseBodyType>, MaybeAsyncResponseResolverReturnType<ResponseBodyType>>>;
|
36 | type ResponseResolverInfo<ResolverExtraInfo extends Record<string, unknown>, RequestBodyType extends DefaultBodyType = DefaultBodyType> = {
|
37 | request: StrictRequest<RequestBodyType>;
|
38 | requestId: string;
|
39 | } & ResolverExtraInfo;
|
40 | type ResponseResolver<ResolverExtraInfo extends Record<string, unknown> = Record<string, unknown>, RequestBodyType extends DefaultBodyType = DefaultBodyType, ResponseBodyType extends DefaultBodyType = undefined> = (info: ResponseResolverInfo<ResolverExtraInfo, RequestBodyType>) => AsyncResponseResolverReturnType<ResponseBodyType>;
|
41 | interface RequestHandlerArgs<HandlerInfo, HandlerOptions extends RequestHandlerOptions> {
|
42 | info: HandlerInfo;
|
43 | resolver: ResponseResolver<any>;
|
44 | options?: HandlerOptions;
|
45 | }
|
46 | interface RequestHandlerOptions {
|
47 | once?: boolean;
|
48 | }
|
49 | interface RequestHandlerExecutionResult<ParsedResult extends Record<string, unknown> | undefined> {
|
50 | handler: RequestHandler;
|
51 | parsedResult?: ParsedResult;
|
52 | request: Request;
|
53 | requestId: string;
|
54 | response?: Response;
|
55 | }
|
56 | declare 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 |
|
62 |
|
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 |
|
123 | interface HttpResponseInit extends ResponseInit {
|
124 | type?: ResponseType;
|
125 | }
|
126 | declare const bodyType: unique symbol;
|
127 | interface StrictRequest<BodyType extends DefaultBodyType> extends Request {
|
128 | json(): Promise<BodyType>;
|
129 | }
|
130 |
|
131 |
|
132 |
|
133 | interface StrictResponse<BodyType extends DefaultBodyType> extends Response {
|
134 | readonly [bodyType]: BodyType;
|
135 | }
|
136 |
|
137 |
|
138 |
|
139 |
|
140 |
|
141 |
|
142 |
|
143 |
|
144 |
|
145 |
|
146 |
|
147 | declare 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 |
|
198 | export { 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 };
|