msw 2.14.5 → 2.14.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 (110) hide show
  1. package/README.md +5 -5
  2. package/lib/browser/index.js +232 -92
  3. package/lib/browser/index.js.map +1 -1
  4. package/lib/browser/index.mjs +232 -92
  5. package/lib/browser/index.mjs.map +1 -1
  6. package/lib/core/{HttpResponse-CQwYpuKo.d.mts → HttpResponse-BTyqrRB6.d.mts} +1 -1
  7. package/lib/core/{HttpResponse-BFS34nkx.d.ts → HttpResponse-BXyXQFMJ.d.ts} +1 -1
  8. package/lib/core/HttpResponse.d.mts +1 -1
  9. package/lib/core/HttpResponse.d.ts +1 -1
  10. package/lib/core/HttpResponse.js +2 -2
  11. package/lib/core/HttpResponse.js.map +1 -1
  12. package/lib/core/HttpResponse.mjs +2 -2
  13. package/lib/core/HttpResponse.mjs.map +1 -1
  14. package/lib/core/experimental/compat.d.mts +2 -2
  15. package/lib/core/experimental/compat.d.ts +2 -2
  16. package/lib/core/experimental/define-network.d.mts +2 -2
  17. package/lib/core/experimental/define-network.d.ts +2 -2
  18. package/lib/core/experimental/define-network.js +16 -6
  19. package/lib/core/experimental/define-network.js.map +1 -1
  20. package/lib/core/experimental/define-network.mjs +16 -6
  21. package/lib/core/experimental/define-network.mjs.map +1 -1
  22. package/lib/core/experimental/frames/http-frame.d.mts +2 -2
  23. package/lib/core/experimental/frames/http-frame.d.ts +2 -2
  24. package/lib/core/experimental/frames/network-frame.d.mts +2 -2
  25. package/lib/core/experimental/frames/network-frame.d.ts +2 -2
  26. package/lib/core/experimental/frames/network-frame.js +2 -0
  27. package/lib/core/experimental/frames/network-frame.js.map +1 -1
  28. package/lib/core/experimental/frames/network-frame.mjs +2 -0
  29. package/lib/core/experimental/frames/network-frame.mjs.map +1 -1
  30. package/lib/core/experimental/frames/websocket-frame.d.mts +2 -2
  31. package/lib/core/experimental/frames/websocket-frame.d.ts +2 -2
  32. package/lib/core/experimental/handlers-controller.d.mts +1 -1
  33. package/lib/core/experimental/handlers-controller.d.ts +1 -1
  34. package/lib/core/experimental/index.d.mts +2 -2
  35. package/lib/core/experimental/index.d.ts +2 -2
  36. package/lib/core/experimental/on-unhandled-frame.d.mts +2 -2
  37. package/lib/core/experimental/on-unhandled-frame.d.ts +2 -2
  38. package/lib/core/experimental/setup-api.d.mts +1 -1
  39. package/lib/core/experimental/setup-api.d.ts +1 -1
  40. package/lib/core/experimental/sources/interceptor-source.d.mts +2 -2
  41. package/lib/core/experimental/sources/interceptor-source.d.ts +2 -2
  42. package/lib/core/experimental/sources/network-source.d.mts +2 -2
  43. package/lib/core/experimental/sources/network-source.d.ts +2 -2
  44. package/lib/core/getResponse.d.mts +1 -1
  45. package/lib/core/getResponse.d.ts +1 -1
  46. package/lib/core/graphql.d.mts +1 -1
  47. package/lib/core/graphql.d.ts +1 -1
  48. package/lib/core/handlers/GraphQLHandler.d.mts +1 -1
  49. package/lib/core/handlers/GraphQLHandler.d.ts +1 -1
  50. package/lib/core/handlers/HttpHandler.d.mts +1 -1
  51. package/lib/core/handlers/HttpHandler.d.ts +1 -1
  52. package/lib/core/handlers/RequestHandler.d.mts +1 -1
  53. package/lib/core/handlers/RequestHandler.d.ts +1 -1
  54. package/lib/core/handlers/WebSocketHandler.js +7 -6
  55. package/lib/core/handlers/WebSocketHandler.js.map +1 -1
  56. package/lib/core/handlers/WebSocketHandler.mjs +7 -6
  57. package/lib/core/handlers/WebSocketHandler.mjs.map +1 -1
  58. package/lib/core/http.d.mts +1 -1
  59. package/lib/core/http.d.ts +1 -1
  60. package/lib/core/index.d.mts +1 -1
  61. package/lib/core/index.d.ts +1 -1
  62. package/lib/core/{on-unhandled-frame-BBR-P3kV.d.ts → on-unhandled-frame-0KmwUmeV.d.ts} +1 -1
  63. package/lib/core/{on-unhandled-frame-Cr1KOZ0I.d.mts → on-unhandled-frame-gkokW4Rr.d.mts} +1 -1
  64. package/lib/core/passthrough.d.mts +1 -1
  65. package/lib/core/passthrough.d.ts +1 -1
  66. package/lib/core/sse.d.mts +1 -1
  67. package/lib/core/sse.d.ts +1 -1
  68. package/lib/core/sse.js +18 -13
  69. package/lib/core/sse.js.map +1 -1
  70. package/lib/core/sse.mjs +18 -13
  71. package/lib/core/sse.mjs.map +1 -1
  72. package/lib/core/utils/HttpResponse/decorators.d.mts +1 -1
  73. package/lib/core/utils/HttpResponse/decorators.d.ts +1 -1
  74. package/lib/core/utils/HttpResponse/decorators.js +1 -1
  75. package/lib/core/utils/HttpResponse/decorators.js.map +1 -1
  76. package/lib/core/utils/HttpResponse/decorators.mjs +1 -1
  77. package/lib/core/utils/HttpResponse/decorators.mjs.map +1 -1
  78. package/lib/core/utils/executeHandlers.d.mts +1 -1
  79. package/lib/core/utils/executeHandlers.d.ts +1 -1
  80. package/lib/core/utils/handleRequest.d.mts +1 -1
  81. package/lib/core/utils/handleRequest.d.ts +1 -1
  82. package/lib/core/utils/internal/Disposable.js +19 -1
  83. package/lib/core/utils/internal/Disposable.js.map +1 -1
  84. package/lib/core/utils/internal/Disposable.mjs +19 -1
  85. package/lib/core/utils/internal/Disposable.mjs.map +1 -1
  86. package/lib/core/utils/internal/attachSiblingHandlers.d.mts +1 -1
  87. package/lib/core/utils/internal/attachSiblingHandlers.d.ts +1 -1
  88. package/lib/core/utils/internal/attachSiblingHandlers.js +1 -1
  89. package/lib/core/utils/internal/attachSiblingHandlers.js.map +1 -1
  90. package/lib/core/utils/internal/attachSiblingHandlers.mjs +1 -1
  91. package/lib/core/utils/internal/attachSiblingHandlers.mjs.map +1 -1
  92. package/lib/core/utils/internal/isHandlerKind.d.mts +1 -1
  93. package/lib/core/utils/internal/isHandlerKind.d.ts +1 -1
  94. package/lib/core/utils/internal/parseGraphQLRequest.d.mts +1 -1
  95. package/lib/core/utils/internal/parseGraphQLRequest.d.ts +1 -1
  96. package/lib/core/utils/internal/parseMultipartData.d.mts +1 -1
  97. package/lib/core/utils/internal/parseMultipartData.d.ts +1 -1
  98. package/lib/core/ws/WebSocketClientManager.js +4 -0
  99. package/lib/core/ws/WebSocketClientManager.js.map +1 -1
  100. package/lib/core/ws/WebSocketClientManager.mjs +4 -0
  101. package/lib/core/ws/WebSocketClientManager.mjs.map +1 -1
  102. package/lib/core/ws/handleWebSocketEvent.d.mts +1 -1
  103. package/lib/core/ws/handleWebSocketEvent.d.ts +1 -1
  104. package/lib/iife/index.js +4435 -979
  105. package/lib/iife/index.js.map +1 -1
  106. package/lib/mockServiceWorker.js +1 -1
  107. package/package.json +4 -5
  108. package/src/core/experimental/define-network.ts +30 -6
  109. package/src/core/sse.ts +15 -4
  110. package/src/core/utils/internal/Disposable.ts +22 -1
