@depup/msw 2.13.2-depup.0 → 2.15.0-depup.7

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 (282) hide show
  1. package/README.md +9 -12
  2. package/changes.json +14 -26
  3. package/cli/init.js +1 -1
  4. package/lib/browser/index.js +547 -177
  5. package/lib/browser/index.js.map +1 -1
  6. package/lib/browser/index.mjs +547 -177
  7. package/lib/browser/index.mjs.map +1 -1
  8. package/lib/core/{HttpResponse-DlRR1D-f.d.mts → HttpResponse-BE_Y2Ak9.d.mts} +52 -1
  9. package/lib/core/{HttpResponse-CksOMVAa.d.ts → HttpResponse-DL-P1EeG.d.ts} +52 -1
  10. package/lib/core/HttpResponse.d.mts +1 -1
  11. package/lib/core/HttpResponse.d.ts +1 -1
  12. package/lib/core/HttpResponse.js +2 -2
  13. package/lib/core/HttpResponse.js.map +1 -1
  14. package/lib/core/HttpResponse.mjs +2 -2
  15. package/lib/core/HttpResponse.mjs.map +1 -1
  16. package/lib/core/experimental/compat.d.mts +2 -2
  17. package/lib/core/experimental/compat.d.ts +2 -2
  18. package/lib/core/experimental/compat.js +1 -0
  19. package/lib/core/experimental/compat.js.map +1 -1
  20. package/lib/core/experimental/compat.mjs +1 -0
  21. package/lib/core/experimental/compat.mjs.map +1 -1
  22. package/lib/core/experimental/define-network.d.mts +2 -2
  23. package/lib/core/experimental/define-network.d.ts +2 -2
  24. package/lib/core/experimental/define-network.js +21 -11
  25. package/lib/core/experimental/define-network.js.map +1 -1
  26. package/lib/core/experimental/define-network.mjs +23 -11
  27. package/lib/core/experimental/define-network.mjs.map +1 -1
  28. package/lib/core/experimental/frames/http-frame.d.mts +2 -2
  29. package/lib/core/experimental/frames/http-frame.d.ts +2 -2
  30. package/lib/core/experimental/frames/http-frame.js +5 -2
  31. package/lib/core/experimental/frames/http-frame.js.map +1 -1
  32. package/lib/core/experimental/frames/http-frame.mjs +8 -3
  33. package/lib/core/experimental/frames/http-frame.mjs.map +1 -1
  34. package/lib/core/experimental/frames/network-frame.d.mts +2 -2
  35. package/lib/core/experimental/frames/network-frame.d.ts +2 -2
  36. package/lib/core/experimental/frames/network-frame.js +2 -0
  37. package/lib/core/experimental/frames/network-frame.js.map +1 -1
  38. package/lib/core/experimental/frames/network-frame.mjs +2 -0
  39. package/lib/core/experimental/frames/network-frame.mjs.map +1 -1
  40. package/lib/core/experimental/frames/websocket-frame.d.mts +2 -2
  41. package/lib/core/experimental/frames/websocket-frame.d.ts +2 -2
  42. package/lib/core/experimental/frames/websocket-frame.js +2 -0
  43. package/lib/core/experimental/frames/websocket-frame.js.map +1 -1
  44. package/lib/core/experimental/frames/websocket-frame.mjs +2 -0
  45. package/lib/core/experimental/frames/websocket-frame.mjs.map +1 -1
  46. package/lib/core/experimental/handlers-controller.d.mts +2 -1
  47. package/lib/core/experimental/handlers-controller.d.ts +2 -1
  48. package/lib/core/experimental/handlers-controller.js +31 -6
  49. package/lib/core/experimental/handlers-controller.js.map +1 -1
  50. package/lib/core/experimental/handlers-controller.mjs +31 -6
  51. package/lib/core/experimental/handlers-controller.mjs.map +1 -1
  52. package/lib/core/experimental/index.d.mts +5 -5
  53. package/lib/core/experimental/index.d.ts +5 -5
  54. package/lib/core/experimental/index.js +3 -1
  55. package/lib/core/experimental/index.js.map +1 -1
  56. package/lib/core/experimental/index.mjs +9 -2
  57. package/lib/core/experimental/index.mjs.map +1 -1
  58. package/lib/core/experimental/on-unhandled-frame.d.mts +2 -2
  59. package/lib/core/experimental/on-unhandled-frame.d.ts +2 -2
  60. package/lib/core/experimental/on-unhandled-frame.js +1 -0
  61. package/lib/core/experimental/on-unhandled-frame.js.map +1 -1
  62. package/lib/core/experimental/on-unhandled-frame.mjs +1 -0
  63. package/lib/core/experimental/on-unhandled-frame.mjs.map +1 -1
  64. package/lib/core/experimental/setup-api.d.mts +1 -1
  65. package/lib/core/experimental/setup-api.d.ts +1 -1
  66. package/lib/core/experimental/setup-api.js +2 -5
  67. package/lib/core/experimental/setup-api.js.map +1 -1
  68. package/lib/core/experimental/setup-api.mjs +2 -5
  69. package/lib/core/experimental/setup-api.mjs.map +1 -1
  70. package/lib/core/experimental/sources/interceptor-source.d.mts +2 -2
  71. package/lib/core/experimental/sources/interceptor-source.d.ts +2 -2
  72. package/lib/core/experimental/sources/interceptor-source.js +23 -10
  73. package/lib/core/experimental/sources/interceptor-source.js.map +1 -1
  74. package/lib/core/experimental/sources/interceptor-source.mjs +24 -13
  75. package/lib/core/experimental/sources/interceptor-source.mjs.map +1 -1
  76. package/lib/core/experimental/sources/network-source.d.mts +3 -3
  77. package/lib/core/experimental/sources/network-source.d.ts +3 -3
  78. package/lib/core/experimental/sources/network-source.js +1 -0
  79. package/lib/core/experimental/sources/network-source.js.map +1 -1
  80. package/lib/core/experimental/sources/network-source.mjs +2 -0
  81. package/lib/core/experimental/sources/network-source.mjs.map +1 -1
  82. package/lib/core/getResponse.d.mts +1 -1
  83. package/lib/core/getResponse.d.ts +1 -1
  84. package/lib/core/graphql.d.mts +1 -1
  85. package/lib/core/graphql.d.ts +1 -1
  86. package/lib/core/graphql.js +1 -0
  87. package/lib/core/graphql.js.map +1 -1
  88. package/lib/core/graphql.mjs +2 -0
  89. package/lib/core/graphql.mjs.map +1 -1
  90. package/lib/core/handlers/GraphQLHandler.d.mts +1 -1
  91. package/lib/core/handlers/GraphQLHandler.d.ts +1 -1
  92. package/lib/core/handlers/GraphQLHandler.js +1 -0
  93. package/lib/core/handlers/GraphQLHandler.js.map +1 -1
  94. package/lib/core/handlers/GraphQLHandler.mjs +4 -1
  95. package/lib/core/handlers/GraphQLHandler.mjs.map +1 -1
  96. package/lib/core/handlers/HttpHandler.d.mts +1 -1
  97. package/lib/core/handlers/HttpHandler.d.ts +1 -1
  98. package/lib/core/handlers/HttpHandler.js +1 -0
  99. package/lib/core/handlers/HttpHandler.js.map +1 -1
  100. package/lib/core/handlers/HttpHandler.mjs +1 -0
  101. package/lib/core/handlers/HttpHandler.mjs.map +1 -1
  102. package/lib/core/handlers/RequestHandler.d.mts +1 -1
  103. package/lib/core/handlers/RequestHandler.d.ts +1 -1
  104. package/lib/core/handlers/RequestHandler.js +197 -4
  105. package/lib/core/handlers/RequestHandler.js.map +1 -1
  106. package/lib/core/handlers/RequestHandler.mjs +198 -4
  107. package/lib/core/handlers/RequestHandler.mjs.map +1 -1
  108. package/lib/core/handlers/WebSocketHandler.d.mts +5 -2
  109. package/lib/core/handlers/WebSocketHandler.d.ts +5 -2
  110. package/lib/core/handlers/WebSocketHandler.js +30 -12
  111. package/lib/core/handlers/WebSocketHandler.js.map +1 -1
  112. package/lib/core/handlers/WebSocketHandler.mjs +30 -12
  113. package/lib/core/handlers/WebSocketHandler.mjs.map +1 -1
  114. package/lib/core/http.d.mts +1 -1
  115. package/lib/core/http.d.ts +1 -1
  116. package/lib/core/http.js +1 -0
  117. package/lib/core/http.js.map +1 -1
  118. package/lib/core/http.mjs +2 -0
  119. package/lib/core/http.mjs.map +1 -1
  120. package/lib/core/index.d.mts +1 -1
  121. package/lib/core/index.d.ts +1 -1
  122. package/lib/core/{network-frame-usYiHS0K.d.ts → on-unhandled-frame-0KmwUmeV.d.ts} +13 -13
  123. package/lib/core/{network-frame-B7A0ggXE.d.mts → on-unhandled-frame-gkokW4Rr.d.mts} +13 -13
  124. package/lib/core/passthrough.d.mts +1 -1
  125. package/lib/core/passthrough.d.ts +1 -1
  126. package/lib/core/sse.d.mts +4 -18
  127. package/lib/core/sse.d.ts +4 -18
  128. package/lib/core/sse.js +149 -66
  129. package/lib/core/sse.js.map +1 -1
  130. package/lib/core/sse.mjs +149 -66
  131. package/lib/core/sse.mjs.map +1 -1
  132. package/lib/core/utils/HttpResponse/decorators.d.mts +9 -4
  133. package/lib/core/utils/HttpResponse/decorators.d.ts +9 -4
  134. package/lib/core/utils/HttpResponse/decorators.js +18 -11
  135. package/lib/core/utils/HttpResponse/decorators.js.map +1 -1
  136. package/lib/core/utils/HttpResponse/decorators.mjs +18 -11
  137. package/lib/core/utils/HttpResponse/decorators.mjs.map +1 -1
  138. package/lib/core/utils/cookieStore.js.map +1 -1
  139. package/lib/core/utils/cookieStore.mjs.map +1 -1
  140. package/lib/core/utils/executeHandlers.d.mts +1 -1
  141. package/lib/core/utils/executeHandlers.d.ts +1 -1
  142. package/lib/core/utils/executeHandlers.js +1 -0
  143. package/lib/core/utils/executeHandlers.js.map +1 -1
  144. package/lib/core/utils/executeHandlers.mjs +1 -0
  145. package/lib/core/utils/executeHandlers.mjs.map +1 -1
  146. package/lib/core/utils/handleRequest.d.mts +1 -1
  147. package/lib/core/utils/handleRequest.d.ts +1 -1
  148. package/lib/core/utils/handleRequest.js.map +1 -1
  149. package/lib/core/utils/handleRequest.mjs.map +1 -1
  150. package/lib/core/utils/internal/Disposable.js +19 -1
  151. package/lib/core/utils/internal/Disposable.js.map +1 -1
  152. package/lib/core/utils/internal/Disposable.mjs +19 -1
  153. package/lib/core/utils/internal/Disposable.mjs.map +1 -1
  154. package/lib/core/utils/internal/attachSiblingHandlers.d.mts +15 -0
  155. package/lib/core/utils/internal/attachSiblingHandlers.d.ts +15 -0
  156. package/lib/core/utils/internal/attachSiblingHandlers.js +44 -0
  157. package/lib/core/utils/internal/attachSiblingHandlers.js.map +1 -0
  158. package/lib/core/utils/internal/attachSiblingHandlers.mjs +24 -0
  159. package/lib/core/utils/internal/attachSiblingHandlers.mjs.map +1 -0
  160. package/lib/core/utils/internal/isHandlerKind.d.mts +1 -1
  161. package/lib/core/utils/internal/isHandlerKind.d.ts +1 -1
  162. package/lib/core/utils/internal/observe-response-body-stream.d.mts +18 -0
  163. package/lib/core/utils/internal/observe-response-body-stream.d.ts +18 -0
  164. package/lib/core/utils/internal/observe-response-body-stream.js +64 -0
  165. package/lib/core/utils/internal/observe-response-body-stream.js.map +1 -0
  166. package/lib/core/utils/internal/observe-response-body-stream.mjs +44 -0
  167. package/lib/core/utils/internal/observe-response-body-stream.mjs.map +1 -0
  168. package/lib/core/utils/internal/parseGraphQLRequest.d.mts +1 -1
  169. package/lib/core/utils/internal/parseGraphQLRequest.d.ts +1 -1
  170. package/lib/core/utils/internal/parseMultipartData.d.mts +1 -1
  171. package/lib/core/utils/internal/parseMultipartData.d.ts +1 -1
  172. package/lib/core/utils/internal/parseMultipartData.js +1 -0
  173. package/lib/core/utils/internal/parseMultipartData.js.map +1 -1
  174. package/lib/core/utils/internal/parseMultipartData.mjs +1 -0
  175. package/lib/core/utils/internal/parseMultipartData.mjs.map +1 -1
  176. package/lib/core/utils/internal/pipeEvents.js +1 -0
  177. package/lib/core/utils/internal/pipeEvents.js.map +1 -1
  178. package/lib/core/utils/internal/pipeEvents.mjs +1 -0
  179. package/lib/core/utils/internal/pipeEvents.mjs.map +1 -1
  180. package/lib/core/utils/request/storeResponseCookies.js +1 -1
  181. package/lib/core/utils/request/storeResponseCookies.js.map +1 -1
  182. package/lib/core/utils/request/storeResponseCookies.mjs +2 -2
  183. package/lib/core/utils/request/storeResponseCookies.mjs.map +1 -1
  184. package/lib/core/ws/WebSocketClientManager.js +4 -0
  185. package/lib/core/ws/WebSocketClientManager.js.map +1 -1
  186. package/lib/core/ws/WebSocketClientManager.mjs +4 -0
  187. package/lib/core/ws/WebSocketClientManager.mjs.map +1 -1
  188. package/lib/core/ws/WebSocketIndexedDBClientStore.js +1 -0
  189. package/lib/core/ws/WebSocketIndexedDBClientStore.js.map +1 -1
  190. package/lib/core/ws/WebSocketIndexedDBClientStore.mjs +1 -0
  191. package/lib/core/ws/WebSocketIndexedDBClientStore.mjs.map +1 -1
  192. package/lib/core/ws/WebSocketMemoryClientStore.js +1 -0
  193. package/lib/core/ws/WebSocketMemoryClientStore.js.map +1 -1
  194. package/lib/core/ws/WebSocketMemoryClientStore.mjs +1 -0
  195. package/lib/core/ws/WebSocketMemoryClientStore.mjs.map +1 -1
  196. package/lib/core/ws/handleWebSocketEvent.d.mts +1 -1
  197. package/lib/core/ws/handleWebSocketEvent.d.ts +1 -1
  198. package/lib/core/ws/handleWebSocketEvent.js.map +1 -1
  199. package/lib/core/ws/handleWebSocketEvent.mjs.map +1 -1
  200. package/lib/core/ws.d.mts +17 -4
  201. package/lib/core/ws.d.ts +17 -4
  202. package/lib/core/ws.js +30 -5
  203. package/lib/core/ws.js.map +1 -1
  204. package/lib/core/ws.mjs +34 -6
  205. package/lib/core/ws.mjs.map +1 -1
  206. package/lib/iife/index.js +10138 -6034
  207. package/lib/iife/index.js.map +1 -1
  208. package/lib/mockServiceWorker.js +21 -9
  209. package/lib/native/index.js.map +1 -1
  210. package/lib/native/index.mjs.map +1 -1
  211. package/lib/node/index.d.mts +1 -1
  212. package/lib/node/index.d.ts +1 -1
  213. package/lib/node/index.js +2 -0
  214. package/lib/node/index.js.map +1 -1
  215. package/lib/node/index.mjs +1 -0
  216. package/lib/node/index.mjs.map +1 -1
  217. package/lib/shims/cookie.js +152 -62
  218. package/lib/shims/cookie.mjs +152 -62
  219. package/package.json +50 -69
  220. package/src/browser/glossary.ts +1 -1
  221. package/src/browser/setup-worker.ts +2 -2
  222. package/src/browser/sources/service-worker-source.ts +142 -40
  223. package/src/browser/utils/deserializeRequest.ts +2 -2
  224. package/src/browser/utils/pruneGetRequestBody.ts +3 -3
  225. package/src/browser/utils/should-invalidate-worker.test.ts +122 -0
  226. package/src/browser/utils/should-invalidate-worker.ts +13 -0
  227. package/src/browser/utils/workerChannel.ts +43 -21
  228. package/src/core/experimental/define-network.ts +44 -15
  229. package/src/core/experimental/frames/http-frame.test.ts +8 -2
  230. package/src/core/experimental/frames/http-frame.ts +12 -4
  231. package/src/core/experimental/frames/websocket-frame.test.ts +2 -4
  232. package/src/core/experimental/frames/websocket-frame.ts +3 -2
  233. package/src/core/experimental/handlers-controller.test.ts +139 -5
  234. package/src/core/experimental/handlers-controller.ts +39 -10
  235. package/src/core/experimental/index.ts +11 -1
  236. package/src/core/experimental/on-unhandled-frame.test.ts +2 -4
  237. package/src/core/experimental/setup-api.ts +4 -8
  238. package/src/core/experimental/sources/interceptor-source.ts +36 -16
  239. package/src/core/experimental/sources/network-source.ts +1 -1
  240. package/src/core/graphql.ts +8 -8
  241. package/src/core/handlers/GraphQLHandler.test.ts +3 -4
  242. package/src/core/handlers/GraphQLHandler.ts +15 -11
  243. package/src/core/handlers/HttpHandler.test.ts +92 -2
  244. package/src/core/handlers/HttpHandler.ts +7 -7
  245. package/src/core/handlers/RequestHandler.ts +329 -22
  246. package/src/core/handlers/WebSocketHandler.test.ts +58 -0
  247. package/src/core/handlers/WebSocketHandler.ts +37 -8
  248. package/src/core/http.ts +5 -5
  249. package/src/core/sse.ts +217 -73
  250. package/src/core/utils/HttpResponse/decorators.ts +28 -22
  251. package/src/core/utils/cookieStore.ts +1 -1
  252. package/src/core/utils/executeHandlers.ts +2 -4
  253. package/src/core/utils/handleRequest.test.ts +5 -4
  254. package/src/core/utils/handleRequest.ts +3 -3
  255. package/src/core/utils/internal/Disposable.ts +22 -1
  256. package/src/core/utils/internal/attachSiblingHandlers.ts +28 -0
  257. package/src/core/utils/internal/observe-response-body-stream.test.ts +64 -0
  258. package/src/core/utils/internal/observe-response-body-stream.ts +77 -0
  259. package/src/core/utils/internal/parseGraphQLRequest.test.ts +2 -4
  260. package/src/core/utils/internal/parseMultipartData.ts +1 -1
  261. package/src/core/utils/internal/pipeEvents.ts +2 -1
  262. package/src/core/utils/request/onUnhandledRequest.test.ts +2 -4
  263. package/src/core/utils/request/storeResponseCookies.ts +2 -4
  264. package/src/core/ws/WebSocketClientManager.test.ts +2 -4
  265. package/src/core/ws/WebSocketClientManager.ts +1 -1
  266. package/src/core/ws/WebSocketIndexedDBClientStore.ts +3 -5
  267. package/src/core/ws/WebSocketMemoryClientStore.ts +3 -5
  268. package/src/core/ws/handleWebSocketEvent.ts +3 -3
  269. package/src/core/ws.ts +66 -7
  270. package/src/mockServiceWorker.js +19 -7
  271. package/src/native/index.ts +2 -2
  272. package/src/node/async-handlers-controller.ts +2 -2
  273. package/src/node/index.ts +1 -0
  274. package/src/node/setup-server-common.ts +4 -4
  275. package/src/node/setup-server.ts +2 -2
  276. package/lib/core/utils/internal/requestHandlerUtils.d.mts +0 -12
  277. package/lib/core/utils/internal/requestHandlerUtils.d.ts +0 -12
  278. package/lib/core/utils/internal/requestHandlerUtils.js +0 -37
  279. package/lib/core/utils/internal/requestHandlerUtils.js.map +0 -1
  280. package/lib/core/utils/internal/requestHandlerUtils.mjs +0 -17
  281. package/lib/core/utils/internal/requestHandlerUtils.mjs.map +0 -1
  282. package/src/core/utils/internal/requestHandlerUtils.ts +0 -21
