msw 2.14.2 → 2.14.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1650,7 +1650,7 @@ Learn more about creating the Service Worker script: https://mswjs.io/docs/cli/i
1650
1650
  return registrationResult;
1651
1651
  };
1652
1652
 
1653
- // node_modules/.pnpm/rettime@0.11.7/node_modules/rettime/build/lens-list.mjs
1653
+ // node_modules/.pnpm/rettime@0.11.11/node_modules/rettime/build/lens-list.mjs
1654
1654
  var LensList = class {
1655
1655
  #list;
1656
1656
  #lens;
@@ -1692,15 +1692,17 @@ var LensList = class {
1692
1692
  }
1693
1693
  /**
1694
1694
  * Delete the value belonging to the given key.
1695
+ * Returns `true` if the value was present and removed, `false` otherwise.
1695
1696
  */
1696
1697
  delete(key, value) {
1697
- if (this.size === 0) return;
1698
- this.#list = this.#list.filter((item) => item[1] !== value);
1698
+ if (this.size === 0) return false;
1699
1699
  const values = this.#lens.get(key);
1700
- if (values) {
1701
- const index = values.indexOf(value);
1702
- if (index !== -1) values.splice(index, 1);
1703
- }
1700
+ if (!values) return false;
1701
+ const index = values.indexOf(value);
1702
+ if (index === -1) return false;
1703
+ values.splice(index, 1);
1704
+ this.#list.splice(this.#list.findIndex((item) => item[0] === key && item[1] === value), 1);
1705
+ return true;
1704
1706
  }
1705
1707
  /**
1706
1708
  * Delete all values belogning to the given key.
@@ -1723,7 +1725,7 @@ var LensList = class {
1723
1725
  }
1724
1726
  };
1725
1727
 
1726
- // node_modules/.pnpm/rettime@0.11.7/node_modules/rettime/build/index.mjs
1728
+ // node_modules/.pnpm/rettime@0.11.11/node_modules/rettime/build/index.mjs
1727
1729
  var kDefaultPrevented2 = Symbol("kDefaultPrevented");
1728
1730
  var kPropagationStopped = Symbol("kPropagationStopped");
1729
1731
  var kImmediatePropagationStopped = Symbol("kImmediatePropagationStopped");
@@ -1756,37 +1758,66 @@ var TypedEvent = class extends MessageEvent {
1756
1758
  var Emitter2 = class {
1757
1759
  #listeners;
1758
1760
  #listenerOptions;
1761
+ #listenerAbortCleanups;
1759
1762
  #typelessListeners;
1760
1763
  #hookListeners;
1761
1764
  #hookListenerOptions;
1765
+ #hookListenerAbortCleanups;
1762
1766
  hooks;
1763
1767
  constructor() {
1764
1768
  this.#listeners = new LensList();
1765
1769
  this.#listenerOptions = /* @__PURE__ */ new WeakMap();
1770
+ this.#listenerAbortCleanups = /* @__PURE__ */ new WeakMap();
1766
1771
  this.#typelessListeners = /* @__PURE__ */ new WeakSet();
1767
1772
  this.#hookListeners = new LensList();
1768
1773
  this.#hookListenerOptions = /* @__PURE__ */ new WeakMap();
1774
+ this.#hookListenerAbortCleanups = /* @__PURE__ */ new WeakMap();
1769
1775
  this.hooks = {
1770
1776
  on: (hook, callback, options) => {
1777
+ if (options?.signal?.aborted) return;
1771
1778
  if (options?.once) {
1772
1779
  const original = callback;
1773
1780
  const wrapper = ((...args) => {
1774
- this.#hookListeners.delete(hook, wrapper);
1781
+ this.#deleteHookListener(hook, wrapper);
1775
1782
  return original(...args);
1776
1783
  });
1777
1784
  callback = wrapper;
1778
1785
  }
1779
1786
  this.#hookListeners.append(hook, callback);
1780
1787
  if (options) this.#hookListenerOptions.set(callback, options);
1781
- if (options?.signal) options.signal.addEventListener("abort", () => {
1782
- this.#hookListeners.delete(hook, callback);
1783
- }, { once: true });
1788
+ if (options?.signal) {
1789
+ const { signal } = options;
1790
+ const onAbort = () => {
1791
+ this.#deleteHookListener(hook, callback);
1792
+ };
1793
+ signal.addEventListener("abort", onAbort, { once: true });
1794
+ this.#hookListenerAbortCleanups.set(callback, () => {
1795
+ signal.removeEventListener("abort", onAbort);
1796
+ });
1797
+ }
1784
1798
  },