package/README.md CHANGED
@@ -172,11 +172,6 @@ Mock Service Worker is trusted by hundreds of thousands of engineers around the
172
172
  </picture>
173
173
  </a>
174
174
  </td>
175
- <td>
176
- <a href="https://www.codacy.com/" target="_blank">
177
- <img src="media/sponsors/codacy.svg" alt="Codacy" height="64" />
178
- </a>
179
- </td>
180
175
  <td>
181
176
  <a href="https://workleap.com/" target="_blank">
182
177
  <img src="media/sponsors/workleap.svg" alt="Workleap" height="64" width="174" />
@@ -194,6 +189,11 @@ Mock Service Worker is trusted by hundreds of thousands of engineers around the
194
189
  <img src="media/sponsors/stackblitz.svg" alt="StackBlitz" height="64" />
195
190
  </a>
196
191
  </td>
192
+ <td align="center">
193
+ <a href="https://coderabbit.link/mswjs" target="_blank">
194
+ <img src="media/sponsors/coderabbit.svg" alt="CodeRabbit" height="64" />
195
+ </a>
196
+ </td>
197
197
  </tr>
198
198
  </table>
199
199
 
@@ -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.3/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.3/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.3/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.3/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
 
@@ -1401,8 +1454,7 @@ var DeferredPromise2 = class extends Promise {
1401
1454
  }