@@ -534,7 +534,7 @@ var _Emitter = class {
534
534
  var Emitter = _Emitter;
535
535
  Emitter.defaultMaxListeners = 10;
536
536
 
537
- // node_modules/.pnpm/@mswjs+interceptors@0.41.2/node_modules/@mswjs/interceptors/lib/browser/createRequestId-DQcIlohW.mjs
537
+ // node_modules/.pnpm/@mswjs+interceptors@0.41.9/node_modules/@mswjs/interceptors/lib/browser/createRequestId-DYCsFHOi.mjs
538
538
  var INTERNAL_REQUEST_ID_HEADER_NAME = "x-interceptors-internal-request-id";
539
539
  function getGlobalSymbol(symbol) {
540
540
  return globalThis[symbol] || void 0;
@@ -683,7 +683,7 @@ function createRequestId() {
683
683
  return Math.random().toString(16).slice(2);
684
684
  }
685
685
 
686
- // node_modules/.pnpm/@mswjs+interceptors@0.41.2/node_modules/@mswjs/interceptors/lib/browser/resolveWebSocketUrl-C83-x9iE.mjs
686
+ // node_modules/.pnpm/@mswjs+interceptors@0.41.9/node_modules/@mswjs/interceptors/lib/browser/resolveWebSocketUrl-C83-x9iE.mjs
687
687
  function resolveWebSocketUrl(url) {
688
688
  if (typeof url === "string") return resolveWebSocketUrl(new URL(url, typeof location !== "undefined" ? location.href : void 0));
689
689
  if (url.protocol === "http:") url.protocol = "ws:";
@@ -694,15 +694,72 @@ function resolveWebSocketUrl(url) {
694
694
  return url.href;
695
695
  }
696
696
 
697
- // node_modules/.pnpm/@mswjs+interceptors@0.41.2/node_modules/@mswjs/interceptors/lib/browser/hasConfigurableGlobal-npXitu1-.mjs
697
+ // node_modules/.pnpm/@mswjs+interceptors@0.41.9/node_modules/@mswjs/interceptors/lib/browser/hasConfigurableGlobal-C8zq1MCg.mjs
698
698
  async function emitAsync(emitter, eventName, ...data) {
699
699
  const listeners = emitter.listeners(eventName);
700
700
  if (listeners.length === 0) return;
701
701
  for (const listener of listeners) await listener.apply(emitter, data);
702
702
  }
703
+ var PatchesRegistry = class {
704
+ #replacements = /* @__PURE__ */ new Map();
705
+ applyPatch(owner, key, getNextValue) {
706
+ const ownerReplacements = this.#replacements.get(owner);
707
+ invariant(!ownerReplacements?.has(key), `Failed to replace a global value at "${String(key)}": already replaced.`);
708
+ const match = getDeepPropertyDescriptor(owner, key);
709
+ if (typeof match === "undefined") {
710
+ console.warn(`Failed to replace a global value at "${String(key)}": not a global value.`);
711
+ return () => {
712
+ };
713
+ }
714
+ if (match.descriptor.configurable) Object.defineProperty(owner, key, {
715
+ value: getNextValue(owner[key]),
716
+ enumerable: true,
717
+ configurable: true
718
+ });
719
+ else if (match.descriptor.writable) owner[key] = getNextValue(owner[key]);
720
+ else throw new Error(`Failed to patch a non-configurable non-writable property "${key.toString()}"`);
721
+ const restorePatch = () => {
722
+ const currentReplacements = this.#replacements.get(owner);
723
+ if (!currentReplacements?.has(key)) return;
724
+ if (match.owner === owner)
725
+ Object.defineProperty(match.owner, key, match.descriptor);
726
+ else
727
+ Reflect.deleteProperty(owner, key);
728
+ currentReplacements.delete(key);
729
+ if (currentReplacements.size === 0) this.#replacements.delete(owner);
730
+ };
731
+ if (ownerReplacements) ownerReplacements.set(key, restorePatch);
732
+ else this.#replacements.set(owner, /* @__PURE__ */ new Map([[key, restorePatch]]));
733
+ return restorePatch;
734
+ }
735
+ restoreAllPatches() {
736
+ const errors = [];
737
+ for (const [, ownerReplacements] of this.#replacements) for (const [, restorePatch] of ownerReplacements) try {
738
+ restorePatch();
739
+ } catch (error2) {
740
+ if (error2 instanceof Error) errors.push(error2);
741
+ else throw error2;
742
+ }
743
+ if (errors.length > 0) throw new AggregateError(errors, "FOO!");
744
+ }
745
+ };
746
+ var patchesRegistry = new PatchesRegistry();
747
+ function getDeepPropertyDescriptor(owner, key) {
748
+ let currentOwner = owner;
749
+ let descriptor;
750
+ while (currentOwner) {
751
+ descriptor = Object.getOwnPropertyDescriptor(currentOwner, key);
752
+ if (descriptor) return {
753
+ owner: currentOwner,
754
+ descriptor
755
+ };
756
+ currentOwner = Object.getPrototypeOf(currentOwner);
757
+ }
758
+ }
703
759
  function hasConfigurableGlobal(propertyName) {
704
- const descriptor = Object.getOwnPropertyDescriptor(globalThis, propertyName);
705
- if (typeof descriptor === "undefined") return false;
760
+ const match = getDeepPropertyDescriptor(globalThis, propertyName);
761
+ if (typeof match === "undefined") return false;
762
+ const { descriptor } = match;
706
763
  if (typeof descriptor.get === "function" && typeof descriptor.get() === "undefined") return false;
707
764
  if (typeof descriptor.get === "undefined" && descriptor.value == null) return false;
708
765
  if (typeof descriptor.set === "undefined" && !descriptor.configurable) {
@@ -778,7 +835,7 @@ var DeferredPromise = class extends Promise {
778
835
  }
779
836
  };
780
837
 
781
- // node_modules/.pnpm/@mswjs+interceptors@0.41.2/node_modules/@mswjs/interceptors/lib/browser/interceptors/WebSocket/index.mjs
838
+ // node_modules/.pnpm/@mswjs+interceptors@0.41.9/node_modules/@mswjs/interceptors/lib/browser/interceptors/WebSocket/index.mjs
782
839
  function bindEvent(target, event) {
783
840
  Object.defineProperties(event, {
784
841
  target: {
@@ -794,8 +851,8 @@ function bindEvent(target, event) {
794
851
  });
795
852
  return event;
796
853
  }
797
- var kCancelable = Symbol("kCancelable");
798
- var kDefaultPrevented = Symbol("kDefaultPrevented");
854
+ var kCancelable = /* @__PURE__ */ Symbol("kCancelable");
855
+ var kDefaultPrevented = /* @__PURE__ */ Symbol("kDefaultPrevented");
799
856
  var CancelableMessageEvent = class extends MessageEvent {
800
857
  constructor(type, init) {
801
858
  super(type, init);
@@ -848,8 +905,8 @@ var CancelableCloseEvent = class extends CloseEvent {
848
905
  if (this.cancelable && !this[kDefaultPrevented]) this[kDefaultPrevented] = true;
849
906
  }
850
907
  };
851
- var kEmitter$1 = Symbol("kEmitter");
852
- var kBoundListener$1 = Symbol("kBoundListener");
908
+ var kEmitter$1 = /* @__PURE__ */ Symbol("kEmitter");
909
+ var kBoundListener$1 = /* @__PURE__ */ Symbol("kBoundListener");
853
910
  var WebSocketClientConnection = class {
854
911
  constructor(socket, transport) {
855
912
  this.socket = socket;
@@ -906,9 +963,9 @@ var WebSocketClientConnection = class {
906
963
  }
907
964
  };
908
965
  var WEBSOCKET_CLOSE_CODE_RANGE_ERROR = "InvalidAccessError: close code out of user configurable range";
909
- var kPassthroughPromise = Symbol("kPassthroughPromise");
910
- var kOnSend = Symbol("kOnSend");
911
- var kClose = Symbol("kClose");
966
+ var kPassthroughPromise = /* @__PURE__ */ Symbol("kPassthroughPromise");
967
+ var kOnSend = /* @__PURE__ */ Symbol("kOnSend");
968
+ var kClose = /* @__PURE__ */ Symbol("kClose");
912
969
  var WebSocketOverride = class extends EventTarget {
913
970
  static {
914
971
  this.CONNECTING = 0;
@@ -1028,9 +1085,9 @@ function getDataSize(data) {
1028
1085
  if (data instanceof Blob) return data.size;
1029
1086
  return data.byteLength;
1030
1087
  }
1031
- var kEmitter = Symbol("kEmitter");
1032
- var kBoundListener = Symbol("kBoundListener");
1033
- var kSend = Symbol("kSend");
1088
+ var kEmitter = /* @__PURE__ */ Symbol("kEmitter");
1089
+ var kBoundListener = /* @__PURE__ */ Symbol("kBoundListener");
1090
+ var kSend = /* @__PURE__ */ Symbol("kSend");
1034
1091
  var WebSocketServerConnection = class {
1035
1092
  constructor(client, transport, createConnection) {
1036
1093
  this.client = client;
@@ -1230,7 +1287,7 @@ var WebSocketClassTransport = class extends EventTarget {
1230
1287
  };
1231
1288
  var WebSocketInterceptor = class WebSocketInterceptor2 extends Interceptor {
1232
1289
  static {
1233
- this.symbol = Symbol("websocket");
1290
+ this.symbol = /* @__PURE__ */ Symbol.for("websocket-interceptor");
1234
1291
  }
1235
1292
  constructor() {
1236
1293
  super(WebSocketInterceptor2.symbol);
@@ -1239,7 +1296,7 @@ var WebSocketInterceptor = class WebSocketInterceptor2 extends Interceptor {
1239
1296
  return hasConfigurableGlobal("WebSocket");
1240
1297
  }
1241
1298
  setup() {
1242
- const originalWebSocketDescriptor = Object.getOwnPropertyDescriptor(globalThis, "WebSocket");
1299
+ const logger = this.logger.extend("setup");
1243
1300
  const WebSocketProxy = new Proxy(globalThis.WebSocket, { construct: (target, args, newTarget) => {
1244
1301
  const [url, protocols] = args;
1245
1302
  const createConnection = () => {
@@ -1275,13 +1332,9 @@ var WebSocketInterceptor = class WebSocketInterceptor2 extends Interceptor {
1275
1332
  });
1276
1333
  return socket;
1277
1334
  } });
1278
- Object.defineProperty(globalThis, "WebSocket", {
1279
- value: WebSocketProxy,
1280
- configurable: true
1281
- });
1282
- this.subscriptions.push(() => {
1283
- Object.defineProperty(globalThis, "WebSocket", originalWebSocketDescriptor);
1284
- });
1335
+ logger.info("patching global WebSocket...");
1336
+ this.subscriptions.push(patchesRegistry.applyPatch(globalThis, "WebSocket", () => WebSocketProxy));
1337
+ logger.info("global WebSocket patched!", globalThis.WebSocket.name);
1285
1338
  }
1286
1339
  };
1287
1340
 
@@ -1311,8 +1364,73 @@ function supportsReadableStreamTransfer() {
1311
1364
  }
1312
1365
  }
1313
1366
 
1314
- // node_modules/.pnpm/@mswjs+interceptors@0.41.2/node_modules/@mswjs/interceptors/lib/browser/getRawRequest-BTaNLFr0.mjs
1315
- var IS_PATCHED_MODULE = Symbol("isPatchedModule");
1367
+ // node_modules/.pnpm/@open-draft+deferred-promise@3.0.0/node_modules/@open-draft/deferred-promise/build/index.mjs
1368
+ function createDeferredExecutor2() {
1369
+ const executor = ((resolve, reject) => {
1370
+ executor.state = "pending";
1371
+ executor.resolve = (data) => {
1372
+ if (executor.state !== "pending") return;
1373
+ executor.result = data;
1374
+ const onFulfilled = (value) => {
1375
+ executor.state = "fulfilled";
1376
+ return value;
1377
+ };
1378
+ return resolve(data instanceof Promise ? data : Promise.resolve(data).then(onFulfilled));
1379
+ };
1380
+ executor.reject = (reason) => {
1381
+ if (executor.state !== "pending") return;
1382
+ queueMicrotask(() => {
1383
+ executor.state = "rejected";
1384
+ });
1385
+ return reject(executor.rejectionReason = reason);
1386
+ };
1387
+ });
1388
+ return executor;
1389
+ }
1390
+ var DeferredPromise2 = class extends Promise {
1391
+ #executor;
1392
+ resolve;
1393
+ reject;
1394
+ constructor(executor = null) {
1395
+ const deferredExecutor = createDeferredExecutor2();
1396
+ super((originalResolve, originalReject) => {
1397
+ deferredExecutor(originalResolve, originalReject);
1398
+ executor?.(deferredExecutor.resolve, deferredExecutor.reject);
1399
+ });
1400
+ this.#executor = deferredExecutor;
1401
+ this.resolve = this.#executor.resolve;
1402
+ this.reject = this.#executor.reject;
1403
+ }
1404
+ get state() {
1405
+ return this.#executor.state;
1406
+ }
1407
+ get rejectionReason() {
1408
+ return this.#executor.rejectionReason;
1409
+ }
1410
+ then(onFulfilled, onRejected) {
1411
+ return this.#decorate(super.then(onFulfilled, onRejected));
1412
+ }
1413
+ catch(onRejected) {
1414
+ return this.#decorate(super.catch(onRejected));
1415
+ }
1416
+ finally(onfinally) {
1417
+ return this.#decorate(super.finally(onfinally));
1418
+ }
1419
+ #decorate(promise) {
1420
+ return Object.defineProperties(promise, {
1421
+ resolve: {
1422
+ configurable: true,
1423
+ value: this.resolve
1424
+ },
1425
+ reject: {
1426
+ configurable: true,
1427
+ value: this.reject
1428
+ }
1429
+ });
1430
+ }
1431
+ };
1432
+
1433
+ // node_modules/.pnpm/@mswjs+interceptors@0.41.9/node_modules/@mswjs/interceptors/lib/browser/getRawRequest-B1BqgWG6.mjs
1316
1434
  var InterceptorError = class InterceptorError2 extends Error {
1317
1435
  constructor(message) {
1318
1436
  super(message);
@@ -1394,6 +1512,68 @@ function getValueBySymbol(symbolName, source) {
1394
1512
  });
1395
1513
  if (symbol) return Reflect.get(source, symbol);
1396
1514
  }
1515
+ var FetchRequest = class FetchRequest2 extends Request {
1516
+ static #resolveProperty(input, init = {}, key) {
1517
+ return init[key] ?? (input instanceof Request ? input[key] : void 0);
1518
+ }
1519
+ /**
1520
+ * Check if the given request method is configurable.
1521
+ * @see https://fetch.spec.whatwg.org/#methods
1522
+ */
1523
+ static isConfigurableMethod(method) {
1524
+ return method !== "CONNECT" && method !== "TRACE" && method !== "TRACK";
1525
+ }
1526
+ static isMethodWithBody(method) {
1527
+ return method !== "HEAD" && method !== "GET" && FetchRequest2.isConfigurableMethod(method);
1528
+ }
1529
+ /**
1530
+ * Check if the given request `mode` is configurable.
1531
+ * @see https://fetch.spec.whatwg.org/#concept-request-mode
1532
+ */
1533
+ static isConfigurableMode(mode) {
1534
+ return mode !== "navigate" && mode !== "websocket" && mode !== "webtransport";
1535
+ }
1536
+ constructor(input, init) {
1537
+ const method = FetchRequest2.#resolveProperty(input, init, "method") || "GET";
1538
+ const safeMethod = FetchRequest2.isConfigurableMethod(method) ? method : "GET";
1539
+ const hasExplicitBody = init != null && "body" in init;
1540
+ const bodyInit = !FetchRequest2.isMethodWithBody(method) ? { body: void 0 } : hasExplicitBody ? { body: init.body } : {};
1541
+ const mode = FetchRequest2.#resolveProperty(input, init, "mode") ?? void 0;
1542
+ const safeMode = FetchRequest2.isConfigurableMode(mode) ? mode : void 0;
1543
+ super(input, {
1544
+ ...init || {},
1545
+ method: safeMethod,
1546
+ mode: safeMode,
1547
+ duplex: init?.duplex ?? (FetchRequest2.isMethodWithBody(method) ? "half" : void 0),
1548
+ ...bodyInit
1549
+ });
1550
+ if (method !== safeMethod) this.#setInternalProperty("method", method);
1551
+ if (method === "CONNECT") {
1552
+ const url = new URL(input instanceof Request ? input.url : input);
1553
+ let authority;
1554
+ if (url.protocol === "localhost:") authority = url.href;
1555
+ else authority = url.pathname.replace(/^\/+/, "");
1556
+ Object.defineProperty(this, "url", {
1557
+ get: () => authority,
1558
+ enumerable: true,
1559
+ configurable: true
1560
+ });
1561
+ }
1562
+ if (mode != null && mode !== safeMode) this.#setInternalProperty("mode", mode);
1563
+ }
1564
+ #setInternalProperty(key, value) {
1565
+ const internalState = getValueBySymbol("state", this);
1566
+ if (internalState) Reflect.set(internalState, key, value);
1567
+ else Object.defineProperty(this, key, {
1568
+ value,
1569
+ enumerable: true,
1570
+ configurable: true,
1571
+ writable: false
1572
+ });
1573
+ }
1574
+ };
1575
+ var kStatus = /* @__PURE__ */ Symbol("kStatus");
1576
+ var kUrl = /* @__PURE__ */ Symbol("kUrl");
1397
1577
  var FetchResponse = class FetchResponse2 extends Response {
1398
1578
  static {
1399
1579
  this.STATUS_CODES_WITHOUT_BODY = [
@@ -1426,6 +1606,20 @@ var FetchResponse = class FetchResponse2 extends Response {
1426
1606
  static isResponseWithBody(status) {
1427
1607
  return !FetchResponse2.STATUS_CODES_WITHOUT_BODY.includes(status);
1428
1608
  }
1609
+ static setStatus(status, response) {
1610
+ const internalState = getValueBySymbol("state", response);
1611
+ if (internalState) internalState.status = status;
1612
+ else Object.defineProperty(response, "status", {
1613
+ value: status,
1614
+ enumerable: true,
1615
+ configurable: true,
1616
+ writable: false
1617
+ });
1618
+ Object.defineProperty(response, kStatus, {
1619
+ value: status,
1620
+ enumerable: false
1621
+ });
1622
+ }
1429
1623
  static setUrl(url, response) {
1430
1624
  if (!url || url === "about:" || !canParseUrl(url)) return;
1431
1625
  const state = getValueBySymbol("state", response);
@@ -1436,6 +1630,10 @@ var FetchResponse = class FetchResponse2 extends Response {
1436
1630
  configurable: true,
1437
1631
  writable: false
1438
1632
  });
1633
+ Object.defineProperty(response, kUrl, {
1634
+ value: url,
1635
+ enumerable: false
1636
+ });
1439
1637
  }
1440
1638
  /**
1441
1639
  * Parses the given raw HTTP headers into a Fetch API `Headers` instance.
@@ -1445,6 +1643,27 @@ var FetchResponse = class FetchResponse2 extends Response {
1445
1643
  for (let line = 0; line < rawHeaders.length; line += 2) headers.append(rawHeaders[line], rawHeaders[line + 1]);
1446
1644
  return headers;
1447
1645
  }
1646
+ /**
1647
+ * Safely clones the given `Response`.
1648
+ * Coerces response clone exceptions into 500 mocked responses.
1649
+ * Handy in the environments that introduce arbitrary response
1650
+ * cloning restrictions, like "101 Switching Protocols" cloning
1651
+ * in "miniflare".
1652
+ */
1653
+ static clone(response) {
1654
+ try {
1655
+ return response.clone();
1656
+ } catch (error2) {
1657
+ return Response.json(error2 instanceof Error ? {
1658
+ name: error2.name,
1659
+ message: error2.message,
1660
+ stack: error2.stack
1661
+ } : {}, {
1662
+ status: 500,
1663
+ statusText: "Unclonable Response"
1664
+ });
1665
+ }
1666
+ }
1448
1667
  constructor(body, init = {}) {
1449
1668
  const status = init.status ?? 200;
1450
1669
  const safeStatus = FetchResponse2.isConfigurableStatusCode(status) ? status : 200;
@@ -1454,25 +1673,24 @@ var FetchResponse = class FetchResponse2 extends Response {
1454
1673
  statusText: init.statusText,
1455
1674
  headers: init.headers
1456
1675
  });
1457
- if (status !== safeStatus) {
1458
- const state = getValueBySymbol("state", this);
1459
- if (state) state.status = status;
1460
- else Object.defineProperty(this, "status", {
1461
- value: status,
1462
- enumerable: true,
1463
- configurable: true,
1464
- writable: false
1465
- });
1466
- }
1676
+ if (status !== safeStatus) FetchResponse2.setStatus(status, this);
1467
1677
  FetchResponse2.setUrl(init.url, this);
1468
1678
  }
1679
+ clone() {
1680
+ const clonedResponse = super.clone();
1681
+ const customStatus = Reflect.get(this, kStatus);
1682
+ if (customStatus) FetchResponse2.setStatus(customStatus, clonedResponse);
1683
+ const customUrl = Reflect.get(this, kUrl);
1684
+ if (customUrl) FetchResponse2.setUrl(customUrl, clonedResponse);
1685
+ return clonedResponse;
1686
+ }
1469
1687
  };
1470
- var kRawRequest = Symbol("kRawRequest");
1688
+ var kRawRequest = /* @__PURE__ */ Symbol("kRawRequest");
1471
1689
  function setRawRequest(request, rawRequest) {
1472
1690
  Reflect.set(request, kRawRequest, rawRequest);
1473
1691
  }
1474
1692
 
1475
- // node_modules/.pnpm/@mswjs+interceptors@0.41.2/node_modules/@mswjs/interceptors/lib/browser/bufferUtils-BiiO6HZv.mjs
1693
+ // node_modules/.pnpm/@mswjs+interceptors@0.41.9/node_modules/@mswjs/interceptors/lib/browser/bufferUtils-BiiO6HZv.mjs
1476
1694
  var encoder = new TextEncoder();
1477
1695
  function encodeBuffer(text) {
1478
1696
  return encoder.encode(text);
@@ -1584,7 +1802,7 @@ Learn more about creating the Service Worker script: https://mswjs.io/docs/cli/i
1584
1802
  return registrationResult;
1585
1803
  };
1586
1804
 
1587
- // node_modules/.pnpm/rettime@0.10.1/node_modules/rettime/build/lens-list.mjs
1805
+ // node_modules/.pnpm/rettime@0.11.11/node_modules/rettime/build/lens-list.mjs
1588
1806
  var LensList = class {
1589
1807
  #list;
1590
1808
  #lens;
@@ -1626,11 +1844,17 @@ var LensList = class {
1626
1844
  }
1627
1845
  /**
1628
1846
  * Delete the value belonging to the given key.
1847
+ * Returns `true` if the value was present and removed, `false` otherwise.
1629
1848
  */
1630
1849
  delete(key, value) {
1631
- if (this.size === 0) return;
1632
- this.#list = this.#list.filter((item) => item[1] !== value);
1633
- for (const [existingKey, values] of this.#lens) if (existingKey === key && values.includes(value)) values.splice(values.indexOf(value), 1);
1850
+ if (this.size === 0) return false;
1851
+ const values = this.#lens.get(key);
1852
+ if (!values) return false;
1853
+ const index = values.indexOf(value);
1854
+ if (index === -1) return false;
1855
+ values.splice(index, 1);
1856
+ this.#list.splice(this.#list.findIndex((item) => item[0] === key && item[1] === value), 1);
1857
+ return true;
1634
1858
  }
1635
1859
  /**
1636
1860
  * Delete all values belogning to the given key.
@@ -1653,10 +1877,10 @@ var LensList = class {
1653
1877
  }
1654
1878
  };
1655
1879
 
1656
- // node_modules/.pnpm/rettime@0.10.1/node_modules/rettime/build/index.mjs
1657
- var kDefaultPrevented2 = Symbol("kDefaultPrevented");
1658
- var kPropagationStopped = Symbol("kPropagationStopped");
1659
- var kImmediatePropagationStopped = Symbol("kImmediatePropagationStopped");
1880
+ // node_modules/.pnpm/rettime@0.11.11/node_modules/rettime/build/index.mjs
1881
+ var kDefaultPrevented2 = /* @__PURE__ */ Symbol("kDefaultPrevented");
1882
+ var kPropagationStopped = /* @__PURE__ */ Symbol("kPropagationStopped");
1883
+ var kImmediatePropagationStopped = /* @__PURE__ */ Symbol("kImmediatePropagationStopped");
1660
1884
  var TypedEvent = class extends MessageEvent {
1661
1885
  /**
1662
1886
  * @note Keep a placeholder property with the return type
@@ -1683,11 +1907,68 @@ var TypedEvent = class extends MessageEvent {
1683
1907
  this[kImmediatePropagationStopped] = true;
1684
1908
  }
1685
1909
  };
1686
- var kListenerOptions = Symbol("kListenerOptions");
1687
1910
  var Emitter2 = class {
1688
1911
  #listeners;
1912
+ #listenerOptions;
1913
+ #listenerAbortCleanups;
1914
+ #typelessListeners;
1915
+ #hookListeners;
1916
+ #hookListenerOptions;
1917
+ #hookListenerAbortCleanups;
1918
+ hooks;
1689
1919
  constructor() {
1690
1920
  this.#listeners = new LensList();
1921
+ this.#listenerOptions = /* @__PURE__ */ new WeakMap();
1922
+ this.#listenerAbortCleanups = /* @__PURE__ */ new WeakMap();
1923
+ this.#typelessListeners = /* @__PURE__ */ new WeakSet();
1924
+ this.#hookListeners = new LensList();
1925
+ this.#hookListenerOptions = /* @__PURE__ */ new WeakMap();
1926
+ this.#hookListenerAbortCleanups = /* @__PURE__ */ new WeakMap();
1927
+ this.hooks = {
1928
+ on: (hook, callback, options) => {
1929
+ if (options?.signal?.aborted) return;
1930
+ if (options?.once) {
1931
+ const original = callback;
1932
+ const wrapper = ((...args) => {
1933
+ this.#deleteHookListener(hook, wrapper);
1934
+ return original(...args);
1935
+ });
1936
+ callback = wrapper;
1937
+ }
1938
+ this.#hookListeners.append(hook, callback);
1939
+ if (options) this.#hookListenerOptions.set(callback, options);
1940
+ if (options?.signal) {
1941
+ const { signal } = options;
1942
+ const onAbort = () => {
1943
+ this.#deleteHookListener(hook, callback);
1944
+ };
1945
+ signal.addEventListener("abort", onAbort, { once: true });
1946
+ this.#hookListenerAbortCleanups.set(callback, () => {
1947
+ signal.removeEventListener("abort", onAbort);
1948
+ });
1949
+ }
1950
+ },
1951
+ removeListener: (hook, callback) => {
1952
+ this.#deleteHookListener(hook, callback);
1953
+ }
1954
+ };
1955
+ }
1956
+ #deleteHookListener(hook, callback) {
1957
+ this.#hookListeners.delete(hook, callback);
1958
+ const cleanup = this.#hookListenerAbortCleanups.get(callback);
1959
+ if (cleanup) {
1960
+ cleanup();
1961
+ this.#hookListenerAbortCleanups.delete(callback);
1962
+ }
1963
+ }
1964
+ #deleteListener(type, listener) {
1965
+ const removed = this.#listeners.delete(type, listener);
1966
+ const cleanup = this.#listenerAbortCleanups.get(listener);
1967
+ if (cleanup) {
1968
+ cleanup();
1969
+ this.#listenerAbortCleanups.delete(listener);
1970
+ }
1971
+ return removed;
1691
1972
  }
1692
1973
  /**
1693
1974
  * Adds a listener for the given event type.
@@ -1789,7 +2070,9 @@ var Emitter2 = class {
1789
2070
  * Removes a listener for the given event type.
1790
2071
  */
1791
2072
  removeListener(type, listener) {
1792
- this.#listeners.delete(type, listener);
2073
+ const options = this.#listenerOptions.get(listener);
2074
+ if (!this.#deleteListener(type, listener)) return;
2075
+ for (const hook of this.#hookListeners.get("removeListener").slice()) hook(type, listener, options);
1793
2076
  }
1794
2077
  /**
1795
2078
  * Removes all listeners for the given event type.
@@ -1797,10 +2080,12 @@ var Emitter2 = class {
1797
2080
  */
1798
2081
  removeAllListeners(type) {
1799
2082
  if (type == null) {
1800
- this.#listeners.clear();
2083
+ for (const [listenerType, listeners$1] of this.#listeners.entries()) while (listeners$1.length > 0) this.removeListener(listenerType, listeners$1[0]);
2084
+ for (const [hookType, hookListener] of [...this.#hookListeners]) if (!this.#hookListenerOptions.get(hookListener)?.persist) this.#deleteHookListener(hookType, hookListener);
1801
2085
  return;
1802
2086
  }
1803
- this.#listeners.deleteAll(type);
2087
+ const listeners = this.listeners(type);
2088
+ while (listeners.length > 0) this.removeListener(type, listeners[0]);
1804
2089
  }
1805
2090
  /**
1806
2091
  * Returns the list of listeners for the given event type.
@@ -1819,25 +2104,31 @@ var Emitter2 = class {
1819
2104
  return this.listeners(type).length;
1820
2105
  }
1821
2106
  #addListener(type, listener, options, insertMode = "append") {
2107
+ if (options?.signal?.aborted) return;
2108
+ for (const hook of this.#hookListeners.get("newListener").slice()) hook(type, listener, options);
2109
+ if (type === "*") this.#typelessListeners.add(listener);
1822
2110
  if (insertMode === "prepend") this.#listeners.prepend(type, listener);
1823
2111
  else this.#listeners.append(type, listener);
1824
2112
  if (options) {
1825
- Object.defineProperty(listener, kListenerOptions, {
1826
- value: options,
1827
- enumerable: false,
1828
- writable: false
1829
- });
1830
- if (options.signal) options.signal.addEventListener("abort", () => {
1831
- this.removeListener(type, listener);
1832
- }, { once: true });
2113
+ this.#listenerOptions.set(listener, options);
2114
+ if (options.signal) {
2115
+ const { signal } = options;
2116
+ const onAbort = () => {
2117
+ this.removeListener(type, listener);
2118
+ };
2119
+ signal.addEventListener("abort", onAbort, { once: true });
2120
+ this.#listenerAbortCleanups.set(listener, () => {
2121
+ signal.removeEventListener("abort", onAbort);
2122
+ });
2123
+ }
1833
2124
  }
1834
2125
  }
1835
2126
  #proxyEvent(event) {
1836
2127
  const { stopPropagation } = event;
1837
- event.stopPropagation = new Proxy(event.stopPropagation, { apply: (target, thisArg, argArray) => {
2128
+ event.stopPropagation = () => {
1838
2129
  event[kPropagationStopped] = this;
1839
- return Reflect.apply(target, thisArg, argArray);
1840
- } });
2130
+ stopPropagation.call(event);
2131
+ };
1841
2132
  return {
1842
2133
  event,
1843
2134
  revoke() {
@@ -1846,22 +2137,30 @@ var Emitter2 = class {
1846
2137
  };
1847
2138
  }
1848
2139
  #callListener(event, listener) {
2140
+ for (const hook of this.#hookListeners.get("beforeEmit").slice()) if (hook(event) === false) return;
1849
2141
  const returnValue = listener.call(this, event);
1850
- if (listener[kListenerOptions]?.once) {
1851
- const key = this.#isTypelessListener(listener) ? "*" : event.type;
1852
- this.#listeners.delete(key, listener);
2142
+ const options = this.#listenerOptions.get(listener);
2143
+ if (options?.once) {
2144
+ const type = this.#isTypelessListener(listener) ? "*" : event.type;
2145
+ if (this.#deleteListener(type, listener)) for (const hook of this.#hookListeners.get("removeListener").slice()) hook(type, listener, options);
1853
2146
  }
1854
2147
  return returnValue;
1855
2148
  }
1856
2149
  /**
1857
2150
  * Return a list of all event listeners relevant for the given event type.
1858
2151
  * This includes the explicit event listeners and also typeless event listeners.
2152
+ *
2153
+ * @note Snapshot the matching listeners before yielding. Listeners can add or
2154
+ * remove other listeners during emission (e.g. `earlyOn` unshifts `#list`),
2155
+ * which would otherwise shift the live iterator and re-yield prior entries.
1859
2156
  */
1860
2157
  *#matchListeners(type) {
1861
- for (const [key, listener] of this.#listeners) if (key === "*" || key === type) yield listener;
2158
+ const snapshot = [];
2159
+ for (const [key, listener] of this.#listeners) if (key === "*" || key === type) snapshot.push(listener);
2160
+ yield* snapshot;
1862
2161
  }
1863
2162
  #isTypelessListener(listener) {
1864
- return this.#listeners.get("*").includes(listener);
2163
+ return this.#typelessListeners.has(listener);
1865
2164
  }
1866
2165
  };
1867
2166
 
@@ -1894,21 +2193,31 @@ var WorkerEvent = class extends TypedEvent {
1894
2193
  }
1895
2194
  };
1896
2195
  var WorkerChannel = class extends Emitter2 {
2196
+ #getWorker;
2197
+ #controller;
1897
2198
  constructor(options) {
1898
2199
  super();
1899
- this.options = options;
1900
- if (!SUPPORTS_SERVICE_WORKER) {
1901
- return;
1902
- }
1903
- navigator.serviceWorker.addEventListener("message", async (event) => {
1904
- const worker = await this.options.worker;
1905
- if (event.source != null && event.source !== worker) {
1906
- return;
1907
- }
1908
- if (event.data && isObject(event.data) && "type" in event.data) {
1909
- this.emit(new WorkerEvent(event));
2200
+ invariant(
2201
+ SUPPORTS_SERVICE_WORKER,
2202
+ "Failed to open a WorkerChannel: Service Worker is not supported in this environment."
2203
+ );
2204
+ this.#getWorker = options.getWorker;
2205
+ this.#controller = new AbortController();
2206
+ navigator.serviceWorker.addEventListener(
2207
+ "message",
2208
+ async (event) => {
2209
+ const worker = await this.#getWorker();
2210
+ if (event.source != null && event.source !== worker) {
2211
+ return;
2212
+ }
2213
+ if (event.data && isObject(event.data) && "type" in event.data) {
2214
+ this.emit(new WorkerEvent(event));
2215
+ }
2216
+ },
2217
+ {
2218
+ signal: this.#controller.signal
1910
2219
  }
1911
- });
2220
+ );
1912
2221
  }
1913
2222
  /**
1914
2223
  * Send data to the Service Worker controlling this client.
@@ -1917,12 +2226,20 @@ var WorkerChannel = class extends Emitter2 {
1917
2226
  postMessage(type) {
1918
2227
  invariant(
1919
2228
  SUPPORTS_SERVICE_WORKER,
1920
- "Failed to post message on a WorkerChannel: the Service Worker API is unavailable in this context. This is likely an issue with MSW. Please report it on GitHub: https://github.com/mswjs/msw/issues"
2229
+ "Failed to post message on a WorkerChannel: the Service Worker API is unavailable in this environment. This is likely an issue with MSW. Please report it on GitHub: https://github.com/mswjs/msw/issues"
1921
2230
  );
1922
- this.options.worker.then((worker) => {
2231
+ this.#getWorker().then((worker) => {
1923
2232
  worker.postMessage(type);
1924
2233
  });
1925
2234
  }
2235
+ /**
2236
+ * Terminal teardown. Removes the `navigator.serviceWorker` message listener
2237
+ * and all emitter subscriptions. The channel is not usable afterwards.
2238
+ */
2239
+ terminate() {
2240
+ this.#controller.abort();
2241
+ this.removeAllListeners();
2242
+ }
1926
2243
  };
1927
2244
 
1928
2245
  // src/browser/utils/pruneGetRequestBody.ts
@@ -1954,40 +2271,63 @@ function validateWorkerScope(registration) {
1954
2271
  }
1955
2272
  }
1956
2273
 
2274
+ // src/browser/utils/should-invalidate-worker.ts
2275
+ function shouldInvalidateWorker(prevOptions, nextOptions) {
2276
+ return prevOptions.findWorker !== nextOptions.findWorker || prevOptions.serviceWorker.url !== nextOptions.serviceWorker.url || JSON.stringify(prevOptions.serviceWorker.options) !== JSON.stringify(nextOptions.serviceWorker.options);
2277
+ }
2278
+
1957
2279
  // src/browser/sources/service-worker-source.ts
1958
- var ServiceWorkerSource = class extends NetworkSource {
2280
+ var ServiceWorkerSource = class _ServiceWorkerSource extends NetworkSource {
2281
+ static #current;
2282
+ /**
2283
+ * Create a new Service Worker source or reuse an existing one.
2284
+ * These sources act as a singleton and only get recreated if the options change.
2285
+ */
2286
+ static async from(options) {
2287
+ if (_ServiceWorkerSource.#current == null) {
2288
+ _ServiceWorkerSource.#current = new _ServiceWorkerSource(options);
2289
+ } else if (shouldInvalidateWorker(_ServiceWorkerSource.#current.#options, options)) {
2290
+ await _ServiceWorkerSource.#current.terminate();
2291
+ _ServiceWorkerSource.#current = new _ServiceWorkerSource(options);
2292
+ }
2293
+ return _ServiceWorkerSource.#current;
2294
+ }
2295
+ #options;
2296
+ #frames;
2297
+ #channel;
2298
+ #listenerController;
2299
+ #clientPromise;
2300
+ #keepAliveInterval;
2301
+ #stoppedAt;
2302
+ workerPromise;
1959
2303
  constructor(options) {
1960
2304
  super();
1961
- this.options = options;
1962
2305
  invariant(
1963
2306
  supportsServiceWorker(),
1964
2307
  "Failed to use Service Worker as the network source: the Service Worker API is not supported in this environment"
1965
2308
  );
2309
+ this.#options = options;
1966
2310
  this.#frames = /* @__PURE__ */ new Map();
1967
- this.workerPromise = new DeferredPromise();
2311
+ this.workerPromise = new DeferredPromise2();
1968
2312
  this.#channel = new WorkerChannel({
1969
- worker: this.workerPromise.then(([worker]) => worker)
2313
+ getWorker: () => this.workerPromise.then(([worker]) => worker)
1970
2314
  });
1971
2315
  }
1972
- #frames;
1973
- #channel;
1974
- #clientPromise;
1975
- #keepAliveInterval;
1976
- #stoppedAt;
1977
- workerPromise;
1978
2316
  async enable() {
1979
- this.#stoppedAt = void 0;
1980
- if (this.workerPromise.state !== "pending") {
2317
+ if (this.workerPromise.state === "fulfilled" && typeof this.#stoppedAt == "undefined") {
1981
2318
  devUtils3.warn(
1982
2319
  'Found a redundant "worker.start()" call. Note that starting the worker while mocking is already enabled will have no effect. Consider removing this "worker.start()" call.'
1983
2320
  );
1984
2321
  return this.workerPromise.then(([, registration2]) => registration2);
1985
2322
  }
2323
+ this.#stoppedAt = void 0;
1986
2324
  this.#channel.removeAllListeners();
2325
+ this.#frames.clear();
2326
+ this.#listenerController = new AbortController();
1987
2327
  const [worker, registration] = await this.#startWorker();
1988
2328
  if (worker.state !== "activated") {
1989
2329
  const controller = new AbortController();
1990
- const activationPromise = new DeferredPromise();
2330
+ const activationPromise = new DeferredPromise2();
1991
2331
  activationPromise.then(() => controller.abort());
1992
2332
  worker.addEventListener(
1993
2333
  "statechange",
@@ -1996,18 +2336,20 @@ var ServiceWorkerSource = class extends NetworkSource {
1996
2336
  activationPromise.resolve();
1997
2337
  }
1998
2338
  },
1999
- { signal: controller.signal }
2339
+ {
2340
+ signal: controller.signal
2341
+ }
2000
2342
  );
2001
2343
  await activationPromise;
2002
2344
  }
2003
2345
  this.#channel.postMessage("MOCK_ACTIVATE");
2004
- const clientConfirmationPromise = new DeferredPromise();
2346
+ const clientConfirmationPromise = new DeferredPromise2();
2005
2347
  this.#clientPromise = clientConfirmationPromise;
2006
2348
  this.#channel.once("MOCKING_ENABLED", (event) => {
2007
2349
  clientConfirmationPromise.resolve(event.data.client);
2008
2350
  });
2009
2351
  await clientConfirmationPromise;
2010
- if (!this.options.quiet) {
2352
+ if (!this.#options.quiet) {
2011
2353
  this.#printStartMessage();
2012
2354
  }
2013
2355
  return registration;
@@ -2020,24 +2362,47 @@ var ServiceWorkerSource = class extends NetworkSource {
2020
2362
  return;
2021
2363
  }
2022
2364
  this.#stoppedAt = Date.now();
2023
- this.#frames.clear();
2024
- this.workerPromise = new DeferredPromise();
2025
- if (!this.options.quiet) {
2365
+ this.#listenerController?.abort();
2366
+ this.#listenerController = void 0;
2367
+ this.#channel.postMessage("CLIENT_CLOSED");
2368
+ if (!this.#options.quiet) {
2026
2369
  this.#printStopMessage();
2027
2370
  }
2028
2371
  }
2372
+ /**
2373
+ * Terminal teardown. Unregisters the Service Worker, tears down the channel,
2374
+ * and clears timers. Called when the singleton is being replaced with one
2375
+ * that has different options. The instance is not usable afterwards.
2376
+ */
2377
+ async terminate() {
2378
+ if (this.#keepAliveInterval != null) {
2379
+ clearInterval(this.#keepAliveInterval);
2380
+ this.#keepAliveInterval = void 0;
2381
+ }
2382
+ this.#frames.clear();
2383
+ this.#channel.terminate();
2384
+ this.#listenerController?.abort();
2385
+ this.#listenerController = void 0;
2386
+ if (this.workerPromise.state === "fulfilled") {
2387
+ const [, registration] = await this.workerPromise;
2388
+ await registration.unregister();
2389
+ }
2390
+ if (_ServiceWorkerSource.#current === this) {
2391
+ _ServiceWorkerSource.#current = void 0;
2392
+ }
2393
+ }
2029
2394
  async #startWorker() {
2030
2395
  if (this.#keepAliveInterval) {
2031
2396
  clearInterval(this.#keepAliveInterval);
2032
2397
  }
2033
- const workerUrl = this.options.serviceWorker.url;
2398
+ const workerUrl = this.#options.serviceWorker.url;
2034
2399
  const [worker, registration] = await getWorkerInstance(
2035
2400
  workerUrl,
2036
- this.options.serviceWorker.options,
2037
- this.options.findWorker || this.#defaultFindWorker
2401
+ this.#options.serviceWorker.options,
2402
+ this.#options.findWorker || this.#defaultFindWorker
2038
2403
  );
2039
2404
  if (worker == null) {
2040
- const missingWorkerMessage = this.options?.findWorker ? devUtils3.formatMessage(
2405
+ const missingWorkerMessage = this.#options?.findWorker ? devUtils3.formatMessage(
2041
2406
  `Failed to locate the Service Worker registration using a custom "findWorker" predicate.
2042
2407
 
2043
2408
  Please ensure that the custom predicate properly locates the Service Worker registration at "%s".
@@ -2055,16 +2420,28 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
2055
2420
  );
2056
2421
  throw new Error(missingWorkerMessage);
2057
2422
  }
2058
- this.workerPromise.resolve([worker, registration]);
2423
+ if (this.workerPromise.state === "pending") {
2424
+ this.workerPromise.resolve([worker, registration]);
2425
+ } else {
2426
+ this.workerPromise = new DeferredPromise2((resolve) => {
2427
+ resolve([worker, registration]);
2428
+ });
2429
+ }
2059
2430
  this.#channel.on("REQUEST", this.#handleRequest.bind(this));
2060
2431
  this.#channel.on("RESPONSE", this.#handleResponse.bind(this));
2061
- window.addEventListener("beforeunload", () => {
2062
- if (worker.state !== "redundant") {
2063
- this.#channel.postMessage("CLIENT_CLOSED");
2432
+ window.addEventListener(
2433
+ "beforeunload",
2434
+ () => {
2435
+ if (worker.state !== "redundant") {
2436
+ this.#channel.postMessage("CLIENT_CLOSED");
2437
+ }
2438
+ clearInterval(this.#keepAliveInterval);
2439
+ window.postMessage({ type: "msw/worker:stop" });
2440
+ },
2441
+ {
2442
+ signal: this.#listenerController?.signal
2064
2443
  }
2065
- clearInterval(this.#keepAliveInterval);
2066
- window.postMessage({ type: "msw/worker:stop" });
2067
- });
2444
+ );
2068
2445
  await this.#checkWorkerIntegrity().catch((error2) => {
2069
2446
  devUtils3.error(
2070
2447
  "Error while checking the worker script integrity. Please report this on GitHub (https://github.com/mswjs/msw/issues) and include the original error below."
@@ -2074,7 +2451,7 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
2074
2451
  this.#keepAliveInterval = window.setInterval(() => {
2075
2452
  this.#channel.postMessage("KEEPALIVE_REQUEST");
2076
2453
  }, 5e3);
2077
- if (!this.options.quiet) {
2454
+ if (!this.#options.quiet) {
2078
2455
  validateWorkerScope(registration);
2079
2456
  }
2080
2457
  return [worker, registration];
@@ -2094,11 +2471,12 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
2094
2471
  }
2095
2472
  async #handleResponse(event) {
2096
2473
  const { request, response, isMockedResponse } = event.data;
2474
+ const frame = this.#frames.get(request.id);
2097
2475
  if (response.type?.includes("opaque")) {
2098
2476
  this.#frames.delete(request.id);
2477
+ frame?.events.removeAllListeners();
2099
2478
  return;
2100
2479
  }
2101
- const frame = this.#frames.get(request.id);
2102
2480
  this.#frames.delete(request.id);
2103
2481
  if (frame == null) {
2104
2482
  return;
@@ -2122,27 +2500,31 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
2122
2500
  url: request.url
2123
2501
  }
2124
2502
  );
2125
- frame.events.emit(
2126
- new ResponseEvent(
2127
- isMockedResponse ? "response:mocked" : "response:bypass",
2128
- {
2129
- requestId: frame.data.id,
2130
- request: fetchRequest,
2131
- response: fetchResponse,
2132
- isMockedResponse
2133
- }
2134
- )
2135
- );
2503
+ try {
2504
+ frame.events.emit(
2505
+ new ResponseEvent(
2506
+ isMockedResponse ? "response:mocked" : "response:bypass",
2507
+ {
2508
+ requestId: frame.data.id,
2509
+ request: fetchRequest,
2510
+ response: fetchResponse,
2511
+ isMockedResponse
2512
+ }
2513
+ )
2514
+ );
2515
+ } finally {
2516
+ frame.events.removeAllListeners();
2517
+ }
2136
2518
  }
2137
2519
  #defaultFindWorker = (workerUrl, mockServiceWorkerUrl) => {
2138
2520
  return workerUrl === mockServiceWorkerUrl;
2139
2521
  };
2140
2522
  async #checkWorkerIntegrity() {
2141
- const integrityCheckPromise = new DeferredPromise();
2523
+ const integrityCheckPromise = new DeferredPromise2();
2142
2524
  this.#channel.postMessage("INTEGRITY_CHECK_REQUEST");
2143
2525
  this.#channel.once("INTEGRITY_CHECK_RESPONSE", (event) => {
2144
2526
  const { checksum, packageVersion } = event.data;
2145
- if (checksum !== "4db4a41e972cec1b64cc569c66952d82") {
2527
+ if (checksum !== "03cb67ac84128e63d7cd722a6e5b7f1e") {
2146
2528
  devUtils3.warn(
2147
2529
  `The currently registered Service Worker has been generated by a different version of MSW (${packageVersion}) and may not be fully compatible with the installed version.
2148
2530
 
@@ -2262,7 +2644,7 @@ var until2 = async (promise) => {
2262
2644
  }
2263
2645
  };
2264
2646
 
2265
- // node_modules/.pnpm/@mswjs+interceptors@0.41.2/node_modules/@mswjs/interceptors/lib/browser/handleRequest-D7kpTI5U.mjs
2647
+ // node_modules/.pnpm/@mswjs+interceptors@0.41.9/node_modules/@mswjs/interceptors/lib/browser/handleRequest-CPPgsG7s.mjs
2266
2648
  function isObject2(value, loose = false) {
2267
2649
  return loose ? Object.prototype.toString.call(value).startsWith("[object ") : Object.prototype.toString.call(value) === "[object Object]";
2268
2650
  }
@@ -2326,14 +2708,15 @@ async function handleRequest(options) {
2326
2708
  return false;
2327
2709
  };
2328
2710
  const requestAbortPromise = new DeferredPromise();
2711
+ const onAbort = () => {
2712
+ requestAbortPromise.reject(options.request.signal?.reason);
2713
+ };
2329
2714
  if (options.request.signal) {
2330
2715
  if (options.request.signal.aborted) {
2331
2716
  await options.controller.errorWith(options.request.signal.reason);
2332
2717
  return;
2333
2718
  }
2334
- options.request.signal.addEventListener("abort", () => {
2335
- requestAbortPromise.reject(options.request.signal.reason);
2336
- }, { once: true });
2719
+ options.request.signal.addEventListener("abort", onAbort, { once: true });
2337
2720
  }
2338
2721
  const result = await until2(async () => {
2339
2722
  const requestListenersPromise = emitAsync(options.emitter, "request", {
@@ -2347,6 +2730,7 @@ async function handleRequest(options) {
2347
2730
  options.controller.handled
2348
2731
  ]);
2349
2732
  });
2733
+ options.request.signal?.removeEventListener("abort", onAbort);
2350
2734
  if (requestAbortPromise.state === "rejected") {
2351
2735
  await options.controller.errorWith(requestAbortPromise.rejectionReason);
2352
2736
  return;
@@ -2379,7 +2763,7 @@ async function handleRequest(options) {
2379
2763
  return options.controller.handled;
2380
2764
  }
2381
2765
 
2382
- // node_modules/.pnpm/@mswjs+interceptors@0.41.2/node_modules/@mswjs/interceptors/lib/browser/fetch-DdKEdDOR.mjs
2766
+ // node_modules/.pnpm/@mswjs+interceptors@0.41.9/node_modules/@mswjs/interceptors/lib/browser/fetch-5IMPqr9e.mjs
2383
2767
  function createNetworkError(cause) {
2384
2768
  return Object.assign(/* @__PURE__ */ new TypeError("Failed to fetch"), { cause });
2385
2769
  }
@@ -2390,7 +2774,7 @@ var REQUEST_BODY_HEADERS = [
2390
2774
  "content-type",
2391
2775
  "content-length"
2392
2776
  ];
2393
- var kRedirectCount = Symbol("kRedirectCount");
2777
+ var kRedirectCount = /* @__PURE__ */ Symbol("kRedirectCount");
2394
2778
  async function followFetchRedirect(request, response) {
2395
2779
  if (response.status !== 303 && request.body != null) return Promise.reject(createNetworkError());
2396
2780
  const requestUrl = new URL(request.url);
@@ -2472,7 +2856,7 @@ function decompressResponse(response) {
2472
2856
  }
2473
2857
  var FetchInterceptor = class FetchInterceptor2 extends Interceptor {
2474
2858
  static {
2475
- this.symbol = Symbol("fetch");
2859
+ this.symbol = /* @__PURE__ */ Symbol.for("fetch-interceptor");
2476
2860
  }
2477
2861
  constructor() {
2478
2862
  super(FetchInterceptor2.symbol);
@@ -2481,12 +2865,11 @@ var FetchInterceptor = class FetchInterceptor2 extends Interceptor {
2481
2865
  return hasConfigurableGlobal("fetch");
2482
2866
  }
2483
2867
  async setup() {
2868
+ const logger = this.logger.extend("setup");
2484
2869
  const pureFetch = globalThis.fetch;
2485
- invariant(!pureFetch[IS_PATCHED_MODULE], 'Failed to patch the "fetch" module: already patched.');
2486
- globalThis.fetch = async (input, init) => {
2870
+ const fetchProxy = async (input, init) => {
2487
2871
  const requestId = createRequestId();
2488
- const resolvedInput = typeof input === "string" && typeof location !== "undefined" && !canParseUrl(input) ? new URL(input, location.href) : input;
2489
- const request = new Request(resolvedInput, init);
2872
+ const request = new FetchRequest(typeof input === "string" && typeof location !== "undefined" && !canParseUrl(input) ? new URL(input, location.href) : input, init);
2490
2873
  if (input instanceof Request) setRawRequest(request, input);
2491
2874
  const responsePromise = new DeferredPromise();
2492
2875
  const controller = new RequestController(request, {
@@ -2498,7 +2881,7 @@ var FetchInterceptor = class FetchInterceptor2 extends Interceptor {
2498
2881
  this.logger.info("original fetch performed", originalResponse);
2499
2882
  if (this.emitter.listenerCount("response") > 0) {
2500
2883
  this.logger.info('emitting the "response" event...');
2501
- const responseClone = originalResponse.clone();
2884
+ const responseClone = FetchResponse.clone(originalResponse);
2502
2885
  await emitAsync(this.emitter, "response", {
2503
2886
  response: responseClone,
2504
2887
  isMockedResponse: false,
@@ -2515,9 +2898,12 @@ var FetchInterceptor = class FetchInterceptor2 extends Interceptor {
2515
2898
  return;
2516
2899
  }
2517
2900
  this.logger.info("received mocked response!", { rawResponse });
2518
- const decompressedStream = decompressResponse(rawResponse);
2519
- const response = decompressedStream === null ? rawResponse : new FetchResponse(decompressedStream, rawResponse);
2520
- FetchResponse.setUrl(request.url, response);
2901
+ const response = new FetchResponse(decompressResponse(rawResponse) || rawResponse.body, {
2902
+ url: request.url,
2903
+ status: rawResponse.status,
2904
+ statusText: rawResponse.statusText,
2905
+ headers: rawResponse.headers
2906
+ });
2521
2907
  if (FetchResponse.isRedirectResponse(response.status)) {
2522
2908
  if (request.redirect === "error") {
2523
2909
  responsePromise.reject(createNetworkError("unexpected redirect"));
@@ -2535,7 +2921,7 @@ var FetchInterceptor = class FetchInterceptor2 extends Interceptor {
2535
2921
  if (this.emitter.listenerCount("response") > 0) {
2536
2922
  this.logger.info('emitting the "response" event...');
2537
2923
  await emitAsync(this.emitter, "response", {
2538
- response: response.clone(),
2924
+ response: FetchResponse.clone(response),
2539
2925
  isMockedResponse: true,
2540
2926
  request,
2541
2927
  requestId
@@ -2559,20 +2945,13 @@ var FetchInterceptor = class FetchInterceptor2 extends Interceptor {
2559
2945
  });
2560
2946
  return responsePromise;
2561
2947
  };
2562
- Object.defineProperty(globalThis.fetch, IS_PATCHED_MODULE, {
2563
- enumerable: true,
2564
- configurable: true,
2565
- value: true
2566
- });
2567
- this.subscriptions.push(() => {
2568
- Object.defineProperty(globalThis.fetch, IS_PATCHED_MODULE, { value: void 0 });
2569
- globalThis.fetch = pureFetch;
2570
- this.logger.info('restored native "globalThis.fetch"!', globalThis.fetch.name);
2571
- });
2948
+ logger.info("patching global fetch...");
2949
+ this.subscriptions.push(patchesRegistry.applyPatch(globalThis, "fetch", () => fetchProxy));
2950
+ logger.info("global fetch patched!", globalThis.fetch.name);
2572
2951
  }
2573
2952
  };
2574
2953
 
2575
- // node_modules/.pnpm/@mswjs+interceptors@0.41.2/node_modules/@mswjs/interceptors/lib/browser/XMLHttpRequest-BvxZV0WU.mjs
2954
+ // node_modules/.pnpm/@mswjs+interceptors@0.41.9/node_modules/@mswjs/interceptors/lib/browser/XMLHttpRequest-DrZAf3w6.mjs
2576
2955
  function concatArrayBuffer(left, right) {
2577
2956
  const result = new Uint8Array(left.byteLength + right.byteLength);
2578
2957
  result.set(left, 0);
@@ -2738,9 +3117,9 @@ async function getBodyByteLength(input) {
2738
3117
  if (explicitContentLength != null && explicitContentLength !== "") return Number(explicitContentLength);
2739
3118
  return (await input.arrayBuffer()).byteLength;
2740
3119
  }
2741
- var kIsRequestHandled = Symbol("kIsRequestHandled");
3120
+ var kIsRequestHandled = /* @__PURE__ */ Symbol("kIsRequestHandled");
2742
3121
  var IS_NODE2 = isNodeProcess();
2743
- var kFetchRequest = Symbol("kFetchRequest");
3122
+ var kFetchRequest = /* @__PURE__ */ Symbol("kFetchRequest");
2744
3123
  var XMLHttpRequestController = class {
2745
3124
  constructor(initialRequest, logger) {
2746
3125
  this.initialRequest = initialRequest;
@@ -3078,7 +3457,7 @@ var XMLHttpRequestController = class {
3078
3457
  toFetchApiRequest(body) {
3079
3458
  this.logger.info("converting request to a Fetch API Request...");
3080
3459
  const resolvedBody = body instanceof Document ? body.documentElement.innerText : body;
3081
- const fetchRequest = new Request(this.url.href, {
3460
+ const fetchRequest = new FetchRequest(this.url.href, {
3082
3461
  method: this.method,
3083
3462
  headers: this.requestHeaders,
3084
3463
  credentials: this.request.withCredentials ? "include" : "same-origin",
@@ -3163,34 +3542,24 @@ function createXMLHttpRequestProxy({ emitter, logger }) {
3163
3542
  }
3164
3543
  var XMLHttpRequestInterceptor = class XMLHttpRequestInterceptor2 extends Interceptor {
3165
3544
  static {
3166
- this.interceptorSymbol = Symbol("xhr");
3545
+ this.symbol = /* @__PURE__ */ Symbol.for("xhr-interceptor");
3167
3546
  }
3168
3547
  constructor() {
3169
- super(XMLHttpRequestInterceptor2.interceptorSymbol);
3548
+ super(XMLHttpRequestInterceptor2.symbol);
3170
3549
  }
3171
3550
  checkEnvironment() {
3172
3551
  return hasConfigurableGlobal("XMLHttpRequest");
3173
3552
  }
3174
3553
  setup() {
3175
3554
  const logger = this.logger.extend("setup");
3176
- logger.info('patching "XMLHttpRequest" module...');
3177
- const PureXMLHttpRequest = globalThis.XMLHttpRequest;
3178
- invariant(!PureXMLHttpRequest[IS_PATCHED_MODULE], 'Failed to patch the "XMLHttpRequest" module: already patched.');
3179
- globalThis.XMLHttpRequest = createXMLHttpRequestProxy({
3180
- emitter: this.emitter,
3181
- logger: this.logger
3182
- });
3183
- logger.info('native "XMLHttpRequest" module patched!', globalThis.XMLHttpRequest.name);
3184
- Object.defineProperty(globalThis.XMLHttpRequest, IS_PATCHED_MODULE, {
3185
- enumerable: true,
3186
- configurable: true,
3187
- value: true
3188
- });
3189
- this.subscriptions.push(() => {
3190
- Object.defineProperty(globalThis.XMLHttpRequest, IS_PATCHED_MODULE, { value: void 0 });
3191
- globalThis.XMLHttpRequest = PureXMLHttpRequest;
3192
- logger.info('native "XMLHttpRequest" module restored!', globalThis.XMLHttpRequest.name);
3193
- });
3555
+ logger.info("patching global XMLHttpRequest...");
3556
+ this.subscriptions.push(patchesRegistry.applyPatch(globalThis, "XMLHttpRequest", () => {
3557
+ return createXMLHttpRequestProxy({
3558
+ emitter: this.emitter,
3559
+ logger: this.logger
3560
+ });
3561
+ }));
3562
+ logger.info("global XMLHttpRequest patched!", globalThis.XMLHttpRequest.name);
3194
3563
  }
3195
3564
  };
3196
3565
 
@@ -3204,6 +3573,7 @@ var FallbackHttpSource = class extends InterceptorSource {
3204
3573
  });
3205
3574
  this.options = options;
3206
3575
  }
3576
+ options;
3207
3577
  enable() {
3208
3578
  super.enable();
3209
3579
  if (!this.options.quiet) {
@@ -3263,7 +3633,7 @@ function setupWorker(...handlers) {
3263
3633
  );
3264
3634
  return;
3265
3635
  }
3266
- const httpSource = supportsServiceWorker() ? new ServiceWorkerSource({
3636
+ const httpSource = supportsServiceWorker() ? await ServiceWorkerSource.from({
3267
3637
  serviceWorker: {
3268
3638
  url: options?.serviceWorker?.url?.toString() || DEFAULT_WORKER_URL,
3269
3639
  options: options?.serviceWorker?.options