msw 2.11.1 → 2.11.3

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.
Files changed (72) hide show
  1. package/lib/browser/index.d.mts +0 -3
  2. package/lib/browser/index.d.ts +0 -3
  3. package/lib/browser/index.js +536 -318
  4. package/lib/browser/index.js.map +1 -1
  5. package/lib/browser/index.mjs +536 -318
  6. package/lib/browser/index.mjs.map +1 -1
  7. package/lib/core/handlers/GraphQLHandler.js.map +1 -1
  8. package/lib/core/handlers/GraphQLHandler.mjs.map +1 -1
  9. package/lib/core/handlers/HttpHandler.js.map +1 -1
  10. package/lib/core/handlers/HttpHandler.mjs.map +1 -1
  11. package/lib/core/utils/handleRequest.js +8 -8
  12. package/lib/core/utils/handleRequest.js.map +1 -1
  13. package/lib/core/utils/handleRequest.mjs +8 -8
  14. package/lib/core/utils/handleRequest.mjs.map +1 -1
  15. package/lib/core/utils/internal/devUtils.js.map +1 -1
  16. package/lib/core/utils/internal/devUtils.mjs.map +1 -1
  17. package/lib/core/utils/internal/getCallFrame.js +2 -2
  18. package/lib/core/utils/internal/getCallFrame.js.map +1 -1
  19. package/lib/core/utils/internal/getCallFrame.mjs +2 -2
  20. package/lib/core/utils/internal/getCallFrame.mjs.map +1 -1
  21. package/lib/core/utils/internal/parseGraphQLRequest.js +1 -0
  22. package/lib/core/utils/internal/parseGraphQLRequest.js.map +1 -1
  23. package/lib/core/utils/internal/parseGraphQLRequest.mjs +1 -0
  24. package/lib/core/utils/internal/parseGraphQLRequest.mjs.map +1 -1
  25. package/lib/core/utils/matching/matchRequestUrl.js +1 -1
  26. package/lib/core/utils/matching/matchRequestUrl.js.map +1 -1
  27. package/lib/core/utils/matching/matchRequestUrl.mjs +1 -1
  28. package/lib/core/utils/matching/matchRequestUrl.mjs.map +1 -1
  29. package/lib/core/utils/url/cleanUrl.js +1 -1
  30. package/lib/core/utils/url/cleanUrl.js.map +1 -1
  31. package/lib/core/utils/url/cleanUrl.mjs +1 -1
  32. package/lib/core/utils/url/cleanUrl.mjs.map +1 -1
  33. package/lib/core/utils/url/isAbsoluteUrl.js +1 -1
  34. package/lib/core/utils/url/isAbsoluteUrl.js.map +1 -1
  35. package/lib/core/utils/url/isAbsoluteUrl.mjs +1 -1
  36. package/lib/core/utils/url/isAbsoluteUrl.mjs.map +1 -1
  37. package/lib/core/ws/WebSocketIndexedDBClientStore.js.map +1 -1
  38. package/lib/core/ws/WebSocketIndexedDBClientStore.mjs.map +1 -1
  39. package/lib/core/ws/utils/attachWebSocketLogger.js.map +1 -1
  40. package/lib/core/ws/utils/attachWebSocketLogger.mjs.map +1 -1
  41. package/lib/iife/index.js +2536 -2314
  42. package/lib/iife/index.js.map +1 -1
  43. package/lib/mockServiceWorker.js +16 -12
  44. package/package.json +22 -15
  45. package/src/browser/setupWorker/glossary.ts +9 -114
  46. package/src/browser/setupWorker/setupWorker.ts +82 -119
  47. package/src/browser/setupWorker/start/createRequestListener.ts +20 -24
  48. package/src/browser/setupWorker/start/createResponseListener.ts +15 -22
  49. package/src/browser/setupWorker/start/createStartHandler.ts +24 -18
  50. package/src/browser/setupWorker/start/utils/enableMocking.ts +18 -21
  51. package/src/browser/setupWorker/start/utils/getWorkerInstance.ts +17 -16
  52. package/src/browser/setupWorker/start/utils/printStartMessage.ts +0 -2
  53. package/src/browser/utils/checkWorkerIntegrity.ts +22 -14
  54. package/src/browser/utils/deferNetworkRequestsUntil.ts +1 -1
  55. package/src/browser/utils/workerChannel.ts +146 -0
  56. package/src/core/handlers/GraphQLHandler.ts +0 -3
  57. package/src/core/handlers/HttpHandler.ts +0 -2
  58. package/src/core/utils/handleRequest.ts +8 -8
  59. package/src/core/utils/internal/devUtils.ts +0 -2
  60. package/src/core/utils/internal/getCallFrame.ts +2 -2
  61. package/src/core/utils/internal/parseGraphQLRequest.ts +1 -0
  62. package/src/core/utils/matching/matchRequestUrl.ts +2 -2
  63. package/src/core/utils/request/onUnhandledRequest.test.ts +1 -1
  64. package/src/core/utils/url/cleanUrl.ts +1 -1
  65. package/src/core/utils/url/isAbsoluteUrl.ts +1 -1
  66. package/src/core/ws/WebSocketIndexedDBClientStore.ts +0 -4
  67. package/src/core/ws/utils/attachWebSocketLogger.ts +0 -14
  68. package/src/mockServiceWorker.js +14 -10
  69. package/src/browser/setupWorker/start/createFallbackStart.ts +0 -21
  70. package/src/browser/setupWorker/start/utils/createMessageChannel.ts +0 -32
  71. package/src/browser/setupWorker/stop/createFallbackStop.ts +0 -11
  72. package/src/browser/setupWorker/stop/createStop.ts +0 -35