1402
1455
  };
1403
1456
 
1404
- // node_modules/.pnpm/@mswjs+interceptors@0.41.3/node_modules/@mswjs/interceptors/lib/browser/getRawRequest-BTaNLFr0.mjs
1405
- var IS_PATCHED_MODULE = Symbol("isPatchedModule");
1457
+ // node_modules/.pnpm/@mswjs+interceptors@0.41.9/node_modules/@mswjs/interceptors/lib/browser/getRawRequest-B1BqgWG6.mjs
1406
1458
  var InterceptorError = class InterceptorError2 extends Error {
1407
1459
  constructor(message) {
1408
1460
  super(message);
@@ -1484,6 +1536,68 @@ function getValueBySymbol(symbolName, source) {
1484
1536
  });
1485
1537
  if (symbol) return Reflect.get(source, symbol);
1486
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");
1487
1601
  var FetchResponse = class FetchResponse2 extends Response {
1488
1602
  static {
1489
1603
  this.STATUS_CODES_WITHOUT_BODY = [
@@ -1516,6 +1630,20 @@ var FetchResponse = class FetchResponse2 extends Response {
1516
1630
  static isResponseWithBody(status) {
1517
1631
  return !FetchResponse2.STATUS_CODES_WITHOUT_BODY.includes(status);
1518
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
+ }
1519
1647
  static setUrl(url, response) {
1520
1648
  if (!url || url === "about:" || !canParseUrl(url)) return;
1521
1649
  const state = getValueBySymbol("state", response);
@@ -1526,6 +1654,10 @@ var FetchResponse = class FetchResponse2 extends Response {
1526
1654
  configurable: true,
1527
1655
  writable: false
1528
1656
  });
1657
+ Object.defineProperty(response, kUrl, {
1658
+ value: url,
1659
+ enumerable: false
1660
+ });
1529
1661
  }
1530
1662
  /**
1531
1663
  * Parses the given raw HTTP headers into a Fetch API `Headers` instance.
@@ -1535,6 +1667,27 @@ var FetchResponse = class FetchResponse2 extends Response {
1535
1667
  for (let line = 0; line < rawHeaders.length; line += 2) headers.append(rawHeaders[line], rawHeaders[line + 1]);
1536
1668
  return headers;
1537
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
+ }
1538
1691
  constructor(body, init = {}) {
1539
1692
  const status = init.status ?? 200;
1540
1693
  const safeStatus = FetchResponse2.isConfigurableStatusCode(status) ? status : 200;
@@ -1544,25 +1697,24 @@ var FetchResponse = class FetchResponse2 extends Response {
1544
1697
  statusText: init.statusText,
1545
1698
  headers: init.headers
1546
1699
  });
1547
- if (status !== safeStatus) {
1548
- const state = getValueBySymbol("state", this);
1549
- if (state) state.status = status;
1550
- else Object.defineProperty(this, "status", {
1551
- value: status,
1552
- enumerable: true,
1553
- configurable: true,
1554
- writable: false
1555
- });
1556
- }
1700
+ if (status !== safeStatus) FetchResponse2.setStatus(status, this);
1557
1701
  FetchResponse2.setUrl(init.url, this);
1558
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
+ }
1559
1711
  };
1560
- var kRawRequest = Symbol("kRawRequest");
1712
+ var kRawRequest = /* @__PURE__ */ Symbol("kRawRequest");
1561
1713
  function setRawRequest(request, rawRequest) {
1562
1714
  Reflect.set(request, kRawRequest, rawRequest);
1563
1715
  }
1564
1716
 
1565
- // node_modules/.pnpm/@mswjs+interceptors@0.41.3/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
1566
1718
  var encoder = new TextEncoder();
1567
1719
  function encodeBuffer(text) {
1568
1720
  return encoder.encode(text);
@@ -1747,9 +1899,9 @@ var LensList = class {
1747
1899
  };
1748
1900
 
1749
1901
  // node_modules/.pnpm/rettime@0.11.11/node_modules/rettime/build/index.mjs
1750
- var kDefaultPrevented2 = Symbol("kDefaultPrevented");
1751
- var kPropagationStopped = Symbol("kPropagationStopped");
1752
- var kImmediatePropagationStopped = Symbol("kImmediatePropagationStopped");
1902
+ var kDefaultPrevented2 = /* @__PURE__ */ Symbol("kDefaultPrevented");
1903
+ var kPropagationStopped = /* @__PURE__ */ Symbol("kPropagationStopped");
1904
+ var kImmediatePropagationStopped = /* @__PURE__ */ Symbol("kImmediatePropagationStopped");
1753
1905
  var TypedEvent = class extends MessageEvent {
1754
1906
  /**
1755
1907
  * @note Keep a placeholder property with the return type
@@ -2513,7 +2665,7 @@ var until2 = async (promise) => {
2513
2665
  }
2514
2666
  };
2515
2667
 
2516
- // node_modules/.pnpm/@mswjs+interceptors@0.41.3/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
2517
2669
  function isObject2(value, loose = false) {
2518
2670
  return loose ? Object.prototype.toString.call(value).startsWith("[object ") : Object.prototype.toString.call(value) === "[object Object]";
2519
2671
  }
@@ -2577,14 +2729,15 @@ async function handleRequest(options) {
2577
2729
  return false;
2578
2730
  };
2579
2731
  const requestAbortPromise = new DeferredPromise();
2732
+ const onAbort = () => {
2733
+ requestAbortPromise.reject(options.request.signal?.reason);
2734
+ };
2580
2735
  if (options.request.signal) {
2581
2736
  if (options.request.signal.aborted) {
2582
2737
  await options.controller.errorWith(options.request.signal.reason);
2583
2738
  return;
2584
2739
  }
2585
- options.request.signal.addEventListener("abort", () => {
2586
- requestAbortPromise.reject(options.request.signal.reason);
2587
- }, { once: true });
2740
+ options.request.signal.addEventListener("abort", onAbort, { once: true });
2588
2741
  }
2589
2742
  const result = await until2(async () => {
2590
2743
  const requestListenersPromise = emitAsync(options.emitter, "request", {
@@ -2598,6 +2751,7 @@ async function handleRequest(options) {
2598
2751
  options.controller.handled
2599
2752
  ]);
2600
2753
  });
2754
+ options.request.signal?.removeEventListener("abort", onAbort);
2601
2755
  if (requestAbortPromise.state === "rejected") {
2602
2756
  await options.controller.errorWith(requestAbortPromise.rejectionReason);
2603
2757
  return;
@@ -2630,7 +2784,7 @@ async function handleRequest(options) {
2630
2784
  return options.controller.handled;
2631
2785
  }
2632
2786
 
2633
- // node_modules/.pnpm/@mswjs+interceptors@0.41.3/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
2634
2788
  function createNetworkError(cause) {
2635
2789
  return Object.assign(/* @__PURE__ */ new TypeError("Failed to fetch"), { cause });
2636
2790
  }
@@ -2641,7 +2795,7 @@ var REQUEST_BODY_HEADERS = [
2641
2795
  "content-type",
2642
2796
  "content-length"
2643
2797
  ];
2644
- var kRedirectCount = Symbol("kRedirectCount");
2798
+ var kRedirectCount = /* @__PURE__ */ Symbol("kRedirectCount");
2645
2799
  async function followFetchRedirect(request, response) {
2646
2800
  if (response.status !== 303 && request.body != null) return Promise.reject(createNetworkError());
2647
2801
  const requestUrl = new URL(request.url);
@@ -2723,7 +2877,7 @@ function decompressResponse(response) {
2723
2877
  }
2724
2878
  var FetchInterceptor = class FetchInterceptor2 extends Interceptor {
2725
2879
  static {
2726
- this.symbol = Symbol("fetch");
2880
+ this.symbol = /* @__PURE__ */ Symbol.for("fetch-interceptor");
2727
2881
  }
2728
2882
  constructor() {
2729
2883
  super(FetchInterceptor2.symbol);
@@ -2732,12 +2886,11 @@ var FetchInterceptor = class FetchInterceptor2 extends Interceptor {
2732
2886
  return hasConfigurableGlobal("fetch");
2733
2887
  }
2734
2888
  async setup() {
2889
+ const logger = this.logger.extend("setup");
2735
2890
  const pureFetch = globalThis.fetch;
2736
- invariant(!pureFetch[IS_PATCHED_MODULE], 'Failed to patch the "fetch" module: already patched.');
2737
- globalThis.fetch = async (input, init) => {
2891
+ const fetchProxy = async (input, init) => {
2738
2892
  const requestId = createRequestId();
2739
- const resolvedInput = typeof input === "string" && typeof location !== "undefined" && !canParseUrl(input) ? new URL(input, location.href) : input;
2740
- 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);
2741
2894
  if (input instanceof Request) setRawRequest(request, input);
2742
2895
  const responsePromise = new DeferredPromise();
2743
2896
  const controller = new RequestController(request, {
@@ -2749,7 +2902,7 @@ var FetchInterceptor = class FetchInterceptor2 extends Interceptor {
2749
2902
  this.logger.info("original fetch performed", originalResponse);
2750
2903
  if (this.emitter.listenerCount("response") > 0) {
2751
2904
  this.logger.info('emitting the "response" event...');
2752
- const responseClone = originalResponse.clone();
2905
+ const responseClone = FetchResponse.clone(originalResponse);
2753
2906
  await emitAsync(this.emitter, "response", {
2754
2907
  response: responseClone,
2755
2908
  isMockedResponse: false,
@@ -2766,9 +2919,12 @@ var FetchInterceptor = class FetchInterceptor2 extends Interceptor {
2766
2919
  return;
2767
2920
  }
2768
2921
  this.logger.info("received mocked response!", { rawResponse });
2769
- const decompressedStream = decompressResponse(rawResponse);
2770
- const response = decompressedStream === null ? rawResponse : new FetchResponse(decompressedStream, rawResponse);
2771
- 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
+ });
2772
2928
  if (FetchResponse.isRedirectResponse(response.status)) {
2773
2929
  if (request.redirect === "error") {
2774
2930
  responsePromise.reject(createNetworkError("unexpected redirect"));
@@ -2786,7 +2942,7 @@ var FetchInterceptor = class FetchInterceptor2 extends Interceptor {
2786
2942
  if (this.emitter.listenerCount("response") > 0) {
2787
2943
  this.logger.info('emitting the "response" event...');
2788
2944
  await emitAsync(this.emitter, "response", {
2789
- response: response.clone(),
2945
+ response: FetchResponse.clone(response),
2790
2946
  isMockedResponse: true,
2791
2947
  request,
2792
2948
  requestId
@@ -2810,20 +2966,13 @@ var FetchInterceptor = class FetchInterceptor2 extends Interceptor {
2810
2966
  });
2811
2967
  return responsePromise;
2812
2968
  };
2813
- Object.defineProperty(globalThis.fetch, IS_PATCHED_MODULE, {
2814
- enumerable: true,
2815
- configurable: true,
2816
- value: true
2817
- });
2818
- this.subscriptions.push(() => {
2819
- Object.defineProperty(globalThis.fetch, IS_PATCHED_MODULE, { value: void 0 });
2820
- globalThis.fetch = pureFetch;
2821
- this.logger.info('restored native "globalThis.fetch"!', globalThis.fetch.name);
2822
- });
2969
+ logger.info("patching global fetch...");
2970
+ this.subscriptions.push(patchesRegistry.applyPatch(globalThis, "fetch", () => fetchProxy));
2971
+ logger.info("global fetch patched!", globalThis.fetch.name);
2823
2972
  }
2824
2973
  };
2825
2974
 
2826
- // node_modules/.pnpm/@mswjs+interceptors@0.41.3/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
2827
2976
  function concatArrayBuffer(left, right) {
2828
2977
  const result = new Uint8Array(left.byteLength + right.byteLength);
2829
2978
  result.set(left, 0);
@@ -2989,9 +3138,9 @@ async function getBodyByteLength(input) {
2989
3138
  if (explicitContentLength != null && explicitContentLength !== "") return Number(explicitContentLength);
2990
3139
  return (await input.arrayBuffer()).byteLength;
2991
3140
  }
2992
- var kIsRequestHandled = Symbol("kIsRequestHandled");
3141
+ var kIsRequestHandled = /* @__PURE__ */ Symbol("kIsRequestHandled");
2993
3142
  var IS_NODE2 = isNodeProcess();
2994
- var kFetchRequest = Symbol("kFetchRequest");
3143
+ var kFetchRequest = /* @__PURE__ */ Symbol("kFetchRequest");
2995
3144
  var XMLHttpRequestController = class {
2996
3145
  constructor(initialRequest, logger) {
2997
3146
  this.initialRequest = initialRequest;
@@ -3329,7 +3478,7 @@ var XMLHttpRequestController = class {
3329
3478
  toFetchApiRequest(body) {
3330
3479
  this.logger.info("converting request to a Fetch API Request...");
3331
3480
  const resolvedBody = body instanceof Document ? body.documentElement.innerText : body;
3332
- const fetchRequest = new Request(this.url.href, {
3481
+ const fetchRequest = new FetchRequest(this.url.href, {
3333
3482
  method: this.method,
3334
3483
  headers: this.requestHeaders,
3335
3484
  credentials: this.request.withCredentials ? "include" : "same-origin",
@@ -3414,34 +3563,24 @@ function createXMLHttpRequestProxy({ emitter, logger }) {
3414
3563
  }
3415
3564
  var XMLHttpRequestInterceptor = class XMLHttpRequestInterceptor2 extends Interceptor {
3416
3565
  static {
3417
- this.interceptorSymbol = Symbol("xhr");
3566
+ this.symbol = /* @__PURE__ */ Symbol.for("xhr-interceptor");
3418
3567
  }
3419
3568
  constructor() {
3420
- super(XMLHttpRequestInterceptor2.interceptorSymbol);
3569
+ super(XMLHttpRequestInterceptor2.symbol);
3421
3570
  }
3422
3571
  checkEnvironment() {
3423
3572
  return hasConfigurableGlobal("XMLHttpRequest");
3424
3573
  }
3425
3574
  setup() {
3426
3575
  const logger = this.logger.extend("setup");
3427
- logger.info('patching "XMLHttpRequest" module...');
3428
- const PureXMLHttpRequest = globalThis.XMLHttpRequest;
3429
- invariant(!PureXMLHttpRequest[IS_PATCHED_MODULE], 'Failed to patch the "XMLHttpRequest" module: already patched.');
3430
- globalThis.XMLHttpRequest = createXMLHttpRequestProxy({
3431
- emitter: this.emitter,
3432
- logger: this.logger
3433
- });
3434
- logger.info('native "XMLHttpRequest" module patched!', globalThis.XMLHttpRequest.name);
3435
- Object.defineProperty(globalThis.XMLHttpRequest, IS_PATCHED_MODULE, {
3436
- enumerable: true,
3437
- configurable: true,
3438
- value: true
3439
- });
3440
- this.subscriptions.push(() => {
3441
- Object.defineProperty(globalThis.XMLHttpRequest, IS_PATCHED_MODULE, { value: void 0 });
3442
- globalThis.XMLHttpRequest = PureXMLHttpRequest;
3443
- logger.info('native "XMLHttpRequest" module restored!', globalThis.XMLHttpRequest.name);
3444
- });
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);
3445
3584
  }
3446
3585
  };
3447
3586
 
@@ -3455,6 +3594,7 @@ var FallbackHttpSource = class extends import_interceptor_source.InterceptorSour
3455
3594
  });
3456
3595
  this.options = options;
3457
3596
  }
3597
+ options;
3458
3598
  enable() {
3459
3599
  super.enable();
3460
3600
  if (!this.options.quiet) {