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

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
@@ -561,7 +561,7 @@ var _Emitter = class {
561
561
  var Emitter = _Emitter;
562
562
  Emitter.defaultMaxListeners = 10;
563
563
 
564
- // node_modules/.pnpm/@mswjs+interceptors@0.41.2/node_modules/@mswjs/interceptors/lib/browser/createRequestId-DQcIlohW.mjs
564
+ // node_modules/.pnpm/@mswjs+interceptors@0.41.9/node_modules/@mswjs/interceptors/lib/browser/createRequestId-DYCsFHOi.mjs
565
565
  var INTERNAL_REQUEST_ID_HEADER_NAME = "x-interceptors-internal-request-id";
566
566
  function getGlobalSymbol(symbol) {
567
567
  return globalThis[symbol] || void 0;
@@ -710,7 +710,7 @@ function createRequestId() {
710
710
  return Math.random().toString(16).slice(2);
711
711
  }
712
712
 
713
- // node_modules/.pnpm/@mswjs+interceptors@0.41.2/node_modules/@mswjs/interceptors/lib/browser/resolveWebSocketUrl-C83-x9iE.mjs
713
+ // node_modules/.pnpm/@mswjs+interceptors@0.41.9/node_modules/@mswjs/interceptors/lib/browser/resolveWebSocketUrl-C83-x9iE.mjs
714
714
  function resolveWebSocketUrl(url) {
715
715
  if (typeof url === "string") return resolveWebSocketUrl(new URL(url, typeof location !== "undefined" ? location.href : void 0));
716
716
  if (url.protocol === "http:") url.protocol = "ws:";
@@ -721,15 +721,72 @@ function resolveWebSocketUrl(url) {
721
721
  return url.href;
722
722
  }
723
723
 
724
- // node_modules/.pnpm/@mswjs+interceptors@0.41.2/node_modules/@mswjs/interceptors/lib/browser/hasConfigurableGlobal-npXitu1-.mjs
724
+ // node_modules/.pnpm/@mswjs+interceptors@0.41.9/node_modules/@mswjs/interceptors/lib/browser/hasConfigurableGlobal-C8zq1MCg.mjs
725
725
  async function emitAsync(emitter, eventName, ...data) {
726
726
  const listeners = emitter.listeners(eventName);
727
727
  if (listeners.length === 0) return;
728
728
  for (const listener of listeners) await listener.apply(emitter, data);
729
729
  }
730
+ var PatchesRegistry = class {
731
+ #replacements = /* @__PURE__ */ new Map();
732
+ applyPatch(owner, key, getNextValue) {
733
+ const ownerReplacements = this.#replacements.get(owner);
734
+ invariant(!ownerReplacements?.has(key), `Failed to replace a global value at "${String(key)}": already replaced.`);
735
+ const match = getDeepPropertyDescriptor(owner, key);
736
+ if (typeof match === "undefined") {
737
+ console.warn(`Failed to replace a global value at "${String(key)}": not a global value.`);
738
+ return () => {
739
+ };
740
+ }
741
+ if (match.descriptor.configurable) Object.defineProperty(owner, key, {
742
+ value: getNextValue(owner[key]),
743
+ enumerable: true,
744
+ configurable: true
745
+ });
746
+ else if (match.descriptor.writable) owner[key] = getNextValue(owner[key]);
747
+ else throw new Error(`Failed to patch a non-configurable non-writable property "${key.toString()}"`);
748
+ const restorePatch = () => {
749
+ const currentReplacements = this.#replacements.get(owner);
750
+ if (!currentReplacements?.has(key)) return;
751
+ if (match.owner === owner)
752
+ Object.defineProperty(match.owner, key, match.descriptor);
753
+ else
754
+ Reflect.deleteProperty(owner, key);
755
+ currentReplacements.delete(key);
756
+ if (currentReplacements.size === 0) this.#replacements.delete(owner);
757
+ };
758
+ if (ownerReplacements) ownerReplacements.set(key, restorePatch);
759
+ else this.#replacements.set(owner, /* @__PURE__ */ new Map([[key, restorePatch]]));
760
+ return restorePatch;
761
+ }
762
+ restoreAllPatches() {
763
+ const errors = [];
764
+ for (const [, ownerReplacements] of this.#replacements) for (const [, restorePatch] of ownerReplacements) try {
765
+ restorePatch();
766
+ } catch (error2) {
767
+ if (error2 instanceof Error) errors.push(error2);
768
+ else throw error2;
769
+ }
770
+ if (errors.length > 0) throw new AggregateError(errors, "FOO!");
771
+ }
772
+ };
773
+ var patchesRegistry = new PatchesRegistry();
774
+ function getDeepPropertyDescriptor(owner, key) {
775
+ let currentOwner = owner;
776
+ let descriptor;
777
+ while (currentOwner) {
778
+ descriptor = Object.getOwnPropertyDescriptor(currentOwner, key);
779
+ if (descriptor) return {
780
+ owner: currentOwner,
781
+ descriptor
782
+ };
783
+ currentOwner = Object.getPrototypeOf(currentOwner);
784
+ }
785
+ }
730
786
  function hasConfigurableGlobal(propertyName) {
731
- const descriptor = Object.getOwnPropertyDescriptor(globalThis, propertyName);
732
- if (typeof descriptor === "undefined") return false;
787
+ const match = getDeepPropertyDescriptor(globalThis, propertyName);
788
+ if (typeof match === "undefined") return false;
789
+ const { descriptor } = match;
733
790
  if (typeof descriptor.get === "function" && typeof descriptor.get() === "undefined") return false;
734
791
  if (typeof descriptor.get === "undefined" && descriptor.value == null) return false;
735
792
  if (typeof descriptor.set === "undefined" && !descriptor.configurable) {
@@ -805,7 +862,7 @@ var DeferredPromise = class extends Promise {
805
862
  }
806
863
  };
807
864
 
808
- // node_modules/.pnpm/@mswjs+interceptors@0.41.2/node_modules/@mswjs/interceptors/lib/browser/interceptors/WebSocket/index.mjs
865
+ // node_modules/.pnpm/@mswjs+interceptors@0.41.9/node_modules/@mswjs/interceptors/lib/browser/interceptors/WebSocket/index.mjs
809
866
  function bindEvent(target, event) {
810
867
  Object.defineProperties(event, {
811
868
  target: {
@@ -821,8 +878,8 @@ function bindEvent(target, event) {
821
878
  });
822
879
  return event;
823
880
  }
824
- var kCancelable = Symbol("kCancelable");
825
- var kDefaultPrevented = Symbol("kDefaultPrevented");
881
+ var kCancelable = /* @__PURE__ */ Symbol("kCancelable");
882
+ var kDefaultPrevented = /* @__PURE__ */ Symbol("kDefaultPrevented");
826
883
  var CancelableMessageEvent = class extends MessageEvent {
827
884
  constructor(type, init) {
828
885
  super(type, init);
@@ -875,8 +932,8 @@ var CancelableCloseEvent = class extends CloseEvent {
875
932
  if (this.cancelable && !this[kDefaultPrevented]) this[kDefaultPrevented] = true;
876
933
  }
877
934
  };
878
- var kEmitter$1 = Symbol("kEmitter");
879
- var kBoundListener$1 = Symbol("kBoundListener");
935
+ var kEmitter$1 = /* @__PURE__ */ Symbol("kEmitter");
936
+ var kBoundListener$1 = /* @__PURE__ */ Symbol("kBoundListener");
880
937
  var WebSocketClientConnection = class {
881
938
  constructor(socket, transport) {
882
939
  this.socket = socket;
@@ -933,9 +990,9 @@ var WebSocketClientConnection = class {
933
990
  }
934
991
  };
935
992
  var WEBSOCKET_CLOSE_CODE_RANGE_ERROR = "InvalidAccessError: close code out of user configurable range";
936
- var kPassthroughPromise = Symbol("kPassthroughPromise");
937
- var kOnSend = Symbol("kOnSend");
938
- var kClose = Symbol("kClose");
993
+ var kPassthroughPromise = /* @__PURE__ */ Symbol("kPassthroughPromise");
994
+ var kOnSend = /* @__PURE__ */ Symbol("kOnSend");
995
+ var kClose = /* @__PURE__ */ Symbol("kClose");
939
996
  var WebSocketOverride = class extends EventTarget {
940
997
  static {
941
998
  this.CONNECTING = 0;
@@ -1055,9 +1112,9 @@ function getDataSize(data) {
1055
1112
  if (data instanceof Blob) return data.size;
1056
1113
  return data.byteLength;
1057
1114
  }
1058
- var kEmitter = Symbol("kEmitter");
1059
- var kBoundListener = Symbol("kBoundListener");
1060
- var kSend = Symbol("kSend");
1115
+ var kEmitter = /* @__PURE__ */ Symbol("kEmitter");
1116
+ var kBoundListener = /* @__PURE__ */ Symbol("kBoundListener");
1117
+ var kSend = /* @__PURE__ */ Symbol("kSend");
1061
1118
  var WebSocketServerConnection = class {
1062
1119
  constructor(client, transport, createConnection) {
1063
1120
  this.client = client;
@@ -1257,7 +1314,7 @@ var WebSocketClassTransport = class extends EventTarget {
1257
1314
  };
1258
1315
  var WebSocketInterceptor = class WebSocketInterceptor2 extends Interceptor {
1259
1316
  static {
1260
- this.symbol = Symbol("websocket");
1317
+ this.symbol = /* @__PURE__ */ Symbol.for("websocket-interceptor");
1261
1318
  }
1262
1319
  constructor() {
1263
1320
  super(WebSocketInterceptor2.symbol);
@@ -1266,7 +1323,7 @@ var WebSocketInterceptor = class WebSocketInterceptor2 extends Interceptor {
1266
1323
  return hasConfigurableGlobal("WebSocket");
1267
1324
  }
1268
1325
  setup() {
1269
- const originalWebSocketDescriptor = Object.getOwnPropertyDescriptor(globalThis, "WebSocket");
1326
+ const logger = this.logger.extend("setup");
1270
1327
  const WebSocketProxy = new Proxy(globalThis.WebSocket, { construct: (target, args, newTarget) => {
1271
1328
  const [url, protocols] = args;
1272
1329
  const createConnection = () => {
@@ -1302,13 +1359,9 @@ var WebSocketInterceptor = class WebSocketInterceptor2 extends Interceptor {
1302
1359
  });
1303
1360
  return socket;
1304
1361
  } });
1305
- Object.defineProperty(globalThis, "WebSocket", {
1306
- value: WebSocketProxy,
1307
- configurable: true
1308
- });
1309
- this.subscriptions.push(() => {
1310
- Object.defineProperty(globalThis, "WebSocket", originalWebSocketDescriptor);
1311
- });
1362
+ logger.info("patching global WebSocket...");
1363
+ this.subscriptions.push(patchesRegistry.applyPatch(globalThis, "WebSocket", () => WebSocketProxy));
1364
+ logger.info("global WebSocket patched!", globalThis.WebSocket.name);
1312
1365
  }
1313
1366
  };
1314
1367
 
@@ -1335,8 +1388,73 @@ function supportsReadableStreamTransfer() {
1335
1388
  }
1336
1389
  }
1337
1390
 
1338
- // node_modules/.pnpm/@mswjs+interceptors@0.41.2/node_modules/@mswjs/interceptors/lib/browser/getRawRequest-BTaNLFr0.mjs
1339
- var IS_PATCHED_MODULE = Symbol("isPatchedModule");
1391
+ // node_modules/.pnpm/@open-draft+deferred-promise@3.0.0/node_modules/@open-draft/deferred-promise/build/index.mjs
1392
+ function createDeferredExecutor2() {
1393
+ const executor = ((resolve, reject) => {
1394
+ executor.state = "pending";
1395
+ executor.resolve = (data) => {
1396
+ if (executor.state !== "pending") return;
1397
+ executor.result = data;
1398
+ const onFulfilled = (value) => {
1399
+ executor.state = "fulfilled";
1400
+ return value;
1401
+ };
1402
+ return resolve(data instanceof Promise ? data : Promise.resolve(data).then(onFulfilled));
1403
+ };
1404
+ executor.reject = (reason) => {
1405
+ if (executor.state !== "pending") return;
1406
+ queueMicrotask(() => {
1407
+ executor.state = "rejected";
1408
+ });
1409
+ return reject(executor.rejectionReason = reason);
1410
+ };
1411
+ });
1412
+ return executor;
1413
+ }
1414
+ var DeferredPromise2 = class extends Promise {
1415
+ #executor;
1416
+ resolve;
1417
+ reject;
1418
+ constructor(executor = null) {
1419
+ const deferredExecutor = createDeferredExecutor2();
1420
+ super((originalResolve, originalReject) => {
1421
+ deferredExecutor(originalResolve, originalReject);
1422
+ executor?.(deferredExecutor.resolve, deferredExecutor.reject);
1423
+ });
1424
+ this.#executor = deferredExecutor;
1425
+ this.resolve = this.#executor.resolve;
1426
+ this.reject = this.#executor.reject;
1427
+ }
1428
+ get state() {
1429
+ return this.#executor.state;
1430
+ }
1431
+ get rejectionReason() {
1432
+ return this.#executor.rejectionReason;
1433
+ }
1434
+ then(onFulfilled, onRejected) {
1435
+ return this.#decorate(super.then(onFulfilled, onRejected));
1436
+ }
1437
+ catch(onRejected) {
1438
+ return this.#decorate(super.catch(onRejected));
1439
+ }
1440
+ finally(onfinally) {
1441
+ return this.#decorate(super.finally(onfinally));
1442
+ }
1443
+ #decorate(promise) {
1444
+ return Object.defineProperties(promise, {
1445
+ resolve: {
1446
+ configurable: true,
1447
+ value: this.resolve
1448
+ },
1449
+ reject: {
1450
+ configurable: true,
1451
+ value: this.reject
1452
+ }
1453
+ });
1454
+ }
1455
+ };
1456
+
1457
+ // node_modules/.pnpm/@mswjs+interceptors@0.41.9/node_modules/@mswjs/interceptors/lib/browser/getRawRequest-B1BqgWG6.mjs
1340
1458
  var InterceptorError = class InterceptorError2 extends Error {
1341
1459
  constructor(message) {
1342
1460
  super(message);
@@ -1418,6 +1536,68 @@ function getValueBySymbol(symbolName, source) {
1418
1536
  });
1419
1537
  if (symbol) return Reflect.get(source, symbol);
1420
1538
  }
1539
+ var FetchRequest = class FetchRequest2 extends Request {
1540
+ static #resolveProperty(input, init = {}, key) {
1541
+ return init[key] ?? (input instanceof Request ? input[key] : void 0);
1542
+ }
1543
+ /**
1544
+ * Check if the given request method is configurable.
1545
+ * @see https://fetch.spec.whatwg.org/#methods
1546
+ */
1547
+ static isConfigurableMethod(method) {
1548
+ return method !== "CONNECT" && method !== "TRACE" && method !== "TRACK";
1549
+ }
1550
+ static isMethodWithBody(method) {
1551
+ return method !== "HEAD" && method !== "GET" && FetchRequest2.isConfigurableMethod(method);
1552
+ }
1553
+ /**
1554
+ * Check if the given request `mode` is configurable.
1555
+ * @see https://fetch.spec.whatwg.org/#concept-request-mode
1556
+ */
1557
+ static isConfigurableMode(mode) {
1558
+ return mode !== "navigate" && mode !== "websocket" && mode !== "webtransport";
1559
+ }
1560
+ constructor(input, init) {
1561
+ const method = FetchRequest2.#resolveProperty(input, init, "method") || "GET";
1562
+ const safeMethod = FetchRequest2.isConfigurableMethod(method) ? method : "GET";
1563
+ const hasExplicitBody = init != null && "body" in init;
1564
+ const bodyInit = !FetchRequest2.isMethodWithBody(method) ? { body: void 0 } : hasExplicitBody ? { body: init.body } : {};
1565
+ const mode = FetchRequest2.#resolveProperty(input, init, "mode") ?? void 0;
1566
+ const safeMode = FetchRequest2.isConfigurableMode(mode) ? mode : void 0;
1567
+ super(input, {
1568
+ ...init || {},
1569
+ method: safeMethod,
1570
+ mode: safeMode,
1571
+ duplex: init?.duplex ?? (FetchRequest2.isMethodWithBody(method) ? "half" : void 0),
1572
+ ...bodyInit
1573
+ });
1574
+ if (method !== safeMethod) this.#setInternalProperty("method", method);
1575
+ if (method === "CONNECT") {
1576
+ const url = new URL(input instanceof Request ? input.url : input);
1577
+ let authority;
1578
+ if (url.protocol === "localhost:") authority = url.href;
1579
+ else authority = url.pathname.replace(/^\/+/, "");
1580
+ Object.defineProperty(this, "url", {
1581
+ get: () => authority,
1582
+ enumerable: true,
1583
+ configurable: true
1584
+ });
1585
+ }
1586
+ if (mode != null && mode !== safeMode) this.#setInternalProperty("mode", mode);
1587
+ }
1588
+ #setInternalProperty(key, value) {
1589
+ const internalState = getValueBySymbol("state", this);
1590
+ if (internalState) Reflect.set(internalState, key, value);
1591
+ else Object.defineProperty(this, key, {
1592
+ value,
1593
+ enumerable: true,
1594
+ configurable: true,
1595
+ writable: false
1596
+ });
1597
+ }
1598
+ };
1599
+ var kStatus = /* @__PURE__ */ Symbol("kStatus");
1600
+ var kUrl = /* @__PURE__ */ Symbol("kUrl");
1421
1601
  var FetchResponse = class FetchResponse2 extends Response {
1422
1602
  static {
1423
1603
  this.STATUS_CODES_WITHOUT_BODY = [
@@ -1450,6 +1630,20 @@ var FetchResponse = class FetchResponse2 extends Response {
1450
1630
  static isResponseWithBody(status) {
1451
1631
  return !FetchResponse2.STATUS_CODES_WITHOUT_BODY.includes(status);
1452
1632
  }
1633
+ static setStatus(status, response) {
1634
+ const internalState = getValueBySymbol("state", response);
1635
+ if (internalState) internalState.status = status;
1636
+ else Object.defineProperty(response, "status", {
1637
+ value: status,
1638
+ enumerable: true,
1639
+ configurable: true,
1640
+ writable: false
1641
+ });
1642
+ Object.defineProperty(response, kStatus, {
1643
+ value: status,
1644
+ enumerable: false
1645
+ });
1646
+ }
1453
1647
  static setUrl(url, response) {
1454
1648
  if (!url || url === "about:" || !canParseUrl(url)) return;
1455
1649
  const state = getValueBySymbol("state", response);
@@ -1460,6 +1654,10 @@ var FetchResponse = class FetchResponse2 extends Response {
1460
1654
  configurable: true,
1461
1655
  writable: false
1462
1656
  });
1657
+ Object.defineProperty(response, kUrl, {
1658
+ value: url,
1659
+ enumerable: false
1660
+ });
1463
1661
  }
1464
1662
  /**
1465
1663
  * Parses the given raw HTTP headers into a Fetch API `Headers` instance.
@@ -1469,6 +1667,27 @@ var FetchResponse = class FetchResponse2 extends Response {
1469
1667
  for (let line = 0; line < rawHeaders.length; line += 2) headers.append(rawHeaders[line], rawHeaders[line + 1]);
1470
1668
  return headers;
1471
1669
  }
1670
+ /**
1671
+ * Safely clones the given `Response`.
1672
+ * Coerces response clone exceptions into 500 mocked responses.
1673
+ * Handy in the environments that introduce arbitrary response
1674
+ * cloning restrictions, like "101 Switching Protocols" cloning
1675
+ * in "miniflare".
1676
+ */
1677
+ static clone(response) {
1678
+ try {
1679
+ return response.clone();
1680
+ } catch (error2) {
1681
+ return Response.json(error2 instanceof Error ? {
1682
+ name: error2.name,
1683
+ message: error2.message,
1684
+ stack: error2.stack
1685
+ } : {}, {
1686
+ status: 500,
1687
+ statusText: "Unclonable Response"
1688
+ });
1689
+ }
1690
+ }
1472
1691
  constructor(body, init = {}) {
1473
1692
  const status = init.status ?? 200;
1474
1693
  const safeStatus = FetchResponse2.isConfigurableStatusCode(status) ? status : 200;
@@ -1478,25 +1697,24 @@ var FetchResponse = class FetchResponse2 extends Response {
1478
1697
  statusText: init.statusText,
1479
1698
  headers: init.headers
1480
1699
  });
1481
- if (status !== safeStatus) {
1482
- const state = getValueBySymbol("state", this);
1483
- if (state) state.status = status;
1484
- else Object.defineProperty(this, "status", {
1485
- value: status,
1486
- enumerable: true,
1487
- configurable: true,
1488
- writable: false
1489
- });
1490
- }
1700
+ if (status !== safeStatus) FetchResponse2.setStatus(status, this);
1491
1701
  FetchResponse2.setUrl(init.url, this);
1492
1702
  }
1703
+ clone() {
1704
+ const clonedResponse = super.clone();
1705
+ const customStatus = Reflect.get(this, kStatus);
1706
+ if (customStatus) FetchResponse2.setStatus(customStatus, clonedResponse);
1707
+ const customUrl = Reflect.get(this, kUrl);
1708
+ if (customUrl) FetchResponse2.setUrl(customUrl, clonedResponse);
1709
+ return clonedResponse;
1710
+ }
1493
1711
  };
1494
- var kRawRequest = Symbol("kRawRequest");
1712
+ var kRawRequest = /* @__PURE__ */ Symbol("kRawRequest");
1495
1713
  function setRawRequest(request, rawRequest) {
1496
1714
  Reflect.set(request, kRawRequest, rawRequest);
1497
1715
  }
1498
1716
 
1499
- // node_modules/.pnpm/@mswjs+interceptors@0.41.2/node_modules/@mswjs/interceptors/lib/browser/bufferUtils-BiiO6HZv.mjs
1717
+ // node_modules/.pnpm/@mswjs+interceptors@0.41.9/node_modules/@mswjs/interceptors/lib/browser/bufferUtils-BiiO6HZv.mjs
1500
1718
  var encoder = new TextEncoder();
1501
1719
  function encodeBuffer(text) {
1502
1720
  return encoder.encode(text);
@@ -1605,7 +1823,7 @@ Learn more about creating the Service Worker script: https://mswjs.io/docs/cli/i
1605
1823
  return registrationResult;
1606
1824
  };
1607
1825
 
1608
- // node_modules/.pnpm/rettime@0.10.1/node_modules/rettime/build/lens-list.mjs
1826
+ // node_modules/.pnpm/rettime@0.11.11/node_modules/rettime/build/lens-list.mjs
1609
1827
  var LensList = class {
1610
1828
  #list;
1611
1829
  #lens;
@@ -1647,11 +1865,17 @@ var LensList = class {
1647
1865
  }
1648
1866
  /**
1649
1867
  * Delete the value belonging to the given key.
1868
+ * Returns `true` if the value was present and removed, `false` otherwise.
1650
1869
  */
1651
1870
  delete(key, value) {
1652
- if (this.size === 0) return;
1653
- this.#list = this.#list.filter((item) => item[1] !== value);
1654
- for (const [existingKey, values] of this.#lens) if (existingKey === key && values.includes(value)) values.splice(values.indexOf(value), 1);
1871
+ if (this.size === 0) return false;
1872
+ const values = this.#lens.get(key);
1873
+ if (!values) return false;
1874
+ const index = values.indexOf(value);
1875
+ if (index === -1) return false;
1876
+ values.splice(index, 1);
1877
+ this.#list.splice(this.#list.findIndex((item) => item[0] === key && item[1] === value), 1);
1878
+ return true;
1655
1879
  }
1656
1880
  /**
1657
1881
  * Delete all values belogning to the given key.
@@ -1674,10 +1898,10 @@ var LensList = class {
1674
1898
  }
1675
1899
  };
1676
1900
 
1677
- // node_modules/.pnpm/rettime@0.10.1/node_modules/rettime/build/index.mjs
1678
- var kDefaultPrevented2 = Symbol("kDefaultPrevented");
1679
- var kPropagationStopped = Symbol("kPropagationStopped");
1680
- var kImmediatePropagationStopped = Symbol("kImmediatePropagationStopped");
1901
+ // node_modules/.pnpm/rettime@0.11.11/node_modules/rettime/build/index.mjs
1902
+ var kDefaultPrevented2 = /* @__PURE__ */ Symbol("kDefaultPrevented");
1903
+ var kPropagationStopped = /* @__PURE__ */ Symbol("kPropagationStopped");
1904
+ var kImmediatePropagationStopped = /* @__PURE__ */ Symbol("kImmediatePropagationStopped");
1681
1905
  var TypedEvent = class extends MessageEvent {
1682
1906
  /**
1683
1907
  * @note Keep a placeholder property with the return type
@@ -1704,11 +1928,68 @@ var TypedEvent = class extends MessageEvent {
1704
1928
  this[kImmediatePropagationStopped] = true;
1705
1929
  }
1706
1930
  };
1707
- var kListenerOptions = Symbol("kListenerOptions");
1708
1931
  var Emitter2 = class {
1709
1932
  #listeners;
1933
+ #listenerOptions;
1934
+ #listenerAbortCleanups;
1935
+ #typelessListeners;
1936
+ #hookListeners;
1937
+ #hookListenerOptions;
1938
+ #hookListenerAbortCleanups;
1939
+ hooks;
1710
1940
  constructor() {
1711
1941
  this.#listeners = new LensList();
1942
+ this.#listenerOptions = /* @__PURE__ */ new WeakMap();
1943
+ this.#listenerAbortCleanups = /* @__PURE__ */ new WeakMap();
1944
+ this.#typelessListeners = /* @__PURE__ */ new WeakSet();
1945
+ this.#hookListeners = new LensList();
1946
+ this.#hookListenerOptions = /* @__PURE__ */ new WeakMap();
1947
+ this.#hookListenerAbortCleanups = /* @__PURE__ */ new WeakMap();
1948
+ this.hooks = {
1949
+ on: (hook, callback, options) => {
1950
+ if (options?.signal?.aborted) return;
1951
+ if (options?.once) {
1952
+ const original = callback;
1953
+ const wrapper = ((...args) => {
1954
+ this.#deleteHookListener(hook, wrapper);
1955
+ return original(...args);
1956
+ });
1957
+ callback = wrapper;
1958
+ }
1959
+ this.#hookListeners.append(hook, callback);
1960
+ if (options) this.#hookListenerOptions.set(callback, options);
1961
+ if (options?.signal) {
1962
+ const { signal } = options;
1963
+ const onAbort = () => {
1964
+ this.#deleteHookListener(hook, callback);
1965
+ };
1966
+ signal.addEventListener("abort", onAbort, { once: true });
1967
+ this.#hookListenerAbortCleanups.set(callback, () => {
1968
+ signal.removeEventListener("abort", onAbort);
1969
+ });
1970
+ }
1971
+ },
1972
+ removeListener: (hook, callback) => {
1973
+ this.#deleteHookListener(hook, callback);
1974
+ }
1975
+ };
1976
+ }
1977
+ #deleteHookListener(hook, callback) {
1978
+ this.#hookListeners.delete(hook, callback);
1979
+ const cleanup = this.#hookListenerAbortCleanups.get(callback);
1980
+ if (cleanup) {
1981
+ cleanup();
1982
+ this.#hookListenerAbortCleanups.delete(callback);
1983
+ }
1984
+ }
1985
+ #deleteListener(type, listener) {
1986
+ const removed = this.#listeners.delete(type, listener);
1987
+ const cleanup = this.#listenerAbortCleanups.get(listener);
1988
+ if (cleanup) {
1989
+ cleanup();
1990
+ this.#listenerAbortCleanups.delete(listener);
1991
+ }
1992
+ return removed;
1712
1993
  }
1713
1994
  /**
1714
1995
  * Adds a listener for the given event type.
@@ -1810,7 +2091,9 @@ var Emitter2 = class {
1810
2091
  * Removes a listener for the given event type.
1811
2092
  */
1812
2093
  removeListener(type, listener) {
1813
- this.#listeners.delete(type, listener);
2094
+ const options = this.#listenerOptions.get(listener);
2095
+ if (!this.#deleteListener(type, listener)) return;
2096
+ for (const hook of this.#hookListeners.get("removeListener").slice()) hook(type, listener, options);
1814
2097
  }
1815
2098
  /**
1816
2099
  * Removes all listeners for the given event type.
@@ -1818,10 +2101,12 @@ var Emitter2 = class {
1818
2101
  */
1819
2102
  removeAllListeners(type) {
1820
2103
  if (type == null) {
1821
- this.#listeners.clear();
2104
+ for (const [listenerType, listeners$1] of this.#listeners.entries()) while (listeners$1.length > 0) this.removeListener(listenerType, listeners$1[0]);
2105
+ for (const [hookType, hookListener] of [...this.#hookListeners]) if (!this.#hookListenerOptions.get(hookListener)?.persist) this.#deleteHookListener(hookType, hookListener);
1822
2106
  return;
1823
2107
  }
1824
- this.#listeners.deleteAll(type);
2108
+ const listeners = this.listeners(type);
2109
+ while (listeners.length > 0) this.removeListener(type, listeners[0]);
1825
2110
  }
1826
2111
  /**
1827
2112
  * Returns the list of listeners for the given event type.
@@ -1840,25 +2125,31 @@ var Emitter2 = class {
1840
2125
  return this.listeners(type).length;
1841
2126
  }
1842
2127
  #addListener(type, listener, options, insertMode = "append") {
2128
+ if (options?.signal?.aborted) return;
2129
+ for (const hook of this.#hookListeners.get("newListener").slice()) hook(type, listener, options);
2130
+ if (type === "*") this.#typelessListeners.add(listener);
1843
2131
  if (insertMode === "prepend") this.#listeners.prepend(type, listener);
1844
2132
  else this.#listeners.append(type, listener);
1845
2133
  if (options) {
1846
- Object.defineProperty(listener, kListenerOptions, {
1847
- value: options,
1848
- enumerable: false,
1849
- writable: false
1850
- });
1851
- if (options.signal) options.signal.addEventListener("abort", () => {
1852
- this.removeListener(type, listener);
1853
- }, { once: true });
2134
+ this.#listenerOptions.set(listener, options);
2135
+ if (options.signal) {
2136
+ const { signal } = options;
2137
+ const onAbort = () => {
2138
+ this.removeListener(type, listener);
2139
+ };
2140
+ signal.addEventListener("abort", onAbort, { once: true });
2141
+ this.#listenerAbortCleanups.set(listener, () => {
2142
+ signal.removeEventListener("abort", onAbort);
2143
+ });
2144
+ }
1854
2145
  }
1855
2146
  }
1856
2147
  #proxyEvent(event) {
1857
2148
  const { stopPropagation } = event;
1858
- event.stopPropagation = new Proxy(event.stopPropagation, { apply: (target, thisArg, argArray) => {
2149
+ event.stopPropagation = () => {
1859
2150
  event[kPropagationStopped] = this;
1860
- return Reflect.apply(target, thisArg, argArray);
1861
- } });
2151
+ stopPropagation.call(event);
2152
+ };
1862
2153
  return {
1863
2154
  event,
1864
2155
  revoke() {
@@ -1867,22 +2158,30 @@ var Emitter2 = class {
1867
2158
  };
1868
2159
  }
1869
2160
  #callListener(event, listener) {
2161
+ for (const hook of this.#hookListeners.get("beforeEmit").slice()) if (hook(event) === false) return;
1870
2162
  const returnValue = listener.call(this, event);
1871
- if (listener[kListenerOptions]?.once) {
1872
- const key = this.#isTypelessListener(listener) ? "*" : event.type;
1873
- this.#listeners.delete(key, listener);
2163
+ const options = this.#listenerOptions.get(listener);
2164
+ if (options?.once) {
2165
+ const type = this.#isTypelessListener(listener) ? "*" : event.type;
2166
+ if (this.#deleteListener(type, listener)) for (const hook of this.#hookListeners.get("removeListener").slice()) hook(type, listener, options);
1874
2167
  }
1875
2168
  return returnValue;
1876
2169
  }
1877
2170
  /**
1878
2171
  * Return a list of all event listeners relevant for the given event type.
1879
2172
  * This includes the explicit event listeners and also typeless event listeners.
2173
+ *
2174
+ * @note Snapshot the matching listeners before yielding. Listeners can add or
2175
+ * remove other listeners during emission (e.g. `earlyOn` unshifts `#list`),
2176
+ * which would otherwise shift the live iterator and re-yield prior entries.
1880
2177
  */
1881
2178
  *#matchListeners(type) {
1882
- for (const [key, listener] of this.#listeners) if (key === "*" || key === type) yield listener;
2179
+ const snapshot = [];
2180
+ for (const [key, listener] of this.#listeners) if (key === "*" || key === type) snapshot.push(listener);
2181
+ yield* snapshot;
1883
2182
  }
1884
2183
  #isTypelessListener(listener) {
1885
- return this.#listeners.get("*").includes(listener);
2184
+ return this.#typelessListeners.has(listener);
1886
2185
  }
1887
2186
  };
1888
2187
 
@@ -1915,21 +2214,31 @@ var WorkerEvent = class extends TypedEvent {
1915
2214
  }
1916
2215
  };
1917
2216
  var WorkerChannel = class extends Emitter2 {
2217
+ #getWorker;
2218
+ #controller;
1918
2219
  constructor(options) {
1919
2220
  super();
1920
- this.options = options;
1921
- if (!SUPPORTS_SERVICE_WORKER) {
1922
- return;
1923
- }
1924
- navigator.serviceWorker.addEventListener("message", async (event) => {
1925
- const worker = await this.options.worker;
1926
- if (event.source != null && event.source !== worker) {
1927
- return;
1928
- }
1929
- if (event.data && (0, import_isObject.isObject)(event.data) && "type" in event.data) {
1930
- this.emit(new WorkerEvent(event));
2221
+ invariant(
2222
+ SUPPORTS_SERVICE_WORKER,
2223
+ "Failed to open a WorkerChannel: Service Worker is not supported in this environment."
2224
+ );
2225
+ this.#getWorker = options.getWorker;
2226
+ this.#controller = new AbortController();
2227
+ navigator.serviceWorker.addEventListener(
2228
+ "message",
2229
+ async (event) => {
2230
+ const worker = await this.#getWorker();
2231
+ if (event.source != null && event.source !== worker) {
2232
+ return;
2233
+ }
2234
+ if (event.data && (0, import_isObject.isObject)(event.data) && "type" in event.data) {
2235
+ this.emit(new WorkerEvent(event));
2236
+ }
2237
+ },
2238
+ {
2239
+ signal: this.#controller.signal
1931
2240
  }
1932
- });
2241
+ );
1933
2242
  }
1934
2243
  /**
1935
2244
  * Send data to the Service Worker controlling this client.
@@ -1938,12 +2247,20 @@ var WorkerChannel = class extends Emitter2 {
1938
2247
  postMessage(type) {
1939
2248
  invariant(
1940
2249
  SUPPORTS_SERVICE_WORKER,
1941
- "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"
2250
+ "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"
1942
2251
  );
1943
- this.options.worker.then((worker) => {
2252
+ this.#getWorker().then((worker) => {
1944
2253
  worker.postMessage(type);
1945
2254
  });
1946
2255
  }
2256
+ /**
2257
+ * Terminal teardown. Removes the `navigator.serviceWorker` message listener
2258
+ * and all emitter subscriptions. The channel is not usable afterwards.
2259
+ */
2260
+ terminate() {
2261
+ this.#controller.abort();
2262
+ this.removeAllListeners();
2263
+ }
1947
2264
  };
1948
2265
 
1949
2266
  // src/browser/utils/pruneGetRequestBody.ts
@@ -1975,40 +2292,63 @@ function validateWorkerScope(registration) {
1975
2292
  }
1976
2293
  }
1977
2294
 
2295
+ // src/browser/utils/should-invalidate-worker.ts
2296
+ function shouldInvalidateWorker(prevOptions, nextOptions) {
2297
+ return prevOptions.findWorker !== nextOptions.findWorker || prevOptions.serviceWorker.url !== nextOptions.serviceWorker.url || JSON.stringify(prevOptions.serviceWorker.options) !== JSON.stringify(nextOptions.serviceWorker.options);
2298
+ }
2299
+
1978
2300
  // src/browser/sources/service-worker-source.ts
1979
- var ServiceWorkerSource = class extends import_network_source.NetworkSource {
2301
+ var ServiceWorkerSource = class _ServiceWorkerSource extends import_network_source.NetworkSource {
2302
+ static #current;
2303
+ /**
2304
+ * Create a new Service Worker source or reuse an existing one.
2305
+ * These sources act as a singleton and only get recreated if the options change.
2306
+ */
2307
+ static async from(options) {
2308
+ if (_ServiceWorkerSource.#current == null) {
2309
+ _ServiceWorkerSource.#current = new _ServiceWorkerSource(options);
2310
+ } else if (shouldInvalidateWorker(_ServiceWorkerSource.#current.#options, options)) {
2311
+ await _ServiceWorkerSource.#current.terminate();
2312
+ _ServiceWorkerSource.#current = new _ServiceWorkerSource(options);
2313
+ }
2314
+ return _ServiceWorkerSource.#current;
2315
+ }
2316
+ #options;
2317
+ #frames;
2318
+ #channel;
2319
+ #listenerController;
2320
+ #clientPromise;
2321
+ #keepAliveInterval;
2322
+ #stoppedAt;
2323
+ workerPromise;
1980
2324
  constructor(options) {
1981
2325
  super();
1982
- this.options = options;
1983
2326
  invariant(
1984
2327
  supportsServiceWorker(),
1985
2328
  "Failed to use Service Worker as the network source: the Service Worker API is not supported in this environment"
1986
2329
  );
2330
+ this.#options = options;
1987
2331
  this.#frames = /* @__PURE__ */ new Map();
1988
- this.workerPromise = new DeferredPromise();
2332
+ this.workerPromise = new DeferredPromise2();
1989
2333
  this.#channel = new WorkerChannel({
1990
- worker: this.workerPromise.then(([worker]) => worker)
2334
+ getWorker: () => this.workerPromise.then(([worker]) => worker)
1991
2335
  });
1992
2336
  }
1993
- #frames;
1994
- #channel;
1995
- #clientPromise;
1996
- #keepAliveInterval;
1997
- #stoppedAt;
1998
- workerPromise;
1999
2337
  async enable() {
2000
- this.#stoppedAt = void 0;
2001
- if (this.workerPromise.state !== "pending") {
2338
+ if (this.workerPromise.state === "fulfilled" && typeof this.#stoppedAt == "undefined") {
2002
2339
  import_devUtils3.devUtils.warn(
2003
2340
  '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.'
2004
2341
  );
2005
2342
  return this.workerPromise.then(([, registration2]) => registration2);
2006
2343
  }
2344
+ this.#stoppedAt = void 0;
2007
2345
  this.#channel.removeAllListeners();
2346
+ this.#frames.clear();
2347
+ this.#listenerController = new AbortController();
2008
2348
  const [worker, registration] = await this.#startWorker();
2009
2349
  if (worker.state !== "activated") {
2010
2350
  const controller = new AbortController();
2011
- const activationPromise = new DeferredPromise();
2351
+ const activationPromise = new DeferredPromise2();
2012
2352
  activationPromise.then(() => controller.abort());
2013
2353
  worker.addEventListener(
2014
2354
  "statechange",
@@ -2017,18 +2357,20 @@ var ServiceWorkerSource = class extends import_network_source.NetworkSource {
2017
2357
  activationPromise.resolve();
2018
2358
  }
2019
2359
  },
2020
- { signal: controller.signal }
2360
+ {
2361
+ signal: controller.signal
2362
+ }
2021
2363
  );
2022
2364
  await activationPromise;
2023
2365
  }
2024
2366
  this.#channel.postMessage("MOCK_ACTIVATE");
2025
- const clientConfirmationPromise = new DeferredPromise();
2367
+ const clientConfirmationPromise = new DeferredPromise2();
2026
2368
  this.#clientPromise = clientConfirmationPromise;
2027
2369
  this.#channel.once("MOCKING_ENABLED", (event) => {
2028
2370
  clientConfirmationPromise.resolve(event.data.client);
2029
2371
  });
2030
2372
  await clientConfirmationPromise;
2031
- if (!this.options.quiet) {
2373
+ if (!this.#options.quiet) {
2032
2374
  this.#printStartMessage();
2033
2375
  }
2034
2376
  return registration;
@@ -2041,24 +2383,47 @@ var ServiceWorkerSource = class extends import_network_source.NetworkSource {
2041
2383
  return;
2042
2384
  }
2043
2385
  this.#stoppedAt = Date.now();
2044
- this.#frames.clear();
2045
- this.workerPromise = new DeferredPromise();
2046
- if (!this.options.quiet) {
2386
+ this.#listenerController?.abort();
2387
+ this.#listenerController = void 0;
2388
+ this.#channel.postMessage("CLIENT_CLOSED");
2389
+ if (!this.#options.quiet) {
2047
2390
  this.#printStopMessage();
2048
2391
  }
2049
2392
  }
2393
+ /**
2394
+ * Terminal teardown. Unregisters the Service Worker, tears down the channel,
2395
+ * and clears timers. Called when the singleton is being replaced with one
2396
+ * that has different options. The instance is not usable afterwards.
2397
+ */
2398
+ async terminate() {
2399
+ if (this.#keepAliveInterval != null) {
2400
+ clearInterval(this.#keepAliveInterval);
2401
+ this.#keepAliveInterval = void 0;
2402
+ }
2403
+ this.#frames.clear();
2404
+ this.#channel.terminate();
2405
+ this.#listenerController?.abort();
2406
+ this.#listenerController = void 0;
2407
+ if (this.workerPromise.state === "fulfilled") {
2408
+ const [, registration] = await this.workerPromise;
2409
+ await registration.unregister();
2410
+ }
2411
+ if (_ServiceWorkerSource.#current === this) {
2412
+ _ServiceWorkerSource.#current = void 0;
2413
+ }
2414
+ }
2050
2415
  async #startWorker() {
2051
2416
  if (this.#keepAliveInterval) {
2052
2417
  clearInterval(this.#keepAliveInterval);
2053
2418
  }
2054
- const workerUrl = this.options.serviceWorker.url;
2419
+ const workerUrl = this.#options.serviceWorker.url;
2055
2420
  const [worker, registration] = await getWorkerInstance(
2056
2421
  workerUrl,
2057
- this.options.serviceWorker.options,
2058
- this.options.findWorker || this.#defaultFindWorker
2422
+ this.#options.serviceWorker.options,
2423
+ this.#options.findWorker || this.#defaultFindWorker
2059
2424
  );
2060
2425
  if (worker == null) {
2061
- const missingWorkerMessage = this.options?.findWorker ? import_devUtils3.devUtils.formatMessage(
2426
+ const missingWorkerMessage = this.#options?.findWorker ? import_devUtils3.devUtils.formatMessage(
2062
2427
  `Failed to locate the Service Worker registration using a custom "findWorker" predicate.
2063
2428
 
2064
2429
  Please ensure that the custom predicate properly locates the Service Worker registration at "%s".
@@ -2076,16 +2441,28 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
2076
2441
  );
2077
2442
  throw new Error(missingWorkerMessage);
2078
2443
  }
2079
- this.workerPromise.resolve([worker, registration]);
2444
+ if (this.workerPromise.state === "pending") {
2445
+ this.workerPromise.resolve([worker, registration]);
2446
+ } else {
2447
+ this.workerPromise = new DeferredPromise2((resolve) => {
2448
+ resolve([worker, registration]);
2449
+ });
2450
+ }
2080
2451
  this.#channel.on("REQUEST", this.#handleRequest.bind(this));
2081
2452
  this.#channel.on("RESPONSE", this.#handleResponse.bind(this));
2082
- window.addEventListener("beforeunload", () => {
2083
- if (worker.state !== "redundant") {
2084
- this.#channel.postMessage("CLIENT_CLOSED");
2453
+ window.addEventListener(
2454
+ "beforeunload",
2455
+ () => {
2456
+ if (worker.state !== "redundant") {
2457
+ this.#channel.postMessage("CLIENT_CLOSED");
2458
+ }
2459
+ clearInterval(this.#keepAliveInterval);
2460
+ window.postMessage({ type: "msw/worker:stop" });
2461
+ },
2462
+ {
2463
+ signal: this.#listenerController?.signal
2085
2464
  }
2086
- clearInterval(this.#keepAliveInterval);
2087
- window.postMessage({ type: "msw/worker:stop" });
2088
- });
2465
+ );
2089
2466
  await this.#checkWorkerIntegrity().catch((error2) => {
2090
2467
  import_devUtils3.devUtils.error(
2091
2468
  "Error while checking the worker script integrity. Please report this on GitHub (https://github.com/mswjs/msw/issues) and include the original error below."
@@ -2095,7 +2472,7 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
2095
2472
  this.#keepAliveInterval = window.setInterval(() => {
2096
2473
  this.#channel.postMessage("KEEPALIVE_REQUEST");
2097
2474
  }, 5e3);
2098
- if (!this.options.quiet) {
2475
+ if (!this.#options.quiet) {
2099
2476
  validateWorkerScope(registration);
2100
2477
  }
2101
2478
  return [worker, registration];
@@ -2115,11 +2492,12 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
2115
2492
  }
2116
2493
  async #handleResponse(event) {
2117
2494
  const { request, response, isMockedResponse } = event.data;
2495
+ const frame = this.#frames.get(request.id);
2118
2496
  if (response.type?.includes("opaque")) {
2119
2497
  this.#frames.delete(request.id);
2498
+ frame?.events.removeAllListeners();
2120
2499
  return;
2121
2500
  }
2122
- const frame = this.#frames.get(request.id);
2123
2501
  this.#frames.delete(request.id);
2124
2502
  if (frame == null) {
2125
2503
  return;
@@ -2143,27 +2521,31 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
2143
2521
  url: request.url
2144
2522
  }
2145
2523
  );
2146
- frame.events.emit(
2147
- new import_http_frame.ResponseEvent(
2148
- isMockedResponse ? "response:mocked" : "response:bypass",
2149
- {
2150
- requestId: frame.data.id,
2151
- request: fetchRequest,
2152
- response: fetchResponse,
2153
- isMockedResponse
2154
- }
2155
- )
2156
- );
2524
+ try {
2525
+ frame.events.emit(
2526
+ new import_http_frame.ResponseEvent(
2527
+ isMockedResponse ? "response:mocked" : "response:bypass",
2528
+ {
2529
+ requestId: frame.data.id,
2530
+ request: fetchRequest,
2531
+ response: fetchResponse,
2532
+ isMockedResponse
2533
+ }
2534
+ )
2535
+ );
2536
+ } finally {
2537
+ frame.events.removeAllListeners();
2538
+ }
2157
2539
  }
2158
2540
  #defaultFindWorker = (workerUrl, mockServiceWorkerUrl) => {
2159
2541
  return workerUrl === mockServiceWorkerUrl;
2160
2542
  };
2161
2543
  async #checkWorkerIntegrity() {
2162
- const integrityCheckPromise = new DeferredPromise();
2544
+ const integrityCheckPromise = new DeferredPromise2();
2163
2545
  this.#channel.postMessage("INTEGRITY_CHECK_REQUEST");
2164
2546
  this.#channel.once("INTEGRITY_CHECK_RESPONSE", (event) => {
2165
2547
  const { checksum, packageVersion } = event.data;
2166
- if (checksum !== "4db4a41e972cec1b64cc569c66952d82") {
2548
+ if (checksum !== "03cb67ac84128e63d7cd722a6e5b7f1e") {
2167
2549
  import_devUtils3.devUtils.warn(
2168
2550
  `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.
2169
2551
 
@@ -2283,7 +2665,7 @@ var until2 = async (promise) => {
2283
2665
  }
2284
2666
  };
2285
2667
 
2286
- // node_modules/.pnpm/@mswjs+interceptors@0.41.2/node_modules/@mswjs/interceptors/lib/browser/handleRequest-D7kpTI5U.mjs
2668
+ // node_modules/.pnpm/@mswjs+interceptors@0.41.9/node_modules/@mswjs/interceptors/lib/browser/handleRequest-CPPgsG7s.mjs
2287
2669
  function isObject2(value, loose = false) {
2288
2670
  return loose ? Object.prototype.toString.call(value).startsWith("[object ") : Object.prototype.toString.call(value) === "[object Object]";
2289
2671
  }
@@ -2347,14 +2729,15 @@ async function handleRequest(options) {
2347
2729
  return false;
2348
2730
  };
2349
2731
  const requestAbortPromise = new DeferredPromise();
2732
+ const onAbort = () => {
2733
+ requestAbortPromise.reject(options.request.signal?.reason);
2734
+ };
2350
2735
  if (options.request.signal) {
2351
2736
  if (options.request.signal.aborted) {
2352
2737
  await options.controller.errorWith(options.request.signal.reason);
2353
2738
  return;
2354
2739
  }
2355
- options.request.signal.addEventListener("abort", () => {
2356
- requestAbortPromise.reject(options.request.signal.reason);
2357
- }, { once: true });
2740
+ options.request.signal.addEventListener("abort", onAbort, { once: true });
2358
2741
  }
2359
2742
  const result = await until2(async () => {
2360
2743
  const requestListenersPromise = emitAsync(options.emitter, "request", {
@@ -2368,6 +2751,7 @@ async function handleRequest(options) {
2368
2751
  options.controller.handled
2369
2752
  ]);
2370
2753
  });
2754
+ options.request.signal?.removeEventListener("abort", onAbort);
2371
2755
  if (requestAbortPromise.state === "rejected") {
2372
2756
  await options.controller.errorWith(requestAbortPromise.rejectionReason);
2373
2757
  return;
@@ -2400,7 +2784,7 @@ async function handleRequest(options) {
2400
2784
  return options.controller.handled;
2401
2785
  }
2402
2786
 
2403
- // node_modules/.pnpm/@mswjs+interceptors@0.41.2/node_modules/@mswjs/interceptors/lib/browser/fetch-DdKEdDOR.mjs
2787
+ // node_modules/.pnpm/@mswjs+interceptors@0.41.9/node_modules/@mswjs/interceptors/lib/browser/fetch-5IMPqr9e.mjs
2404
2788
  function createNetworkError(cause) {
2405
2789
  return Object.assign(/* @__PURE__ */ new TypeError("Failed to fetch"), { cause });
2406
2790
  }
@@ -2411,7 +2795,7 @@ var REQUEST_BODY_HEADERS = [
2411
2795
  "content-type",
2412
2796
  "content-length"
2413
2797
  ];
2414
- var kRedirectCount = Symbol("kRedirectCount");
2798
+ var kRedirectCount = /* @__PURE__ */ Symbol("kRedirectCount");
2415
2799
  async function followFetchRedirect(request, response) {
2416
2800
  if (response.status !== 303 && request.body != null) return Promise.reject(createNetworkError());
2417
2801
  const requestUrl = new URL(request.url);
@@ -2493,7 +2877,7 @@ function decompressResponse(response) {
2493
2877
  }
2494
2878
  var FetchInterceptor = class FetchInterceptor2 extends Interceptor {
2495
2879
  static {
2496
- this.symbol = Symbol("fetch");
2880
+ this.symbol = /* @__PURE__ */ Symbol.for("fetch-interceptor");
2497
2881
  }
2498
2882
  constructor() {
2499
2883
  super(FetchInterceptor2.symbol);
@@ -2502,12 +2886,11 @@ var FetchInterceptor = class FetchInterceptor2 extends Interceptor {
2502
2886
  return hasConfigurableGlobal("fetch");
2503
2887
  }
2504
2888
  async setup() {
2889
+ const logger = this.logger.extend("setup");
2505
2890
  const pureFetch = globalThis.fetch;
2506
- invariant(!pureFetch[IS_PATCHED_MODULE], 'Failed to patch the "fetch" module: already patched.');
2507
- globalThis.fetch = async (input, init) => {
2891
+ const fetchProxy = async (input, init) => {
2508
2892
  const requestId = createRequestId();
2509
- const resolvedInput = typeof input === "string" && typeof location !== "undefined" && !canParseUrl(input) ? new URL(input, location.href) : input;
2510
- const request = new Request(resolvedInput, init);
2893
+ const request = new FetchRequest(typeof input === "string" && typeof location !== "undefined" && !canParseUrl(input) ? new URL(input, location.href) : input, init);
2511
2894
  if (input instanceof Request) setRawRequest(request, input);
2512
2895
  const responsePromise = new DeferredPromise();
2513
2896
  const controller = new RequestController(request, {
@@ -2519,7 +2902,7 @@ var FetchInterceptor = class FetchInterceptor2 extends Interceptor {
2519
2902
  this.logger.info("original fetch performed", originalResponse);
2520
2903
  if (this.emitter.listenerCount("response") > 0) {
2521
2904
  this.logger.info('emitting the "response" event...');
2522
- const responseClone = originalResponse.clone();
2905
+ const responseClone = FetchResponse.clone(originalResponse);
2523
2906
  await emitAsync(this.emitter, "response", {
2524
2907
  response: responseClone,
2525
2908
  isMockedResponse: false,
@@ -2536,9 +2919,12 @@ var FetchInterceptor = class FetchInterceptor2 extends Interceptor {
2536
2919
  return;
2537
2920
  }
2538
2921
  this.logger.info("received mocked response!", { rawResponse });
2539
- const decompressedStream = decompressResponse(rawResponse);
2540
- const response = decompressedStream === null ? rawResponse : new FetchResponse(decompressedStream, rawResponse);
2541
- FetchResponse.setUrl(request.url, response);
2922
+ const response = new FetchResponse(decompressResponse(rawResponse) || rawResponse.body, {
2923
+ url: request.url,
2924
+ status: rawResponse.status,
2925
+ statusText: rawResponse.statusText,
2926
+ headers: rawResponse.headers
2927
+ });
2542
2928
  if (FetchResponse.isRedirectResponse(response.status)) {
2543
2929
  if (request.redirect === "error") {
2544
2930
  responsePromise.reject(createNetworkError("unexpected redirect"));
@@ -2556,7 +2942,7 @@ var FetchInterceptor = class FetchInterceptor2 extends Interceptor {
2556
2942
  if (this.emitter.listenerCount("response") > 0) {
2557
2943
  this.logger.info('emitting the "response" event...');
2558
2944
  await emitAsync(this.emitter, "response", {
2559
- response: response.clone(),
2945
+ response: FetchResponse.clone(response),
2560
2946
  isMockedResponse: true,
2561
2947
  request,
2562
2948
  requestId
@@ -2580,20 +2966,13 @@ var FetchInterceptor = class FetchInterceptor2 extends Interceptor {
2580
2966
  });
2581
2967
  return responsePromise;
2582
2968
  };
2583
- Object.defineProperty(globalThis.fetch, IS_PATCHED_MODULE, {
2584
- enumerable: true,
2585
- configurable: true,
2586
- value: true
2587
- });
2588
- this.subscriptions.push(() => {
2589
- Object.defineProperty(globalThis.fetch, IS_PATCHED_MODULE, { value: void 0 });
2590
- globalThis.fetch = pureFetch;
2591
- this.logger.info('restored native "globalThis.fetch"!', globalThis.fetch.name);
2592
- });
2969
+ logger.info("patching global fetch...");
2970
+ this.subscriptions.push(patchesRegistry.applyPatch(globalThis, "fetch", () => fetchProxy));
2971
+ logger.info("global fetch patched!", globalThis.fetch.name);
2593
2972
  }
2594
2973
  };
2595
2974
 
2596
- // node_modules/.pnpm/@mswjs+interceptors@0.41.2/node_modules/@mswjs/interceptors/lib/browser/XMLHttpRequest-BvxZV0WU.mjs
2975
+ // node_modules/.pnpm/@mswjs+interceptors@0.41.9/node_modules/@mswjs/interceptors/lib/browser/XMLHttpRequest-DrZAf3w6.mjs
2597
2976
  function concatArrayBuffer(left, right) {
2598
2977
  const result = new Uint8Array(left.byteLength + right.byteLength);
2599
2978
  result.set(left, 0);
@@ -2759,9 +3138,9 @@ async function getBodyByteLength(input) {
2759
3138
  if (explicitContentLength != null && explicitContentLength !== "") return Number(explicitContentLength);
2760
3139
  return (await input.arrayBuffer()).byteLength;
2761
3140
  }
2762
- var kIsRequestHandled = Symbol("kIsRequestHandled");
3141
+ var kIsRequestHandled = /* @__PURE__ */ Symbol("kIsRequestHandled");
2763
3142
  var IS_NODE2 = isNodeProcess();
2764
- var kFetchRequest = Symbol("kFetchRequest");
3143
+ var kFetchRequest = /* @__PURE__ */ Symbol("kFetchRequest");
2765
3144
  var XMLHttpRequestController = class {
2766
3145
  constructor(initialRequest, logger) {
2767
3146
  this.initialRequest = initialRequest;
@@ -3099,7 +3478,7 @@ var XMLHttpRequestController = class {
3099
3478
  toFetchApiRequest(body) {
3100
3479
  this.logger.info("converting request to a Fetch API Request...");
3101
3480
  const resolvedBody = body instanceof Document ? body.documentElement.innerText : body;
3102
- const fetchRequest = new Request(this.url.href, {
3481
+ const fetchRequest = new FetchRequest(this.url.href, {
3103
3482
  method: this.method,
3104
3483
  headers: this.requestHeaders,
3105
3484
  credentials: this.request.withCredentials ? "include" : "same-origin",
@@ -3184,34 +3563,24 @@ function createXMLHttpRequestProxy({ emitter, logger }) {
3184
3563
  }
3185
3564
  var XMLHttpRequestInterceptor = class XMLHttpRequestInterceptor2 extends Interceptor {
3186
3565
  static {
3187
- this.interceptorSymbol = Symbol("xhr");
3566
+ this.symbol = /* @__PURE__ */ Symbol.for("xhr-interceptor");
3188
3567
  }
3189
3568
  constructor() {
3190
- super(XMLHttpRequestInterceptor2.interceptorSymbol);
3569
+ super(XMLHttpRequestInterceptor2.symbol);
3191
3570
  }
3192
3571
  checkEnvironment() {
3193
3572
  return hasConfigurableGlobal("XMLHttpRequest");
3194
3573
  }
3195
3574
  setup() {
3196
3575
  const logger = this.logger.extend("setup");
3197
- logger.info('patching "XMLHttpRequest" module...');
3198
- const PureXMLHttpRequest = globalThis.XMLHttpRequest;
3199
- invariant(!PureXMLHttpRequest[IS_PATCHED_MODULE], 'Failed to patch the "XMLHttpRequest" module: already patched.');
3200
- globalThis.XMLHttpRequest = createXMLHttpRequestProxy({
3201
- emitter: this.emitter,
3202
- logger: this.logger
3203
- });
3204
- logger.info('native "XMLHttpRequest" module patched!', globalThis.XMLHttpRequest.name);
3205
- Object.defineProperty(globalThis.XMLHttpRequest, IS_PATCHED_MODULE, {
3206
- enumerable: true,
3207
- configurable: true,
3208
- value: true
3209
- });
3210
- this.subscriptions.push(() => {
3211
- Object.defineProperty(globalThis.XMLHttpRequest, IS_PATCHED_MODULE, { value: void 0 });
3212
- globalThis.XMLHttpRequest = PureXMLHttpRequest;
3213
- logger.info('native "XMLHttpRequest" module restored!', globalThis.XMLHttpRequest.name);
3214
- });
3576
+ logger.info("patching global XMLHttpRequest...");
3577
+ this.subscriptions.push(patchesRegistry.applyPatch(globalThis, "XMLHttpRequest", () => {
3578
+ return createXMLHttpRequestProxy({
3579
+ emitter: this.emitter,
3580
+ logger: this.logger
3581
+ });
3582
+ }));
3583
+ logger.info("global XMLHttpRequest patched!", globalThis.XMLHttpRequest.name);
3215
3584
  }
3216
3585
  };
3217
3586
 
@@ -3225,6 +3594,7 @@ var FallbackHttpSource = class extends import_interceptor_source.InterceptorSour
3225
3594
  });
3226
3595
  this.options = options;
3227
3596
  }
3597
+ options;
3228
3598
  enable() {
3229
3599
  super.enable();
3230
3600
  if (!this.options.quiet) {
@@ -3284,7 +3654,7 @@ function setupWorker(...handlers) {
3284
3654
  );
3285
3655
  return;
3286
3656
  }
3287
- const httpSource = supportsServiceWorker() ? new ServiceWorkerSource({
3657
+ const httpSource = supportsServiceWorker() ? await ServiceWorkerSource.from({
3288
3658
  serviceWorker: {
3289
3659
  url: options?.serviceWorker?.url?.toString() || DEFAULT_WORKER_URL,
3290
3660
  options: options?.serviceWorker?.options