@@ -1,4 +1,4 @@
1
- import { until } from '@open-draft/until'
1
+ import { until } from 'until-async'
2
2
  import { Emitter } from 'strict-event-emitter'
3
3
  import { LifeCycleEventsMap, SharedOptions } from '../sharedOptions'
4
4
  import { RequiredDeep } from '../typeUtils'
@@ -54,7 +54,7 @@ export async function handleRequest(
54
54
  }
55
55
 
56
56
  // Resolve a mocked response from the list of request handlers.
57
- const lookupResult = await until(() => {
57
+ const [lookupError, lookupResult] = await until(() => {
58
58
  return executeHandlers({
59
59
  request,
60
60
  requestId,
@@ -63,19 +63,19 @@ export async function handleRequest(
63
63
  })
64
64
  })
65
65
 
66
- if (lookupResult.error) {
66
+ if (lookupError) {
67
67
  // Allow developers to react to unhandled exceptions in request handlers.
68
68
  emitter.emit('unhandledException', {
69
- error: lookupResult.error,
69
+ error: lookupError,
70
70
  request,
71
71
  requestId,
72
72
  })
73
- throw lookupResult.error
73
+ throw lookupError
74
74
  }
75
75
 
76
76
  // If the handler lookup returned nothing, no request handler was found
77
77
  // matching this request. Report the request as unhandled.
78
- if (!lookupResult.data) {
78
+ if (!lookupResult) {
79
79
  await onUnhandledRequest(request, options.onUnhandledRequest)
80
80
  emitter.emit('request:unhandled', { request, requestId })
81
81
  emitter.emit('request:end', { request, requestId })
@@ -83,7 +83,7 @@ export async function handleRequest(
83
83
  return
84
84
  }
85
85
 
86
- const { response } = lookupResult.data
86
+ const { response } = lookupResult
87
87
 
88
88
  // When the handled request returned no mocked response, warn the developer,
89
89
  // as it may be an oversight on their part. Perform the request as-is.
@@ -110,7 +110,7 @@ export async function handleRequest(
110
110
  emitter.emit('request:match', { request, requestId })
111
111
 
112
112
  const requiredLookupResult =
113
- lookupResult.data as RequiredDeep<HandlersExecutionResult>
113
+ lookupResult as RequiredDeep<HandlersExecutionResult>
114
114
 
115
115
  handleRequestOptions?.onMockedResponse?.(response, requiredLookupResult)
116
116
 
@@ -14,7 +14,6 @@ function formatMessage(message: string, ...positionals: any[]): string {
14
14
  * Prints a library-specific warning.
15
15
  */
16
16
  function warn(message: string, ...positionals: any[]): void {
17
- // eslint-disable-next-line no-console
18
17
  console.warn(formatMessage(message, ...positionals))
19
18
  }
20
19
 
@@ -22,7 +21,6 @@ function warn(message: string, ...positionals: any[]): void {
22
21
  * Prints a library-specific error.
23
22
  */
24
23
  function error(message: string, ...positionals: any[]): void {
25
- // eslint-disable-next-line no-console
26
24
  console.error(formatMessage(message, ...positionals))
27
25
  }
28
26
 
@@ -1,8 +1,8 @@
1
1
  // Ignore the source files traces for local testing.
2
- const SOURCE_FRAME = /[\/\\]msw[\/\\]src[\/\\](.+)/
2
+ const SOURCE_FRAME = /[/\\]msw[/\\]src[/\\](.+)/
3
3
 
4
4
  const BUILD_FRAME =
5
- /(node_modules)?[\/\\]lib[\/\\](core|browser|node|native|iife)[\/\\]|^[^\/\\]*$/
5
+ /(node_modules)?[/\\]lib[/\\](core|browser|node|native|iife)[/\\]|^[^/\\]*$/
6
6
 
7
7
  /**
8
8
  * Return the stack trace frame of a function's invocation.
@@ -168,6 +168,7 @@ async function getGraphQLInput(request: Request): Promise<GraphQLInput | null> {
168
168
  variables,
169
169
  }
170
170
  }
171
+ return null
171
172
  }
172
173
 
173
174
  default:
@@ -42,13 +42,13 @@ export function coercePath(path: string): string {
42
42
  * Escape the port so that "path-to-regexp" can match
43
43
  * absolute URLs including port numbers.
44
44
  */
45
- .replace(/([^\/])(:)(?=\d+)/, '$1\\$2')
45
+ .replace(/([^/])(:)(?=\d+)/, '$1\\$2')
46
46
  /**
47
47
  * Escape the protocol so that "path-to-regexp" could match
48
48
  * absolute URL.
49
49
  * @see https://github.com/pillarjs/path-to-regexp/issues/259
50
50
  */
51
- .replace(/^([^\/]+)(:)(?=\/\/)/, '$1\\$2')
51
+ .replace(/^([^/]+)(:)(?=\/\/)/, '$1\\$2')
52
52
  )
53
53
  }
54
54
 
@@ -17,7 +17,7 @@ Read more: https://mswjs.io/docs/http/intercepting-requests`,
17
17
 
18
18
  • POST ${url}
19
19
 
20
- • Request body: {\"variables\":{\"id\":\"abc-123\"},\"query\":\"query UserName($id: String!) { user(id: $id) { name } }\"}
20
+ • Request body: {"variables":{"id":"abc-123"},"query":"query UserName($id: String!) { user(id: $id) { name } }"}
21
21
 
22
22
  If you still wish to intercept this unhandled request, please create a request handler for it.
23
23
  Read more: https://mswjs.io/docs/http/intercepting-requests`,
@@ -1,4 +1,4 @@
1
- const REDUNDANT_CHARACTERS_EXP = /[\?|#].*$/g
1
+ const REDUNDANT_CHARACTERS_EXP = /[?|#].*$/g
2
2
 
3
3
  export function getSearchParams(path: string) {
4
4
  return new URL(`/${path}`, 'http://localhost').searchParams
@@ -2,5 +2,5 @@
2
2
  * Determines if the given URL string is an absolute URL.
3
3
  */
4
4
  export function isAbsoluteUrl(url: string): boolean {
5
- return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url)
5
+ return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url)
6
6
  }
@@ -34,7 +34,6 @@ export class WebSocketIndexedDBClientStore implements WebSocketClientStore {
34
34
  promise.resolve()
35
35
  }
36
36
  request.onerror = () => {
37
- // eslint-disable-next-line no-console
38
37
  console.error(request.error)
39
38
  promise.reject(
40
39
  new Error(
@@ -81,7 +80,6 @@ export class WebSocketIndexedDBClientStore implements WebSocketClientStore {
81
80
  promise.resolve()
82
81
  }
83
82
  store.transaction.onerror = () => {
84
- // eslint-disable-next-line no-console
85
83
  console.error(store.transaction.error)
86
84
  promise.reject(
87
85
  new Error(
@@ -116,7 +114,6 @@ export class WebSocketIndexedDBClientStore implements WebSocketClientStore {
116
114
  promise.resolve(db)
117
115
  }
118
116
  store.transaction.onerror = () => {
119
- // eslint-disable-next-line no-console
120
117
  console.error(store.transaction.error)
121
118
  promise.reject(
122
119
  new Error(
@@ -126,7 +123,6 @@ export class WebSocketIndexedDBClientStore implements WebSocketClientStore {
126
123
  }
127
124
  }
128
125
  request.onerror = () => {
129
- // eslint-disable-next-line no-console
130
126
  console.error(request.error)
131
127
  promise.reject(
132
128
  new Error(
@@ -113,7 +113,6 @@ export function attachWebSocketLogger(
113
113
  export function logConnectionOpen(client: WebSocketClientConnection) {
114
114
  const publicUrl = toPublicUrl(client.url)
115
115
 
116
- // eslint-disable-next-line no-console
117
116
  console.groupCollapsed(
118
117
  devUtils.formatMessage(`${getTimestamp()} %c▶%c ${publicUrl}`),
119
118
  `color:${colors.system}`,
@@ -121,7 +120,6 @@ export function logConnectionOpen(client: WebSocketClientConnection) {
121
120
  )
122
121
  // eslint-disable-next-line no-console
123
122
  console.log('Client:', client.socket)
124
- // eslint-disable-next-line no-console
125
123
  console.groupEnd()
126
124
  }
127
125
 
@@ -129,7 +127,6 @@ function logConnectionClose(event: CloseEvent) {
129
127
  const target = event.target as WebSocket
130
128
  const publicUrl = toPublicUrl(target.url)
131
129
 
132
- // eslint-disable-next-line no-console
133
130
  console.groupCollapsed(
134
131
  devUtils.formatMessage(
135
132
  `${getTimestamp({ milliseconds: true })} %c■%c ${publicUrl}`,
@@ -139,7 +136,6 @@ function logConnectionClose(event: CloseEvent) {
139
136
  )
140
137
  // eslint-disable-next-line no-console
141
138
  console.log(event)
142
- // eslint-disable-next-line no-console
143
139
  console.groupEnd()
144
140
  }
145
141
 
@@ -147,7 +143,6 @@ function logClientError(event: Event) {
147
143
  const socket = event.target as WebSocket
148
144
  const publicUrl = toPublicUrl(socket.url)
149
145
 
150
- // eslint-disable-next-line no-console
151
146
  console.groupCollapsed(
152
147
  devUtils.formatMessage(
153
148
  `${getTimestamp({ milliseconds: true })} %c\u00D7%c ${publicUrl}`,
@@ -157,7 +152,6 @@ function logClientError(event: Event) {
157
152
  )
158
153
  // eslint-disable-next-line no-console
159
154
  console.log(event)
160
- // eslint-disable-next-line no-console
161
155
  console.groupEnd()
162
156
  }
163
157
 
@@ -169,7 +163,6 @@ async function logOutgoingClientMessage(event: MessageEvent<WebSocketData>) {
169
163
  const publicData = await getPublicData(event.data)
170
164
  const arrow = event.defaultPrevented ? '⇡' : '⬆'
171
165
 
172
- // eslint-disable-next-line no-console
173
166
  console.groupCollapsed(
174
167
  devUtils.formatMessage(
175
168
  `${getTimestamp({ milliseconds: true })} %c${arrow}%c ${publicData} %c${byteLength}%c`,
@@ -181,7 +174,6 @@ async function logOutgoingClientMessage(event: MessageEvent<WebSocketData>) {
181
174
  )
182
175
  // eslint-disable-next-line no-console
183
176
  console.log(event)
184
- // eslint-disable-next-line no-console
185
177
  console.groupEnd()
186
178
  }
187
179
 
@@ -195,7 +187,6 @@ async function logOutgoingMockedClientMessage(
195
187
  const byteLength = getMessageLength(event.data)
196
188
  const publicData = await getPublicData(event.data)
197
189
 
198
- // eslint-disable-next-line no-console
199
190
  console.groupCollapsed(
200
191
  devUtils.formatMessage(
201
192
  `${getTimestamp({ milliseconds: true })} %c⬆%c ${publicData} %c${byteLength}%c`,
@@ -207,7 +198,6 @@ async function logOutgoingMockedClientMessage(
207
198
  )
208
199
  // eslint-disable-next-line no-console
209
200
  console.log(event)
210
- // eslint-disable-next-line no-console
211
201
  console.groupEnd()
212
202
  }
213
203
 
@@ -221,7 +211,6 @@ async function logIncomingMockedClientMessage(
221
211
  const byteLength = getMessageLength(event.data)
222
212
  const publicData = await getPublicData(event.data)
223
213
 
224
- // eslint-disable-next-line no-console
225
214
  console.groupCollapsed(
226
215
  devUtils.formatMessage(
227
216
  `${getTimestamp({ milliseconds: true })} %c⬇%c ${publicData} %c${byteLength}%c`,
@@ -233,7 +222,6 @@ async function logIncomingMockedClientMessage(
233
222
  )
234
223
  // eslint-disable-next-line no-console
235
224
  console.log(event)
236
- // eslint-disable-next-line no-console
237
225
  console.groupEnd()
238
226
  }
239
227
 
@@ -242,7 +230,6 @@ async function logIncomingServerMessage(event: MessageEvent<WebSocketData>) {
242
230
  const publicData = await getPublicData(event.data)
243
231
  const arrow = event.defaultPrevented ? '⇣' : '⬇'
244
232
 
245
- // eslint-disable-next-line no-console
246
233
  console.groupCollapsed(
247
234
  devUtils.formatMessage(
248
235
  `${getTimestamp({ milliseconds: true })} %c${arrow}%c ${publicData} %c${byteLength}%c`,
@@ -254,6 +241,5 @@ async function logIncomingServerMessage(event: MessageEvent<WebSocketData>) {
254
241
  )
255
242
  // eslint-disable-next-line no-console
256
243
  console.log(event)
257
- // eslint-disable-next-line no-console
258
244
  console.groupEnd()
259
245
  }
@@ -71,11 +71,6 @@ addEventListener('message', async function (event) {
71
71
  break
72
72
  }
73
73
 
74
- case 'MOCK_DEACTIVATE': {
75
- activeClientIds.delete(clientId)
76
- break
77
- }
78
-
79
74
  case 'CLIENT_CLOSED': {
80
75
  activeClientIds.delete(clientId)
81
76
 
@@ -94,6 +89,8 @@ addEventListener('message', async function (event) {
94
89
  })
95
90
 
96
91
  addEventListener('fetch', function (event) {
92
+ const requestInterceptedAt = Date.now()
93
+
97
94
  // Bypass navigation requests.
98
95
  if (event.request.mode === 'navigate') {
99
96
  return
@@ -110,23 +107,29 @@ addEventListener('fetch', function (event) {
110
107
 
111
108
  // Bypass all requests when there are no active clients.
112
109
  // Prevents the self-unregistered worked from handling requests
113
- // after it's been deleted (still remains active until the next reload).
110
+ // after it's been terminated (still remains active until the next reload).
114
111
  if (activeClientIds.size === 0) {
115
112
  return
116
113
  }
117
114
 
118
115
  const requestId = crypto.randomUUID()
119
- event.respondWith(handleRequest(event, requestId))
116
+ event.respondWith(handleRequest(event, requestId, requestInterceptedAt))
120
117
  })
121
118
 
122
119
  /**
123
120
  * @param {FetchEvent} event
124
121
  * @param {string} requestId
122
+ * @param {number} requestInterceptedAt
125
123
  */
126
- async function handleRequest(event, requestId) {
124
+ async function handleRequest(event, requestId, requestInterceptedAt) {
127
125
  const client = await resolveMainClient(event)
128
126
  const requestCloneForEvents = event.request.clone()
129
- const response = await getResponse(event, client, requestId)
127
+ const response = await getResponse(
128
+ event,
129
+ client,
130
+ requestId,
131
+ requestInterceptedAt,
132
+ )
130
133
 
131
134
  // Send back the response clone for the "response:*" life-cycle events.
132
135
  // Ensure MSW is active and ready to handle the message, otherwise
@@ -204,7 +207,7 @@ async function resolveMainClient(event) {
204
207
  * @param {string} requestId
205
208
  * @returns {Promise<Response>}
206
209
  */
207
- async function getResponse(event, client, requestId) {
210
+ async function getResponse(event, client, requestId, requestInterceptedAt) {
208
211
  // Clone the request because it might've been already used
209
212
  // (i.e. its body has been read and sent to the client).
210
213
  const requestClone = event.request.clone()
@@ -255,6 +258,7 @@ async function getResponse(event, client, requestId) {
255
258
  type: 'REQUEST',
256
259
  payload: {
257
260
  id: requestId,
261
+ interceptedAt: requestInterceptedAt,
258
262
  ...serializedRequest,
259
263
  },
260
264
  },
@@ -1,21 +0,0 @@
1
- import { createFallbackRequestListener } from './createFallbackRequestListener'
2
- import { SetupWorkerInternalContext, StartHandler } from '../glossary'
3
- import { printStartMessage } from './utils/printStartMessage'
4
-
5
- export function createFallbackStart(
6
- context: SetupWorkerInternalContext,
7
- ): StartHandler {
8
- return async function start(options) {
9
- context.fallbackInterceptor = createFallbackRequestListener(
10
- context,
11
- options,
12
- )
13
-
14
- printStartMessage({
15
- message: 'Mocking enabled (fallback mode).',
16
- quiet: options.quiet,
17
- })
18
-
19
- return undefined
20
- }
21
- }
@@ -1,32 +0,0 @@
1
- import {
2
- StringifiedResponse,
3
- ServiceWorkerIncomingEventsMap,
4
- } from '../../glossary'
5
-
6
- export interface ServiceWorkerMessage<
7
- EventType extends keyof ServiceWorkerIncomingEventsMap,
8
- EventPayload,
9
- > {
10
- type: EventType
11
- payload: EventPayload
12
- }
13
-
14
- interface WorkerChannelEventsMap {
15
- MOCK_RESPONSE: [
16
- data: StringifiedResponse,
17
- transfer?: [ReadableStream<Uint8Array>],
18
- ]
19
- PASSTHROUGH: []
20
- }
21
-
22
- export class WorkerChannel {
23
- constructor(private readonly port: MessagePort) {}
24
-
25
- public postMessage<Event extends keyof WorkerChannelEventsMap>(
26
- event: Event,
27
- ...rest: WorkerChannelEventsMap[Event]
28
- ): void {
29
- const [data, transfer] = rest
30
- this.port.postMessage({ type: event, data }, { transfer })
31
- }
32
- }
@@ -1,11 +0,0 @@
1
- import { SetupWorkerInternalContext, StopHandler } from '../glossary'
2
- import { printStopMessage } from './utils/printStopMessage'
3
-
4
- export function createFallbackStop(
5
- context: SetupWorkerInternalContext,
6
- ): StopHandler {
7
- return function stop() {
8
- context.fallbackInterceptor?.dispose()
9
- printStopMessage({ quiet: context.startOptions?.quiet })
10
- }
11
- }
@@ -1,35 +0,0 @@
1
- import { devUtils } from '~/core/utils/internal/devUtils'
2
- import { SetupWorkerInternalContext, StopHandler } from '../glossary'
3
- import { printStopMessage } from './utils/printStopMessage'
4
-
5
- export const createStop = (
6
- context: SetupWorkerInternalContext,
7
- ): StopHandler => {
8
- return function stop() {
9
- // Warn developers calling "worker.stop()" more times than necessary.
10
- // This likely indicates a mistake in their code.
11
- if (!context.isMockingEnabled) {
12
- devUtils.warn(
13
- 'Found a redundant "worker.stop()" call. Note that stopping the worker while mocking already stopped has no effect. Consider removing this "worker.stop()" call.',
14
- )
15
- return
16
- }
17
-
18
- /**
19
- * Signal the Service Worker to disable mocking for this client.
20
- * Use this an an explicit way to stop the mocking, while preserving
21
- * the worker-client relation. Does not affect the worker's lifecycle.
22
- */
23
- context.workerChannel.send('MOCK_DEACTIVATE')
24
- context.isMockingEnabled = false
25
- window.clearInterval(context.keepAliveInterval)
26
-
27
- // Post the internal stop message on the window
28
- // to let any logic know when the worker has stopped.
29
- // E.g. the WebSocket client manager needs this to know
30
- // when to clear its in-memory clients list.
31
- window.postMessage({ type: 'msw/worker:stop' })
32
-
33
- printStopMessage({ quiet: context.startOptions?.quiet })
34
- }
35
- }