1785
1799
  removeListener: (hook, callback) => {
1786
- this.#hookListeners.delete(hook, callback);
1800
+ this.#deleteHookListener(hook, callback);
1787
1801
  }
1788
1802
  };
1789
1803
  }
1804
+ #deleteHookListener(hook, callback) {
1805
+ this.#hookListeners.delete(hook, callback);
1806
+ const cleanup = this.#hookListenerAbortCleanups.get(callback);
1807
+ if (cleanup) {
1808
+ cleanup();
1809
+ this.#hookListenerAbortCleanups.delete(callback);
1810
+ }
1811
+ }
1812
+ #deleteListener(type, listener) {
1813
+ const removed = this.#listeners.delete(type, listener);
1814
+ const cleanup = this.#listenerAbortCleanups.get(listener);
1815
+ if (cleanup) {
1816
+ cleanup();
1817
+ this.#listenerAbortCleanups.delete(listener);
1818
+ }
1819
+ return removed;
1820
+ }
1790
1821
  /**
1791
1822
  * Adds a listener for the given event type.
1792
1823
  */
@@ -1888,8 +1919,8 @@ var Emitter2 = class {
1888
1919
  */
1889
1920
  removeListener(type, listener) {
1890
1921
  const options = this.#listenerOptions.get(listener);
1891
- this.#listeners.delete(type, listener);
1892
- for (const hook of this.#hookListeners.get("removeListener")) hook(type, listener, options);
1922
+ if (!this.#deleteListener(type, listener)) return;
1923
+ for (const hook of this.#hookListeners.get("removeListener").slice()) hook(type, listener, options);
1893
1924
  }
1894
1925
  /**
1895
1926
  * Removes all listeners for the given event type.
@@ -1897,11 +1928,12 @@ var Emitter2 = class {
1897
1928
  */
1898
1929
  removeAllListeners(type) {
1899
1930
  if (type == null) {
1900
- this.#listeners.clear();
1901
- for (const [hookType, hookListener] of this.#hookListeners) if (!this.#hookListenerOptions.get(hookListener)?.persist) this.#hookListeners.delete(hookType, hookListener);
1931
+ for (const [listenerType, listeners$1] of this.#listeners.entries()) while (listeners$1.length > 0) this.removeListener(listenerType, listeners$1[0]);
1932
+ for (const [hookType, hookListener] of [...this.#hookListeners]) if (!this.#hookListenerOptions.get(hookListener)?.persist) this.#deleteHookListener(hookType, hookListener);
1902
1933
  return;
1903
1934
  }
1904
- this.#listeners.deleteAll(type);
1935
+ const listeners = this.listeners(type);
1936
+ while (listeners.length > 0) this.removeListener(type, listeners[0]);
1905
1937
  }
1906
1938
  /**
1907
1939
  * Returns the list of listeners for the given event type.
@@ -1920,15 +1952,23 @@ var Emitter2 = class {
1920
1952
  return this.listeners(type).length;
1921
1953
  }
1922
1954
  #addListener(type, listener, options, insertMode = "append") {
1923
- for (const hook of this.#hookListeners.get("newListener")) hook(type, listener, options);
1955
+ if (options?.signal?.aborted) return;
1956
+ for (const hook of this.#hookListeners.get("newListener").slice()) hook(type, listener, options);
1924
1957
  if (type === "*") this.#typelessListeners.add(listener);
1925
1958
  if (insertMode === "prepend") this.#listeners.prepend(type, listener);
1926
1959
  else this.#listeners.append(type, listener);
1927
1960
  if (options) {
1928
1961
  this.#listenerOptions.set(listener, options);
1929
- if (options.signal) options.signal.addEventListener("abort", () => {
1930
- this.removeListener(type, listener);
1931
- }, { once: true });
1962
+ if (options.signal) {
1963
+ const { signal } = options;
1964
+ const onAbort = () => {
1965
+ this.removeListener(type, listener);
1966
+ };
1967
+ signal.addEventListener("abort", onAbort, { once: true });
1968
+ this.#listenerAbortCleanups.set(listener, () => {
1969
+ signal.removeEventListener("abort", onAbort);
1970
+ });
1971
+ }
1932
1972
  }
1933
1973
  }
1934
1974
  #proxyEvent(event) {
@@ -1945,22 +1985,27 @@ var Emitter2 = class {
1945
1985
  };
1946
1986
  }
1947
1987
  #callListener(event, listener) {
1948
- for (const hook of this.#hookListeners.get("beforeEmit")) if (hook(event) === false) return;
1988
+ for (const hook of this.#hookListeners.get("beforeEmit").slice()) if (hook(event) === false) return;
1949
1989
  const returnValue = listener.call(this, event);
1950
1990
  const options = this.#listenerOptions.get(listener);
1951
1991
  if (options?.once) {
1952
1992
  const type = this.#isTypelessListener(listener) ? "*" : event.type;
1953
- this.#listeners.delete(type, listener);
1954
- for (const hook of this.#hookListeners.get("removeListener")) hook(type, listener, options);
1993
+ if (this.#deleteListener(type, listener)) for (const hook of this.#hookListeners.get("removeListener").slice()) hook(type, listener, options);
1955
1994
  }
1956
1995
  return returnValue;
1957
1996
  }
1958
1997
  /**
1959
1998
  * Return a list of all event listeners relevant for the given event type.
1960
1999
  * This includes the explicit event listeners and also typeless event listeners.
2000
+ *
2001
+ * @note Snapshot the matching listeners before yielding. Listeners can add or
2002
+ * remove other listeners during emission (e.g. `earlyOn` unshifts `#list`),
2003
+ * which would otherwise shift the live iterator and re-yield prior entries.
1961
2004
  */
1962
2005
  *#matchListeners(type) {
1963
- for (const [key, listener] of this.#listeners) if (key === "*" || key === type) yield listener;
2006
+ const snapshot = [];
2007
+ for (const [key, listener] of this.#listeners) if (key === "*" || key === type) snapshot.push(listener);
2008
+ yield* snapshot;
1964
2009
  }
1965
2010
  #isTypelessListener(listener) {
1966
2011
  return this.#typelessListeners.has(listener);
@@ -2274,11 +2319,12 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
2274
2319
  }
2275
2320
  async #handleResponse(event) {
2276
2321
  const { request, response, isMockedResponse } = event.data;
2322
+ const frame = this.#frames.get(request.id);
2277
2323
  if (response.type?.includes("opaque")) {
2278
2324
  this.#frames.delete(request.id);
2325
+ frame?.events.removeAllListeners();
2279
2326
  return;
2280
2327
  }
2281
- const frame = this.#frames.get(request.id);
2282
2328
  this.#frames.delete(request.id);
2283
2329
  if (frame == null) {
2284
2330
  return;
@@ -2302,17 +2348,21 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
2302
2348
  url: request.url
2303
2349
  }
2304
2350
  );
2305
- frame.events.emit(
2306
- new ResponseEvent(
2307
- isMockedResponse ? "response:mocked" : "response:bypass",
2308
- {
2309
- requestId: frame.data.id,
2310
- request: fetchRequest,
2311
- response: fetchResponse,
2312
- isMockedResponse
2313
- }
2314
- )
2315
- );
2351
+ try {
2352
+ frame.events.emit(
2353
+ new ResponseEvent(
2354
+ isMockedResponse ? "response:mocked" : "response:bypass",
2355
+ {
2356
+ requestId: frame.data.id,
2357
+ request: fetchRequest,
2358
+ response: fetchResponse,
2359
+ isMockedResponse
2360
+ }
2361
+ )
2362
+ );
2363
+ } finally {
2364
+ frame.events.removeAllListeners();
2365
+ }
2316
2366
  }
2317
2367
  #defaultFindWorker = (workerUrl, mockServiceWorkerUrl) => {
2318
2368
  return workerUrl === mockServiceWorkerUrl;