msw 0.0.0-fetch.rc-23 → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -28
- package/cli/init.js +3 -3
- package/config/constants.js +2 -1
- package/config/scripts/postinstall.js +0 -0
- package/lib/SetupServerApi-1855d9c6.d.ts +20 -0
- package/lib/glossary-de6278a9.d.ts +385 -0
- package/lib/iife/index.js +13605 -7448
- package/lib/iife/index.js.map +1 -0
- package/lib/index.d.ts +365 -0
- package/lib/index.js +2295 -0
- package/lib/index.js.map +1 -0
- package/lib/mockServiceWorker.js +93 -82
- package/lib/native/index.d.ts +7 -67
- package/lib/native/index.js +1504 -63
- package/lib/native/index.mjs +1518 -58
- package/lib/node/index.d.ts +9 -68
- package/lib/node/index.js +1512 -66
- package/lib/node/index.js.map +1 -0
- package/lib/node/index.mjs +1524 -59
- package/lib/node/index.mjs.map +1 -0
- package/native/package.json +1 -2
- package/node/package.json +1 -2
- package/package.json +35 -67
- package/browser/package.json +0 -5
- package/lib/browser/index.d.ts +0 -104
- package/lib/browser/index.js +0 -751
- package/lib/browser/index.mjs +0 -733
- package/lib/core/GraphQLHandler-a441dd03.d.ts +0 -74
- package/lib/core/HttpResponse.d.ts +0 -2
- package/lib/core/HttpResponse.js +0 -94
- package/lib/core/HttpResponse.mjs +0 -77
- package/lib/core/RequestHandler-b59044ae.d.ts +0 -172
- package/lib/core/SetupApi.d.ts +0 -26
- package/lib/core/SetupApi.js +0 -83
- package/lib/core/SetupApi.mjs +0 -63
- package/lib/core/bypass.d.ts +0 -16
- package/lib/core/bypass.js +0 -36
- package/lib/core/bypass.mjs +0 -16
- package/lib/core/delay.d.ts +0 -18
- package/lib/core/delay.js +0 -92
- package/lib/core/delay.mjs +0 -72
- package/lib/core/graphql.d.ts +0 -109
- package/lib/core/graphql.js +0 -112
- package/lib/core/graphql.mjs +0 -96
- package/lib/core/handlers/GraphQLHandler.d.ts +0 -5
- package/lib/core/handlers/GraphQLHandler.js +0 -145
- package/lib/core/handlers/GraphQLHandler.mjs +0 -130
- package/lib/core/handlers/HttpHandler.d.ts +0 -62
- package/lib/core/handlers/HttpHandler.js +0 -149
- package/lib/core/handlers/HttpHandler.mjs +0 -133
- package/lib/core/handlers/RequestHandler.d.ts +0 -2
- package/lib/core/handlers/RequestHandler.js +0 -180
- package/lib/core/handlers/RequestHandler.mjs +0 -162
- package/lib/core/http.d.ts +0 -26
- package/lib/core/http.js +0 -39
- package/lib/core/http.mjs +0 -22
- package/lib/core/http.spec.d.ts +0 -2
- package/lib/core/http.spec.js +0 -15
- package/lib/core/http.spec.mjs +0 -14
- package/lib/core/index.d.ts +0 -18
- package/lib/core/index.js +0 -49
- package/lib/core/index.mjs +0 -28
- package/lib/core/passthrough.d.ts +0 -17
- package/lib/core/passthrough.js +0 -32
- package/lib/core/passthrough.mjs +0 -12
- package/lib/core/sharedOptions.d.ts +0 -66
- package/lib/core/sharedOptions.js +0 -16
- package/lib/core/sharedOptions.mjs +0 -0
- package/lib/core/typeUtils.d.ts +0 -7
- package/lib/core/typeUtils.js +0 -16
- package/lib/core/typeUtils.mjs +0 -0
- package/lib/core/utils/HttpResponse/decorators.d.ts +0 -12
- package/lib/core/utils/HttpResponse/decorators.js +0 -80
- package/lib/core/utils/HttpResponse/decorators.mjs +0 -52
- package/lib/core/utils/getResponse.d.ts +0 -2
- package/lib/core/utils/getResponse.js +0 -64
- package/lib/core/utils/getResponse.mjs +0 -44
- package/lib/core/utils/handleRequest.d.ts +0 -30
- package/lib/core/utils/handleRequest.js +0 -102
- package/lib/core/utils/handleRequest.mjs +0 -82
- package/lib/core/utils/internal/Disposable.d.ts +0 -7
- package/lib/core/utils/internal/Disposable.js +0 -53
- package/lib/core/utils/internal/Disposable.mjs +0 -33
- package/lib/core/utils/internal/checkGlobals.d.ts +0 -3
- package/lib/core/utils/internal/checkGlobals.js +0 -33
- package/lib/core/utils/internal/checkGlobals.mjs +0 -13
- package/lib/core/utils/internal/devUtils.d.ts +0 -19
- package/lib/core/utils/internal/devUtils.js +0 -40
- package/lib/core/utils/internal/devUtils.mjs +0 -20
- package/lib/core/utils/internal/getCallFrame.d.ts +0 -6
- package/lib/core/utils/internal/getCallFrame.js +0 -40
- package/lib/core/utils/internal/getCallFrame.mjs +0 -20
- package/lib/core/utils/internal/isIterable.d.ts +0 -6
- package/lib/core/utils/internal/isIterable.js +0 -29
- package/lib/core/utils/internal/isIterable.mjs +0 -9
- package/lib/core/utils/internal/isObject.d.ts +0 -6
- package/lib/core/utils/internal/isObject.js +0 -26
- package/lib/core/utils/internal/isObject.mjs +0 -6
- package/lib/core/utils/internal/isStringEqual.d.ts +0 -6
- package/lib/core/utils/internal/isStringEqual.js +0 -26
- package/lib/core/utils/internal/isStringEqual.mjs +0 -6
- package/lib/core/utils/internal/jsonParse.d.ts +0 -7
- package/lib/core/utils/internal/jsonParse.js +0 -30
- package/lib/core/utils/internal/jsonParse.mjs +0 -10
- package/lib/core/utils/internal/mergeRight.d.ts +0 -7
- package/lib/core/utils/internal/mergeRight.js +0 -39
- package/lib/core/utils/internal/mergeRight.mjs +0 -19
- package/lib/core/utils/internal/parseGraphQLRequest.d.ts +0 -5
- package/lib/core/utils/internal/parseGraphQLRequest.js +0 -184
- package/lib/core/utils/internal/parseGraphQLRequest.mjs +0 -165
- package/lib/core/utils/internal/parseMultipartData.d.ts +0 -10
- package/lib/core/utils/internal/parseMultipartData.js +0 -81
- package/lib/core/utils/internal/parseMultipartData.mjs +0 -61
- package/lib/core/utils/internal/pipeEvents.d.ts +0 -8
- package/lib/core/utils/internal/pipeEvents.js +0 -34
- package/lib/core/utils/internal/pipeEvents.mjs +0 -14
- package/lib/core/utils/internal/requestHandlerUtils.d.ts +0 -8
- package/lib/core/utils/internal/requestHandlerUtils.js +0 -36
- package/lib/core/utils/internal/requestHandlerUtils.mjs +0 -16
- package/lib/core/utils/internal/toReadonlyArray.d.ts +0 -6
- package/lib/core/utils/internal/toReadonlyArray.js +0 -28
- package/lib/core/utils/internal/toReadonlyArray.mjs +0 -8
- package/lib/core/utils/internal/tryCatch.d.ts +0 -3
- package/lib/core/utils/internal/tryCatch.js +0 -31
- package/lib/core/utils/internal/tryCatch.mjs +0 -11
- package/lib/core/utils/internal/uuidv4.d.ts +0 -3
- package/lib/core/utils/internal/uuidv4.js +0 -26
- package/lib/core/utils/internal/uuidv4.mjs +0 -6
- package/lib/core/utils/logging/getStatusCodeColor.d.ts +0 -11
- package/lib/core/utils/logging/getStatusCodeColor.js +0 -39
- package/lib/core/utils/logging/getStatusCodeColor.mjs +0 -19
- package/lib/core/utils/logging/getTimestamp.d.ts +0 -6
- package/lib/core/utils/logging/getTimestamp.js +0 -27
- package/lib/core/utils/logging/getTimestamp.mjs +0 -7
- package/lib/core/utils/logging/serializeRequest.d.ts +0 -12
- package/lib/core/utils/logging/serializeRequest.js +0 -55
- package/lib/core/utils/logging/serializeRequest.mjs +0 -35
- package/lib/core/utils/logging/serializeResponse.d.ts +0 -9
- package/lib/core/utils/logging/serializeResponse.js +0 -69
- package/lib/core/utils/logging/serializeResponse.mjs +0 -39
- package/lib/core/utils/matching/matchRequestUrl.d.ts +0 -19
- package/lib/core/utils/matching/matchRequestUrl.js +0 -50
- package/lib/core/utils/matching/matchRequestUrl.mjs +0 -30
- package/lib/core/utils/matching/normalizePath.d.ts +0 -12
- package/lib/core/utils/matching/normalizePath.js +0 -32
- package/lib/core/utils/matching/normalizePath.mjs +0 -12
- package/lib/core/utils/request/getPublicUrlFromRequest.d.ts +0 -7
- package/lib/core/utils/request/getPublicUrlFromRequest.js +0 -30
- package/lib/core/utils/request/getPublicUrlFromRequest.mjs +0 -10
- package/lib/core/utils/request/getRequestCookies.d.ts +0 -8
- package/lib/core/utils/request/getRequestCookies.js +0 -88
- package/lib/core/utils/request/getRequestCookies.mjs +0 -60
- package/lib/core/utils/request/onUnhandledRequest.d.ts +0 -12
- package/lib/core/utils/request/onUnhandledRequest.js +0 -193
- package/lib/core/utils/request/onUnhandledRequest.mjs +0 -165
- package/lib/core/utils/request/readResponseCookies.d.ts +0 -3
- package/lib/core/utils/request/readResponseCookies.js +0 -45
- package/lib/core/utils/request/readResponseCookies.mjs +0 -27
- package/lib/core/utils/toResponseInit.d.ts +0 -3
- package/lib/core/utils/toResponseInit.js +0 -30
- package/lib/core/utils/toResponseInit.mjs +0 -10
- package/lib/core/utils/url/cleanUrl.d.ts +0 -7
- package/lib/core/utils/url/cleanUrl.js +0 -31
- package/lib/core/utils/url/cleanUrl.mjs +0 -11
- package/lib/core/utils/url/getAbsoluteUrl.d.ts +0 -6
- package/lib/core/utils/url/getAbsoluteUrl.js +0 -37
- package/lib/core/utils/url/getAbsoluteUrl.mjs +0 -17
- package/lib/core/utils/url/isAbsoluteUrl.d.ts +0 -6
- package/lib/core/utils/url/isAbsoluteUrl.js +0 -26
- package/lib/core/utils/url/isAbsoluteUrl.mjs +0 -6
package/README.md
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
> [!IMPORTANT]\
|
|
2
|
-
> **MSW 2.0 is finally here! 🎉** Read the [Release notes](https://github.com/mswjs/msw/releases/tag/v2.0.0) and please follow the [**Migration guidelines**](https://mswjs.io/docs/migrations/1.x-to-2.x) to upgrade. If you're having any questions while upgrading, please reach out in our [Discord server](https://discord.gg/z29WbnfDC5).
|
|
3
|
-
|
|
4
1
|
<br />
|
|
5
2
|
|
|
6
3
|
<p align="center">
|
|
@@ -28,7 +25,7 @@
|
|
|
28
25
|
|
|
29
26
|
- **Seamless**. A dedicated layer of requests interception at your disposal. Keep your application's code and tests unaware of whether something is mocked or not.
|
|
30
27
|
- **Deviation-free**. Request the same production resources and test the actual behavior of your app. Augment an existing API, or design it as you go when there is none.
|
|
31
|
-
- **Familiar & Powerful**. Use [Express](https://github.com/expressjs/express)-like routing syntax to
|
|
28
|
+
- **Familiar & Powerful**. Use [Express](https://github.com/expressjs/express)-like routing syntax to capture requests. Use parameters, wildcards, and regular expressions to match requests, and respond with necessary status codes, headers, cookies, delays, or completely custom resolvers.
|
|
32
29
|
|
|
33
30
|
---
|
|
34
31
|
|
|
@@ -56,7 +53,7 @@ This README will give you a brief overview on the library but there's no better
|
|
|
56
53
|
|
|
57
54
|
### How does it work?
|
|
58
55
|
|
|
59
|
-
In-browser usage is what sets Mock Service Worker apart from other tools. Utilizing the [Service Worker API](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API), which can intercept requests for the purpose of caching, Mock Service Worker responds to
|
|
56
|
+
In-browser usage is what sets Mock Service Worker apart from other tools. Utilizing the [Service Worker API](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API), which can intercept requests for the purpose of caching, Mock Service Worker responds to captured requests with your mock definition on the network level. This way your application knows nothing about the mocking.
|
|
60
57
|
|
|
61
58
|
**Take a look at this quick presentation on how Mock Service Worker functions in a browser:**
|
|
62
59
|
|
|
@@ -74,20 +71,17 @@ In-browser usage is what sets Mock Service Worker apart from other tools. Utiliz
|
|
|
74
71
|
```js
|
|
75
72
|
// src/mocks.js
|
|
76
73
|
// 1. Import the library.
|
|
77
|
-
import {
|
|
78
|
-
import { setupWorker } from 'msw/browser'
|
|
74
|
+
import { setupWorker, rest } from 'msw'
|
|
79
75
|
|
|
80
76
|
// 2. Describe network behavior with request handlers.
|
|
81
77
|
const worker = setupWorker(
|
|
82
|
-
|
|
83
|
-
return
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
statusText: 'Mocked status',
|
|
90
|
-
},
|
|
78
|
+
rest.get('https://github.com/octocat', (req, res, ctx) => {
|
|
79
|
+
return res(
|
|
80
|
+
ctx.delay(1500),
|
|
81
|
+
ctx.status(202, 'Mocked status'),
|
|
82
|
+
ctx.json({
|
|
83
|
+
message: 'Mocked response JSON body',
|
|
84
|
+
}),
|
|
91
85
|
)
|
|
92
86
|
}),
|
|
93
87
|
)
|
|
@@ -124,7 +118,7 @@ Take a look at the example of an integration test in Jest that uses [React Testi
|
|
|
124
118
|
// test/Dashboard.test.js
|
|
125
119
|
|
|
126
120
|
import React from 'react'
|
|
127
|
-
import {
|
|
121
|
+
import { rest } from 'msw'
|
|
128
122
|
import { setupServer } from 'msw/node'
|
|
129
123
|
import { render, screen, waitFor } from '@testing-library/react'
|
|
130
124
|
import Dashboard from '../src/components/Dashboard'
|
|
@@ -133,17 +127,19 @@ const server = setupServer(
|
|
|
133
127
|
// Describe network behavior with request handlers.
|
|
134
128
|
// Tip: move the handlers into their own module and
|
|
135
129
|
// import it across your browser and Node.js setups!
|
|
136
|
-
|
|
137
|
-
return
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
130
|
+
rest.get('/posts', (req, res, ctx) => {
|
|
131
|
+
return res(
|
|
132
|
+
ctx.json([
|
|
133
|
+
{
|
|
134
|
+
id: 'f8dd058f-9006-4174-8d49-e3086bc39c21',
|
|
135
|
+
title: `Avoid Nesting When You're Testing`,
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
id: '8ac96078-6434-4959-80ed-cc834e7fef61',
|
|
139
|
+
title: `How I Built A Modern Website In 2021`,
|
|
140
|
+
},
|
|
141
|
+
]),
|
|
142
|
+
)
|
|
147
143
|
}),
|
|
148
144
|
)
|
|
149
145
|
|
package/cli/init.js
CHANGED
|
@@ -21,14 +21,14 @@ module.exports = async function init(args) {
|
|
|
21
21
|
|
|
22
22
|
if (!dirExists) {
|
|
23
23
|
// Try to create the directory if it doesn't exist
|
|
24
|
-
const
|
|
24
|
+
const [createDirectoryError] = await until(() =>
|
|
25
25
|
fs.promises.mkdir(absolutePublicDir, { recursive: true }),
|
|
26
26
|
)
|
|
27
27
|
invariant(
|
|
28
|
-
|
|
28
|
+
createDirectoryError == null,
|
|
29
29
|
'Failed to create a Service Worker at "%s": directory does not exist and could not be created.\nMake sure to include a relative path to the root directory of your server.\n\nSee the original error below:\n%s',
|
|
30
30
|
absolutePublicDir,
|
|
31
|
-
|
|
31
|
+
createDirectoryError,
|
|
32
32
|
)
|
|
33
33
|
}
|
|
34
34
|
|
package/config/constants.js
CHANGED
|
File without changes
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { IsomorphicResponse, BatchInterceptor, Interceptor, HttpRequestEventMap } from '@mswjs/interceptors';
|
|
2
|
+
import { L as LifeCycleEventsMap, S as SetupApi, K as SetupServer, c as RequestHandler, o as SharedOptions } from './glossary-de6278a9.js';
|
|
3
|
+
|
|
4
|
+
type ServerLifecycleEventsMap = LifeCycleEventsMap<IsomorphicResponse>;
|
|
5
|
+
declare class SetupServerApi extends SetupApi<ServerLifecycleEventsMap> implements SetupServer {
|
|
6
|
+
protected readonly interceptor: BatchInterceptor<Array<Interceptor<HttpRequestEventMap>>, HttpRequestEventMap>;
|
|
7
|
+
private resolvedOptions;
|
|
8
|
+
constructor(interceptors: Array<{
|
|
9
|
+
new (): Interceptor<HttpRequestEventMap>;
|
|
10
|
+
}>, ...handlers: Array<RequestHandler>);
|
|
11
|
+
/**
|
|
12
|
+
* Subscribe to all requests that are using the interceptor object
|
|
13
|
+
*/
|
|
14
|
+
private init;
|
|
15
|
+
listen(options?: Partial<SharedOptions>): void;
|
|
16
|
+
printHandlers(): void;
|
|
17
|
+
close(): void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export { ServerLifecycleEventsMap as S, SetupServerApi as a };
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
import { Emitter, EventMap } from 'strict-event-emitter';
|
|
2
|
+
import { PartialDeep } from 'type-fest';
|
|
3
|
+
import { RequestInit as RequestInit$1, IsomorphicRequest, IsomorphicResponse } from '@mswjs/interceptors';
|
|
4
|
+
import { FlatHeadersObject, Headers } from 'headers-polyfill';
|
|
5
|
+
|
|
6
|
+
type HeadersObject<KeyType extends string = string> = Record<KeyType, string | string[]>;
|
|
7
|
+
/**
|
|
8
|
+
* @see https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name
|
|
9
|
+
*/
|
|
10
|
+
type ForbiddenHeaderNames = 'cookie' | 'cookie2' | 'set-cookie' | 'set-cookie2';
|
|
11
|
+
type ForbiddenHeaderError<HeaderName extends string> = `SafeResponseHeader: the '${HeaderName}' header cannot be set on the response. Please use the 'ctx.cookie()' function instead.`;
|
|
12
|
+
/**
|
|
13
|
+
* Sets one or multiple response headers.
|
|
14
|
+
* @example
|
|
15
|
+
* ctx.set('Content-Type', 'text/plain')
|
|
16
|
+
* ctx.set({
|
|
17
|
+
* 'Accept': 'application/javascript',
|
|
18
|
+
* 'Content-Type': "text/plain"
|
|
19
|
+
* })
|
|
20
|
+
* @see {@link https://mswjs.io/docs/api/context/set `ctx.set()`}
|
|
21
|
+
*/
|
|
22
|
+
declare function set<N extends string | HeadersObject>(...args: N extends string ? Lowercase<N> extends ForbiddenHeaderNames ? [ForbiddenHeaderError<N>] : [N, string] : N extends HeadersObject<infer CookieName> ? Lowercase<CookieName> extends ForbiddenHeaderNames ? [ForbiddenHeaderError<CookieName>] : [N] : [N]): ResponseTransformer;
|
|
23
|
+
|
|
24
|
+
type DelayMode = 'real' | 'infinite';
|
|
25
|
+
/**
|
|
26
|
+
* Delays the response by the given duration (ms).
|
|
27
|
+
* @example
|
|
28
|
+
* res(ctx.delay(1200)) // delay response by 1200ms
|
|
29
|
+
* res(ctx.delay()) // emulate realistic server response time
|
|
30
|
+
* res(ctx.delay('infinite')) // delay response infinitely
|
|
31
|
+
* @see {@link https://mswjs.io/docs/api/context/delay `ctx.delay()`}
|
|
32
|
+
*/
|
|
33
|
+
declare const delay: (durationOrMode?: DelayMode | number) => ResponseTransformer;
|
|
34
|
+
|
|
35
|
+
type RequestCache = 'default' | 'no-store' | 'reload' | 'no-cache' | 'force-cache' | 'only-if-cached';
|
|
36
|
+
type RequestMode = 'navigate' | 'same-origin' | 'no-cors' | 'cors';
|
|
37
|
+
type RequestRedirect = 'follow' | 'error' | 'manual';
|
|
38
|
+
type RequestDestination = '' | 'audio' | 'audioworklet' | 'document' | 'embed' | 'font' | 'frame' | 'iframe' | 'image' | 'manifest' | 'object' | 'paintworklet' | 'report' | 'script' | 'sharedworker' | 'style' | 'track' | 'video' | 'xslt' | 'worker';
|
|
39
|
+
type RequestPriority = 'high' | 'low' | 'auto';
|
|
40
|
+
type RequestReferrerPolicy = '' | 'no-referrer' | 'no-referrer-when-downgrade' | 'origin' | 'origin-when-cross-origin' | 'same-origin' | 'strict-origin' | 'strict-origin-when-cross-origin' | 'unsafe-url';
|
|
41
|
+
interface MockedRequestInit extends RequestInit$1 {
|
|
42
|
+
id?: string;
|
|
43
|
+
cache?: RequestCache;
|
|
44
|
+
redirect?: RequestRedirect;
|
|
45
|
+
integrity?: string;
|
|
46
|
+
keepalive?: boolean;
|
|
47
|
+
mode?: RequestMode;
|
|
48
|
+
priority?: RequestPriority;
|
|
49
|
+
destination?: RequestDestination;
|
|
50
|
+
referrer?: string;
|
|
51
|
+
referrerPolicy?: RequestReferrerPolicy;
|
|
52
|
+
cookies?: Record<string, string>;
|
|
53
|
+
}
|
|
54
|
+
declare class MockedRequest<RequestBody extends DefaultBodyType = DefaultBodyType> extends IsomorphicRequest {
|
|
55
|
+
readonly cache: RequestCache;
|
|
56
|
+
readonly cookies: Record<string, string>;
|
|
57
|
+
readonly destination: RequestDestination;
|
|
58
|
+
readonly integrity: string;
|
|
59
|
+
readonly keepalive: boolean;
|
|
60
|
+
readonly mode: RequestMode;
|
|
61
|
+
readonly priority: RequestPriority;
|
|
62
|
+
readonly redirect: RequestRedirect;
|
|
63
|
+
readonly referrer: string;
|
|
64
|
+
readonly referrerPolicy: RequestReferrerPolicy;
|
|
65
|
+
constructor(url: URL, init?: MockedRequestInit);
|
|
66
|
+
/**
|
|
67
|
+
* Get parsed request body. The type is inferred from the content type.
|
|
68
|
+
*
|
|
69
|
+
* @deprecated - Use `req.text()`, `req.json()` or `req.arrayBuffer()`
|
|
70
|
+
* to read the request body as a plain text, JSON, or ArrayBuffer.
|
|
71
|
+
*/
|
|
72
|
+
get body(): RequestBody;
|
|
73
|
+
/**
|
|
74
|
+
* Bypass the intercepted request.
|
|
75
|
+
* This will make a call to the actual endpoint requested.
|
|
76
|
+
*/
|
|
77
|
+
passthrough(): MockedResponse<null>;
|
|
78
|
+
private getCookies;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Performs a bypassed request inside a request handler.
|
|
83
|
+
* @example
|
|
84
|
+
* const originalResponse = await ctx.fetch(req)
|
|
85
|
+
* @see {@link https://mswjs.io/docs/api/context/fetch `ctx.fetch()`}
|
|
86
|
+
*/
|
|
87
|
+
declare const fetch: (input: string | MockedRequest, requestInit?: RequestInit) => Promise<Response>;
|
|
88
|
+
|
|
89
|
+
interface ResponseLookupResult {
|
|
90
|
+
handler?: RequestHandler;
|
|
91
|
+
publicRequest?: any;
|
|
92
|
+
parsedRequest?: any;
|
|
93
|
+
response?: MockedResponse;
|
|
94
|
+
}
|
|
95
|
+
interface ResponseResolutionContext {
|
|
96
|
+
baseUrl?: string;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
interface UnhandledRequestPrint {
|
|
100
|
+
warning(): void;
|
|
101
|
+
error(): void;
|
|
102
|
+
}
|
|
103
|
+
type UnhandledRequestCallback = (request: MockedRequest, print: UnhandledRequestPrint) => void;
|
|
104
|
+
type UnhandledRequestStrategy = 'bypass' | 'warn' | 'error' | UnhandledRequestCallback;
|
|
105
|
+
|
|
106
|
+
interface SharedOptions {
|
|
107
|
+
/**
|
|
108
|
+
* Specifies how to react to a request that has no corresponding
|
|
109
|
+
* request handler. Warns on unhandled requests by default.
|
|
110
|
+
*
|
|
111
|
+
* @example worker.start({ onUnhandledRequest: 'bypass' })
|
|
112
|
+
* @example worker.start({ onUnhandledRequest: 'warn' })
|
|
113
|
+
* @example server.listen({ onUnhandledRequest: 'error' })
|
|
114
|
+
*/
|
|
115
|
+
onUnhandledRequest?: UnhandledRequestStrategy;
|
|
116
|
+
}
|
|
117
|
+
interface LifeCycleEventsMap<ResponseType> {
|
|
118
|
+
'request:start': [MockedRequest];
|
|
119
|
+
'request:match': [MockedRequest];
|
|
120
|
+
'request:unhandled': [MockedRequest];
|
|
121
|
+
'request:end': [MockedRequest];
|
|
122
|
+
'response:mocked': [response: ResponseType, requestId: string];
|
|
123
|
+
'response:bypass': [response: ResponseType, requestId: string];
|
|
124
|
+
unhandledException: [error: Error, request: MockedRequest];
|
|
125
|
+
[key: string]: Array<unknown>;
|
|
126
|
+
}
|
|
127
|
+
type LifeCycleEventEmitter<ResponseType extends Record<string | symbol, any>> = Pick<Emitter<ResponseType>, 'on' | 'removeListener' | 'removeAllListeners'>;
|
|
128
|
+
|
|
129
|
+
type WorkerLifecycleEventsMap = LifeCycleEventsMap<Response>;
|
|
130
|
+
type FindWorker = (scriptUrl: string, mockServiceWorkerUrl: string) => boolean;
|
|
131
|
+
interface StartOptions extends SharedOptions {
|
|
132
|
+
/**
|
|
133
|
+
* Service Worker registration options.
|
|
134
|
+
*/
|
|
135
|
+
serviceWorker?: {
|
|
136
|
+
/**
|
|
137
|
+
* Custom url to the worker script.
|
|
138
|
+
* @default "/mockServiceWorker.js"
|
|
139
|
+
*/
|
|
140
|
+
url?: string;
|
|
141
|
+
options?: RegistrationOptions;
|
|
142
|
+
};
|
|
143
|
+
/**
|
|
144
|
+
* Disables the logging of captured requests
|
|
145
|
+
* into browser's console.
|
|
146
|
+
* @default false
|
|
147
|
+
*/
|
|
148
|
+
quiet?: boolean;
|
|
149
|
+
/**
|
|
150
|
+
* Defers any network requests until the Service Worker
|
|
151
|
+
* instance is activated.
|
|
152
|
+
* @default true
|
|
153
|
+
*/
|
|
154
|
+
waitUntilReady?: boolean;
|
|
155
|
+
/**
|
|
156
|
+
* A custom lookup function to find a Mock Service Worker in the list
|
|
157
|
+
* of all registered Service Workers on the page.
|
|
158
|
+
*/
|
|
159
|
+
findWorker?: FindWorker;
|
|
160
|
+
}
|
|
161
|
+
interface SerializedResponse<BodyType extends DefaultBodyType = any> {
|
|
162
|
+
status: number;
|
|
163
|
+
statusText: string;
|
|
164
|
+
headers: FlatHeadersObject;
|
|
165
|
+
body: BodyType;
|
|
166
|
+
delay?: number;
|
|
167
|
+
}
|
|
168
|
+
type StartReturnType = Promise<ServiceWorkerRegistration | undefined>;
|
|
169
|
+
type StopHandler = () => void;
|
|
170
|
+
interface SetupWorker {
|
|
171
|
+
/**
|
|
172
|
+
* Registers and activates the mock Service Worker.
|
|
173
|
+
* @see {@link https://mswjs.io/docs/api/setup-worker/start `worker.start()`}
|
|
174
|
+
*/
|
|
175
|
+
start: (options?: StartOptions) => StartReturnType;
|
|
176
|
+
/**
|
|
177
|
+
* Stops requests interception for the current client.
|
|
178
|
+
* @see {@link https://mswjs.io/docs/api/setup-worker/stop `worker.stop()`}
|
|
179
|
+
*/
|
|
180
|
+
stop: StopHandler;
|
|
181
|
+
/**
|
|
182
|
+
* Prepends given request handlers to the list of existing handlers.
|
|
183
|
+
* @param {RequestHandler[]} handlers List of runtime request handlers.
|
|
184
|
+
* @see {@link https://mswjs.io/docs/api/setup-worker/use `worker.use()`}
|
|
185
|
+
*/
|
|
186
|
+
use: (...handlers: RequestHandler[]) => void;
|
|
187
|
+
/**
|
|
188
|
+
* Marks all request handlers that respond using `res.once()` as unused.
|
|
189
|
+
* @see {@link https://mswjs.io/docs/api/setup-worker/restore-handlers `worker.restoreHandlers()`}
|
|
190
|
+
*/
|
|
191
|
+
restoreHandlers: () => void;
|
|
192
|
+
/**
|
|
193
|
+
* Resets request handlers to the initial list given to the `setupWorker` call, or to the explicit next request handlers list, if given.
|
|
194
|
+
* @param {RequestHandler[]} nextHandlers List of the new initial request handlers.
|
|
195
|
+
* @see {@link https://mswjs.io/docs/api/setup-worker/reset-handlers `worker.resetHandlers()`}
|
|
196
|
+
*/
|
|
197
|
+
resetHandlers: (...nextHandlers: RequestHandler[]) => void;
|
|
198
|
+
/**
|
|
199
|
+
* Returns a readonly list of currently active request handlers.
|
|
200
|
+
* @see {@link https://mswjs.io/docs/api/setup-worker/list-handlers `worker.listHandlers()`}
|
|
201
|
+
*/
|
|
202
|
+
listHandlers(): ReadonlyArray<RequestHandler<RequestHandlerDefaultInfo, MockedRequest<DefaultBodyType>, any, MockedRequest<DefaultBodyType>>>;
|
|
203
|
+
/**
|
|
204
|
+
* Lists all active request handlers.
|
|
205
|
+
* @see {@link https://mswjs.io/docs/api/setup-worker/print-handlers `worker.printHandlers()`}
|
|
206
|
+
*/
|
|
207
|
+
printHandlers: () => void;
|
|
208
|
+
events: LifeCycleEventEmitter<WorkerLifecycleEventsMap>;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
type DefaultContext = {
|
|
212
|
+
status: typeof status;
|
|
213
|
+
set: typeof set;
|
|
214
|
+
delay: typeof delay;
|
|
215
|
+
fetch: typeof fetch;
|
|
216
|
+
};
|
|
217
|
+
declare const defaultContext: DefaultContext;
|
|
218
|
+
type DefaultRequestMultipartBody = Record<string, string | File | (string | File)[]>;
|
|
219
|
+
type DefaultBodyType = Record<string, any> | DefaultRequestMultipartBody | string | number | boolean | null | undefined;
|
|
220
|
+
interface RequestHandlerDefaultInfo {
|
|
221
|
+
header: string;
|
|
222
|
+
}
|
|
223
|
+
interface RequestHandlerInternalInfo {
|
|
224
|
+
callFrame?: string;
|
|
225
|
+
}
|
|
226
|
+
type ContextMap = Record<string, (...args: any[]) => any>;
|
|
227
|
+
type ResponseResolverReturnType<ReturnType> = ReturnType | undefined | void;
|
|
228
|
+
type MaybeAsyncResponseResolverReturnType<ReturnType> = MaybePromise<ResponseResolverReturnType<ReturnType>>;
|
|
229
|
+
type AsyncResponseResolverReturnType<ReturnType> = MaybeAsyncResponseResolverReturnType<ReturnType> | Generator<MaybeAsyncResponseResolverReturnType<ReturnType>, MaybeAsyncResponseResolverReturnType<ReturnType>, MaybeAsyncResponseResolverReturnType<ReturnType>>;
|
|
230
|
+
type ResponseResolver<RequestType = MockedRequest, ContextType = typeof defaultContext, BodyType extends DefaultBodyType = any> = (req: RequestType, res: ResponseComposition<BodyType>, context: ContextType) => AsyncResponseResolverReturnType<MockedResponse<BodyType>>;
|
|
231
|
+
interface RequestHandlerOptions<HandlerInfo> {
|
|
232
|
+
info: HandlerInfo;
|
|
233
|
+
resolver: ResponseResolver<any, any>;
|
|
234
|
+
ctx?: ContextMap;
|
|
235
|
+
}
|
|
236
|
+
interface RequestHandlerExecutionResult<PublicRequestType> {
|
|
237
|
+
handler: RequestHandler;
|
|
238
|
+
parsedResult: any;
|
|
239
|
+
request: PublicRequestType;
|
|
240
|
+
response?: MockedResponse;
|
|
241
|
+
}
|
|
242
|
+
declare abstract class RequestHandler<HandlerInfo extends RequestHandlerDefaultInfo = RequestHandlerDefaultInfo, Request extends MockedRequest = MockedRequest, ParsedResult = any, PublicRequest extends MockedRequest = Request> {
|
|
243
|
+
info: HandlerInfo & RequestHandlerInternalInfo;
|
|
244
|
+
shouldSkip: boolean;
|
|
245
|
+
private ctx;
|
|
246
|
+
private resolverGenerator?;
|
|
247
|
+
private resolverGeneratorResult?;
|
|
248
|
+
protected resolver: ResponseResolver<any, any>;
|
|
249
|
+
constructor(options: RequestHandlerOptions<HandlerInfo>);
|
|
250
|
+
/**
|
|
251
|
+
* Determine if the captured request should be mocked.
|
|
252
|
+
*/
|
|
253
|
+
abstract predicate(request: MockedRequest, parsedResult: ParsedResult, resolutionContext?: ResponseResolutionContext): boolean;
|
|
254
|
+
/**
|
|
255
|
+
* Print out the successfully handled request.
|
|
256
|
+
*/
|
|
257
|
+
abstract log(request: Request, response: SerializedResponse<any>, parsedResult: ParsedResult): void;
|
|
258
|
+
/**
|
|
259
|
+
* Parse the captured request to extract additional information from it.
|
|
260
|
+
* Parsed result is then exposed to other methods of this request handler.
|
|
261
|
+
*/
|
|
262
|
+
parse(_request: MockedRequest, _resolutionContext?: ResponseResolutionContext): ParsedResult;
|
|
263
|
+
/**
|
|
264
|
+
* Test if this handler matches the given request.
|
|
265
|
+
*/
|
|
266
|
+
test(request: MockedRequest, resolutionContext?: ResponseResolutionContext): boolean;
|
|
267
|
+
/**
|
|
268
|
+
* Derive the publicly exposed request (`req`) instance of the response resolver
|
|
269
|
+
* from the captured request and its parsed result.
|
|
270
|
+
*/
|
|
271
|
+
protected getPublicRequest(request: MockedRequest, _parsedResult: ParsedResult): PublicRequest;
|
|
272
|
+
markAsSkipped(shouldSkip?: boolean): void;
|
|
273
|
+
/**
|
|
274
|
+
* Execute this request handler and produce a mocked response
|
|
275
|
+
* using the given resolver function.
|
|
276
|
+
*/
|
|
277
|
+
run(request: MockedRequest, resolutionContext?: ResponseResolutionContext): Promise<RequestHandlerExecutionResult<PublicRequest> | null>;
|
|
278
|
+
private wrapResolver;
|
|
279
|
+
private createExecutionResult;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
type MaybePromise<ValueType = any> = ValueType | Promise<ValueType>;
|
|
283
|
+
/**
|
|
284
|
+
* Internal representation of a mocked response instance.
|
|
285
|
+
*/
|
|
286
|
+
interface MockedResponse<BodyType extends DefaultBodyType = any> {
|
|
287
|
+
body: BodyType;
|
|
288
|
+
status: number;
|
|
289
|
+
statusText: string;
|
|
290
|
+
headers: Headers;
|
|
291
|
+
once: boolean;
|
|
292
|
+
passthrough: boolean;
|
|
293
|
+
delay?: number;
|
|
294
|
+
}
|
|
295
|
+
type ResponseTransformer<BodyType extends TransformerBodyType = any, TransformerBodyType extends DefaultBodyType = any> = (res: MockedResponse<TransformerBodyType>) => MaybePromise<MockedResponse<BodyType>>;
|
|
296
|
+
type ResponseFunction<BodyType extends DefaultBodyType = any> = (...transformers: ResponseTransformer<BodyType>[]) => MaybePromise<MockedResponse<BodyType>>;
|
|
297
|
+
type ResponseComposition<BodyType extends DefaultBodyType = any> = ResponseFunction<BodyType> & {
|
|
298
|
+
/**
|
|
299
|
+
* Respond using a given mocked response to the first captured request.
|
|
300
|
+
* Does not affect any subsequent captured requests.
|
|
301
|
+
*/
|
|
302
|
+
once: ResponseFunction<BodyType>;
|
|
303
|
+
networkError: (message: string) => void;
|
|
304
|
+
};
|
|
305
|
+
declare const defaultResponse: Omit<MockedResponse, 'headers'>;
|
|
306
|
+
type ResponseCompositionOptions<BodyType> = {
|
|
307
|
+
defaultTransformers?: ResponseTransformer<BodyType>[];
|
|
308
|
+
mockedResponseOverrides?: Partial<MockedResponse>;
|
|
309
|
+
};
|
|
310
|
+
declare function createResponseComposition<BodyType extends DefaultBodyType>(responseOverrides?: Partial<MockedResponse<BodyType>>, defaultTransformers?: ResponseTransformer<BodyType>[]): ResponseFunction;
|
|
311
|
+
declare const response: ResponseFunction<any> & {
|
|
312
|
+
once: ResponseFunction<any>;
|
|
313
|
+
networkError(message: string): never;
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Sets a response status code and text.
|
|
318
|
+
* @example
|
|
319
|
+
* res(ctx.status(301))
|
|
320
|
+
* res(ctx.status(400, 'Custom status text'))
|
|
321
|
+
* @see {@link https://mswjs.io/docs/api/context/status `ctx.status()`}
|
|
322
|
+
*/
|
|
323
|
+
declare const status: (statusCode: number, statusText?: string) => ResponseTransformer;
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Generic class for the mock API setup.
|
|
327
|
+
*/
|
|
328
|
+
declare abstract class SetupApi<EventsMap extends EventMap> {
|
|
329
|
+
protected initialHandlers: ReadonlyArray<RequestHandler>;
|
|
330
|
+
protected currentHandlers: Array<RequestHandler>;
|
|
331
|
+
protected readonly emitter: Emitter<EventsMap>;
|
|
332
|
+
protected readonly publicEmitter: Emitter<EventsMap>;
|
|
333
|
+
readonly events: LifeCycleEventEmitter<EventsMap>;
|
|
334
|
+
constructor(...initialHandlers: Array<RequestHandler>);
|
|
335
|
+
private validateHandlers;
|
|
336
|
+
protected dispose(): void;
|
|
337
|
+
use(...runtimeHandlers: Array<RequestHandler>): void;
|
|
338
|
+
restoreHandlers(): void;
|
|
339
|
+
resetHandlers(...nextHandlers: Array<RequestHandler>): void;
|
|
340
|
+
listHandlers(): ReadonlyArray<RequestHandler<RequestHandlerDefaultInfo, MockedRequest<DefaultBodyType>, any, MockedRequest<DefaultBodyType>>>;
|
|
341
|
+
private createLifeCycleEvents;
|
|
342
|
+
abstract printHandlers(): void;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
type ServerLifecycleEventsMap = LifeCycleEventsMap<IsomorphicResponse>;
|
|
346
|
+
interface SetupServer {
|
|
347
|
+
/**
|
|
348
|
+
* Starts requests interception based on the previously provided request handlers.
|
|
349
|
+
* @see {@link https://mswjs.io/docs/api/setup-server/listen `server.listen()`}
|
|
350
|
+
*/
|
|
351
|
+
listen(options?: PartialDeep<SharedOptions>): void;
|
|
352
|
+
/**
|
|
353
|
+
* Stops requests interception by restoring all augmented modules.
|
|
354
|
+
* @see {@link https://mswjs.io/docs/api/setup-server/close `server.close()`}
|
|
355
|
+
*/
|
|
356
|
+
close(): void;
|
|
357
|
+
/**
|
|
358
|
+
* Prepends given request handlers to the list of existing handlers.
|
|
359
|
+
* @see {@link https://mswjs.io/docs/api/setup-server/use `server.use()`}
|
|
360
|
+
*/
|
|
361
|
+
use(...handlers: RequestHandler[]): void;
|
|
362
|
+
/**
|
|
363
|
+
* Marks all request handlers that respond using `res.once()` as unused.
|
|
364
|
+
* @see {@link https://mswjs.io/docs/api/setup-server/restore-handlers `server.restore-handlers()`}
|
|
365
|
+
*/
|
|
366
|
+
restoreHandlers(): void;
|
|
367
|
+
/**
|
|
368
|
+
* Resets request handlers to the initial list given to the `setupServer` call, or to the explicit next request handlers list, if given.
|
|
369
|
+
* @see {@link https://mswjs.io/docs/api/setup-server/reset-handlers `server.reset-handlers()`}
|
|
370
|
+
*/
|
|
371
|
+
resetHandlers(...nextHandlers: RequestHandler[]): void;
|
|
372
|
+
/**
|
|
373
|
+
* Returns a readonly list of currently active request handlers.
|
|
374
|
+
* @see {@link https://mswjs.io/docs/api/setup-server/list-handlers `server.listHandlers()`}
|
|
375
|
+
*/
|
|
376
|
+
listHandlers(): ReadonlyArray<RequestHandler<RequestHandlerDefaultInfo, MockedRequest<DefaultBodyType>, any, MockedRequest<DefaultBodyType>>>;
|
|
377
|
+
/**
|
|
378
|
+
* Lists all active request handlers.
|
|
379
|
+
* @see {@link https://mswjs.io/docs/api/setup-server/print-handlers `server.print-handlers()`}
|
|
380
|
+
*/
|
|
381
|
+
printHandlers(): void;
|
|
382
|
+
events: LifeCycleEventEmitter<ServerLifecycleEventsMap>;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
export { AsyncResponseResolverReturnType as A, DelayMode as B, RequestCache as C, DefaultContext as D, RequestMode as E, RequestRedirect as F, RequestDestination as G, RequestPriority as H, RequestReferrerPolicy as I, MockedRequestInit as J, SetupServer as K, LifeCycleEventsMap as L, MockedRequest as M, ResponseTransformer as R, SetupApi as S, WorkerLifecycleEventsMap as W, set as a, SetupWorker as b, RequestHandler as c, delay as d, StartOptions as e, fetch as f, StartReturnType as g, DefaultBodyType as h, ResponseResolver as i, ResponseResolutionContext as j, SerializedResponse as k, RequestHandlerDefaultInfo as l, MockedResponse as m, ResponseLookupResult as n, SharedOptions as o, ServerLifecycleEventsMap as p, defaultResponse as q, response as r, status as s, createResponseComposition as t, defaultContext as u, ResponseResolverReturnType as v, DefaultRequestMultipartBody as w, ResponseComposition as x, ResponseCompositionOptions as y, ResponseFunction as z };
|