msw 0.47.3 → 0.48.0

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.
package/lib/index.d.ts CHANGED
@@ -1,11 +1,12 @@
1
- import { R as ResponseTransformer, s as status, a as set, d as delay, f as fetch, b as RequestHandler, S as SetupWorkerApi, D as DefaultContext, c as DefaultBodyType, M as MockedRequest, e as ResponseResolver, g as ResponseResolutionContext, h as SerializedResponse, i as RequestHandlerDefaultInfo, j as MockedResponse, k as ResponseLookupResult, l as SharedOptions, m as ServerLifecycleEventsMap } from './glossary-dc3fd077.js';
2
- export { A as AsyncResponseResolverReturnType, c as DefaultBodyType, u as DefaultRequestMultipartBody, y as DelayMode, M as MockedRequest, H as MockedRequestInit, j as MockedResponse, z as RequestCache, E as RequestDestination, b as RequestHandler, B as RequestMode, F as RequestPriority, C as RequestRedirect, G as RequestReferrerPolicy, v as ResponseComposition, w as ResponseCompositionOptions, x as ResponseFunction, e as ResponseResolver, t as ResponseResolverReturnType, R as ResponseTransformer, S as SetupWorkerApi, l as SharedOptions, q as StartOptions, o as createResponseComposition, p as defaultContext, n as defaultResponse, r as response } from './glossary-dc3fd077.js';
1
+ import { R as ResponseTransformer, s as status, a as set, d as delay, f as fetch, b as RequestHandler, S as SetupApi, W as WorkerLifecycleEventsMap, c as StartOptions, e as StartReturnType, D as DefaultContext, g as DefaultBodyType, M as MockedRequest, h as ResponseResolver, i as ResponseResolutionContext, j as SerializedResponse, k as RequestHandlerDefaultInfo, l as MockedResponse, m as ResponseLookupResult, n as SharedOptions } from './SetupApi-75fbec12.js';
2
+ export { A as AsyncResponseResolverReturnType, g as DefaultBodyType, v as DefaultRequestMultipartBody, z as DelayMode, M as MockedRequest, I as MockedRequestInit, l as MockedResponse, B as RequestCache, F as RequestDestination, b as RequestHandler, C as RequestMode, G as RequestPriority, E as RequestRedirect, H as RequestReferrerPolicy, w as ResponseComposition, x as ResponseCompositionOptions, y as ResponseFunction, h as ResponseResolver, u as ResponseResolverReturnType, R as ResponseTransformer, S as SetupApi, t as SetupWorkerApi, n as SharedOptions, c as StartOptions, p as createResponseComposition, q as defaultContext, o as defaultResponse, r as response } from './SetupApi-75fbec12.js';
3
3
  import * as cookieUtils from 'cookie';
4
4
  import { GraphQLError, OperationTypeNode, DocumentNode } from 'graphql';
5
5
  import { StrictEventEmitter } from 'strict-event-emitter';
6
- import 'type-fest';
7
- import '@mswjs/interceptors';
6
+ import { S as ServerLifecycleEventsMap } from './glossary-a22f5c13.js';
8
7
  import 'headers-polyfill';
8
+ import '@mswjs/interceptors';
9
+ import 'type-fest';
9
10
 
10
11
  declare type Path = string | RegExp;
11
12
  declare type PathParams<KeyType extends keyof any = string> = {
@@ -122,13 +123,23 @@ declare namespace index {
122
123
  };
123
124
  }
124
125
 
126
+ declare class SetupWorkerApi extends SetupApi<WorkerLifecycleEventsMap> {
127
+ private context;
128
+ private startHandler;
129
+ private stopHandler;
130
+ private listeners;
131
+ constructor(handlers: Array<RequestHandler>);
132
+ private createWorkerContext;
133
+ start(options?: StartOptions): StartReturnType;
134
+ printHandlers(): void;
135
+ stop(): void;
136
+ }
125
137
  /**
126
- * Creates a new mock Service Worker registration
127
- * with the given request handlers.
128
- * @param {RequestHandler[]} requestHandlers List of request handlers
138
+ * Sets up a requests interception in the browser with the given request handlers.
139
+ * @param {RequestHandler[]} handlers List of request handlers.
129
140
  * @see {@link https://mswjs.io/docs/api/setup-worker `setupWorker`}
130
141
  */
131
- declare function setupWorker(...requestHandlers: RequestHandler[]): SetupWorkerApi;
142
+ declare function setupWorker(...handlers: Array<RequestHandler>): SetupWorkerApi;
132
143
 
133
144
  declare type RestHandlerMethod = string | RegExp;
134
145
  interface RestHandlerInfo extends RequestHandlerDefaultInfo {
package/lib/index.js CHANGED
@@ -56,6 +56,7 @@ __export(src_exports, {
56
56
  RESTMethods: () => RESTMethods,
57
57
  RequestHandler: () => RequestHandler,
58
58
  RestHandler: () => RestHandler,
59
+ SetupApi: () => SetupApi,
59
60
  cleanUrl: () => cleanUrl,
60
61
  compose: () => compose,
61
62
  context: () => context_exports,
@@ -253,7 +254,7 @@ var errors = (errorsList) => {
253
254
  // src/context/fetch.ts
254
255
  var import_is_node_process2 = require("is-node-process");
255
256
  var import_headers_polyfill2 = require("headers-polyfill");
256
- var useFetch = (0, import_is_node_process2.isNodeProcess)() ? require("node-fetch") : window.fetch;
257
+ var useFetch = (0, import_is_node_process2.isNodeProcess)() ? (input, init) => Promise.resolve().then(() => __toESM(require("node-fetch"))).then(({ default: nodeFetch }) => nodeFetch(input, init)) : window.fetch;
257
258
  var augmentRequestInit = (requestInit) => {
258
259
  const headers = new import_headers_polyfill2.Headers(requestInit.headers);
259
260
  headers.set("x-msw-bypass", "true");
@@ -304,8 +305,8 @@ var xml = (body2) => {
304
305
  };
305
306
 
306
307
  // src/setupWorker/setupWorker.ts
308
+ var import_outvariant4 = require("outvariant");
307
309
  var import_is_node_process3 = require("is-node-process");
308
- var import_strict_event_emitter = require("strict-event-emitter");
309
310
 
310
311
  // src/setupWorker/start/createStartHandler.ts
311
312
  var import_until4 = require("@open-draft/until");
@@ -814,7 +815,7 @@ function prepareResponse(res) {
814
815
 
815
816
  // src/utils/matching/matchRequestUrl.ts
816
817
  var import_path_to_regexp = require("path-to-regexp");
817
- var import_getCleanUrl = require("@mswjs/interceptors/lib/utils/getCleanUrl");
818
+ var import_getCleanUrl = require("@mswjs/interceptors/lib/utils/getCleanUrl.js");
818
819
 
819
820
  // src/utils/url/cleanUrl.ts
820
821
  var REDUNDANT_CHARACTERS_EXP = /[\?|#].*$/g;
@@ -921,7 +922,7 @@ var response = Object.assign(createResponseComposition(), {
921
922
  });
922
923
 
923
924
  // src/utils/internal/getCallFrame.ts
924
- var SOURCE_FRAME = /\/msw\/src\/(.+)/;
925
+ var SOURCE_FRAME = /[\/\\]msw[\/\\]src[\/\\](.+)/;
925
926
  var BUILD_FRAME = /(node_modules)?[\/\\]lib[\/\\](umd|esm|iief|cjs)[\/\\]|^[^\/\\]*$/;
926
927
  function getCallFrame(error2) {
927
928
  const stack = error2.stack;
@@ -1383,6 +1384,7 @@ function serializeResponse(source) {
1383
1384
  // src/setupWorker/start/createRequestListener.ts
1384
1385
  var createRequestListener = (context, options) => {
1385
1386
  return async (event, message) => {
1387
+ var _a;
1386
1388
  const messageChannel = new WorkerChannel(event.ports[0]);
1387
1389
  const request = parseWorkerRequest(message.payload);
1388
1390
  try {
@@ -1421,7 +1423,7 @@ var createRequestListener = (context, options) => {
1421
1423
 
1422
1424
  %s
1423
1425
 
1424
- This exception has been gracefully handled as a 500 response, however, it's strongly recommended to resolve this error, as it indicates a mistake in your code. If you wish to mock an error response, please see this guide: https://mswjs.io/docs/recipes/mocking-error-responses`, request.method, request.url, error2);
1426
+ This exception has been gracefully handled as a 500 response, however, it's strongly recommended to resolve this error, as it indicates a mistake in your code. If you wish to mock an error response, please see this guide: https://mswjs.io/docs/recipes/mocking-error-responses`, request.method, request.url, (_a = error2.stack) != null ? _a : error2);
1425
1427
  messageChannel.postMessage("MOCK_RESPONSE", {
1426
1428
  status: 500,
1427
1429
  statusText: "Request Handler Error",
@@ -1452,8 +1454,8 @@ function transformResponse(response2) {
1452
1454
  async function requestIntegrityCheck(context, serviceWorker) {
1453
1455
  context.workerChannel.send("INTEGRITY_CHECK_REQUEST");
1454
1456
  const { payload: actualChecksum } = await context.events.once("INTEGRITY_CHECK_RESPONSE");
1455
- if (actualChecksum !== "b3066ef78c2f9090b4ce87e874965995") {
1456
- throw new Error(`Currently active Service Worker (${actualChecksum}) is behind the latest published one (${"b3066ef78c2f9090b4ce87e874965995"}).`);
1457
+ if (actualChecksum !== "3d6b9f06410d179a7f7404d4bf4c3c70") {
1458
+ throw new Error(`Currently active Service Worker (${actualChecksum}) is behind the latest published one (${"3d6b9f06410d179a7f7404d4bf4c3c70"}).`);
1457
1459
  }
1458
1460
  return serviceWorker;
1459
1461
  }
@@ -1594,19 +1596,6 @@ var createStop = (context) => {
1594
1596
  };
1595
1597
  };
1596
1598
 
1597
- // src/utils/internal/requestHandlerUtils.ts
1598
- function use(currentHandlers, ...handlers) {
1599
- currentHandlers.unshift(...handlers);
1600
- }
1601
- function restoreHandlers(handlers) {
1602
- handlers.forEach((handler) => {
1603
- handler.markAsSkipped(false);
1604
- });
1605
- }
1606
- function resetHandlers(initialHandlers, ...nextHandlers) {
1607
- return nextHandlers.length > 0 ? [...nextHandlers] : [...initialHandlers];
1608
- }
1609
-
1610
1599
  // src/setupWorker/start/utils/prepareStartHandler.ts
1611
1600
  var DEFAULT_START_OPTIONS = {
1612
1601
  serviceWorker: {
@@ -1620,15 +1609,6 @@ var DEFAULT_START_OPTIONS = {
1620
1609
  return scriptURL === mockServiceWorkerUrl;
1621
1610
  }
1622
1611
  };
1623
- function resolveStartOptions(initialOptions) {
1624
- return mergeRight(DEFAULT_START_OPTIONS, initialOptions || {});
1625
- }
1626
- function prepareStartHandler(handler, context) {
1627
- return (initialOptions) => {
1628
- context.startOptions = resolveStartOptions(initialOptions);
1629
- return handler(context.startOptions, initialOptions || {});
1630
- };
1631
- }
1632
1612
 
1633
1613
  // src/setupWorker/start/createFallbackRequestListener.ts
1634
1614
  var import_interceptors4 = require("@mswjs/interceptors");
@@ -1734,6 +1714,10 @@ function createFallbackStop(context) {
1734
1714
  };
1735
1715
  }
1736
1716
 
1717
+ // src/SetupApi.ts
1718
+ var import_outvariant3 = require("outvariant");
1719
+ var import_strict_event_emitter = require("strict-event-emitter");
1720
+
1737
1721
  // src/utils/internal/pipeEvents.ts
1738
1722
  function pipeEvents(source, destination) {
1739
1723
  const rawEmit = source.emit;
@@ -1754,131 +1738,163 @@ function toReadonlyArray(source) {
1754
1738
  return clone;
1755
1739
  }
1756
1740
 
1757
- // src/setupWorker/setupWorker.ts
1758
- var listeners = [];
1759
- function setupWorker(...requestHandlers) {
1760
- requestHandlers.forEach((handler) => {
1761
- if (Array.isArray(handler))
1762
- throw new Error(devUtils.formatMessage('Failed to call "setupWorker" given an Array of request handlers (setupWorker([a, b])), expected to receive each handler individually: setupWorker(a, b).'));
1763
- });
1764
- if ((0, import_is_node_process3.isNodeProcess)()) {
1765
- throw new Error(devUtils.formatMessage("Failed to execute `setupWorker` in a non-browser environment. Consider using `setupServer` for Node.js environment instead."));
1766
- }
1767
- const emitter = new import_strict_event_emitter.StrictEventEmitter();
1768
- const publicEmitter = new import_strict_event_emitter.StrictEventEmitter();
1769
- pipeEvents(emitter, publicEmitter);
1770
- const context = {
1771
- isMockingEnabled: false,
1772
- startOptions: void 0,
1773
- worker: null,
1774
- registration: null,
1775
- requestHandlers: [...requestHandlers],
1776
- emitter,
1777
- workerChannel: {
1778
- on(eventType, callback) {
1779
- context.events.addListener(navigator.serviceWorker, "message", (event) => {
1780
- if (event.source !== context.worker) {
1781
- return;
1782
- }
1783
- const message = event.data;
1784
- if (!message) {
1785
- return;
1786
- }
1787
- if (message.type === eventType) {
1788
- callback(event, message);
1789
- }
1790
- });
1741
+ // src/SetupApi.ts
1742
+ var SetupApi = class {
1743
+ constructor(initialHandlers) {
1744
+ this.validateHandlers(initialHandlers);
1745
+ this.initialHandlers = toReadonlyArray(initialHandlers);
1746
+ this.currentHandlers = [...initialHandlers];
1747
+ this.emitter = new import_strict_event_emitter.StrictEventEmitter();
1748
+ this.publicEmitter = new import_strict_event_emitter.StrictEventEmitter();
1749
+ pipeEvents(this.emitter, this.publicEmitter);
1750
+ this.events = this.createLifeCycleEvents();
1751
+ }
1752
+ validateHandlers(handlers) {
1753
+ for (const handler of handlers) {
1754
+ (0, import_outvariant3.invariant)(!Array.isArray(handler), devUtils.formatMessage('Failed to construct "%s" given an Array of request handlers. Make sure you spread the request handlers when calling the respective setup function.'), this.constructor.name);
1755
+ }
1756
+ }
1757
+ dispose() {
1758
+ this.emitter.removeAllListeners();
1759
+ this.publicEmitter.removeAllListeners();
1760
+ }
1761
+ use(...runtimeHandlers) {
1762
+ this.currentHandlers.unshift(...runtimeHandlers);
1763
+ }
1764
+ restoreHandlers() {
1765
+ this.currentHandlers.forEach((handler) => {
1766
+ handler.markAsSkipped(false);
1767
+ });
1768
+ }
1769
+ resetHandlers(...nextHandlers) {
1770
+ this.currentHandlers = nextHandlers.length > 0 ? [...nextHandlers] : [...this.initialHandlers];
1771
+ }
1772
+ listHandlers() {
1773
+ return toReadonlyArray(this.currentHandlers);
1774
+ }
1775
+ createLifeCycleEvents() {
1776
+ return {
1777
+ on: (...args) => {
1778
+ return this.publicEmitter.on(...args);
1791
1779
  },
1792
- send(type) {
1793
- var _a;
1794
- (_a = context.worker) == null ? void 0 : _a.postMessage(type);
1795
- }
1796
- },
1797
- events: {
1798
- addListener(target, eventType, callback) {
1799
- target.addEventListener(eventType, callback);
1800
- listeners.push({ eventType, target, callback });
1801
- return () => {
1802
- target.removeEventListener(eventType, callback);
1803
- };
1780
+ removeListener: (...args) => {
1781
+ return this.publicEmitter.removeListener(...args);
1804
1782
  },
1805
- removeAllListeners() {
1806
- for (const { target, eventType, callback } of listeners) {
1807
- target.removeEventListener(eventType, callback);
1783
+ removeAllListeners: (...args) => {
1784
+ return this.publicEmitter.removeAllListeners(...args);
1785
+ }
1786
+ };
1787
+ }
1788
+ };
1789
+
1790
+ // src/setupWorker/setupWorker.ts
1791
+ var SetupWorkerApi = class extends SetupApi {
1792
+ constructor(handlers) {
1793
+ super(handlers);
1794
+ this.startHandler = null;
1795
+ this.stopHandler = null;
1796
+ (0, import_outvariant4.invariant)(!(0, import_is_node_process3.isNodeProcess)(), devUtils.formatMessage("Failed to execute `setupWorker` in a non-browser environment. Consider using `setupServer` for Node.js environment instead."));
1797
+ this.listeners = [];
1798
+ this.context = this.createWorkerContext();
1799
+ }
1800
+ createWorkerContext() {
1801
+ const context = {
1802
+ isMockingEnabled: false,
1803
+ startOptions: null,
1804
+ worker: null,
1805
+ registration: null,
1806
+ requestHandlers: this.currentHandlers,
1807
+ emitter: this.emitter,
1808
+ workerChannel: {
1809
+ on: (eventType, callback) => {
1810
+ this.context.events.addListener(navigator.serviceWorker, "message", (event) => {
1811
+ if (event.source !== this.context.worker) {
1812
+ return;
1813
+ }
1814
+ const message = event.data;
1815
+ if (!message) {
1816
+ return;
1817
+ }
1818
+ if (message.type === eventType) {
1819
+ callback(event, message);
1820
+ }
1821
+ });
1822
+ },
1823
+ send: (type) => {
1824
+ var _a;
1825
+ (_a = this.context.worker) == null ? void 0 : _a.postMessage(type);
1808
1826
  }
1809
- listeners = [];
1810
1827
  },
1811
- once(eventType) {
1812
- const bindings = [];
1813
- return new Promise((resolve, reject) => {
1814
- const handleIncomingMessage = (event) => {
1815
- try {
1816
- const message = event.data;
1817
- if (message.type === eventType) {
1818
- resolve(message);
1819
- }
1820
- } catch (error2) {
1821
- reject(error2);
1822
- }
1828
+ events: {
1829
+ addListener: (target, eventType, callback) => {
1830
+ target.addEventListener(eventType, callback);
1831
+ this.listeners.push({ eventType, target, callback });
1832
+ return () => {
1833
+ target.removeEventListener(eventType, callback);
1823
1834
  };
1824
- bindings.push(context.events.addListener(navigator.serviceWorker, "message", handleIncomingMessage), context.events.addListener(navigator.serviceWorker, "messageerror", reject));
1825
- }).finally(() => {
1826
- bindings.forEach((unbind) => unbind());
1827
- });
1828
- }
1829
- },
1830
- useFallbackMode: !("serviceWorker" in navigator) || location.protocol === "file:"
1831
- };
1832
- const startHandler = context.useFallbackMode ? createFallbackStart(context) : createStartHandler(context);
1833
- const stopHandler = context.useFallbackMode ? createFallbackStop(context) : createStop(context);
1834
- return {
1835
- start: prepareStartHandler(startHandler, context),
1836
- stop() {
1837
- context.events.removeAllListeners();
1838
- context.emitter.removeAllListeners();
1839
- publicEmitter.removeAllListeners();
1840
- stopHandler();
1841
- },
1842
- use(...handlers) {
1843
- use(context.requestHandlers, ...handlers);
1844
- },
1845
- restoreHandlers() {
1846
- restoreHandlers(context.requestHandlers);
1847
- },
1848
- resetHandlers(...nextHandlers) {
1849
- context.requestHandlers = resetHandlers(requestHandlers, ...nextHandlers);
1850
- },
1851
- listHandlers() {
1852
- return toReadonlyArray(context.requestHandlers);
1853
- },
1854
- printHandlers() {
1855
- const handlers = this.listHandlers();
1856
- handlers.forEach((handler) => {
1857
- const { header, callFrame } = handler.info;
1858
- const pragma = handler.info.hasOwnProperty("operationType") ? "[graphql]" : "[rest]";
1859
- console.groupCollapsed(`${pragma} ${header}`);
1860
- if (callFrame) {
1861
- console.log(`Declaration: ${callFrame}`);
1862
- }
1863
- console.log("Handler:", handler);
1864
- if (handler instanceof RestHandler) {
1865
- console.log("Match:", `https://mswjs.io/repl?path=${handler.info.path}`);
1835
+ },
1836
+ removeAllListeners: () => {
1837
+ for (const { target, eventType, callback } of this.listeners) {
1838
+ target.removeEventListener(eventType, callback);
1839
+ }
1840
+ this.listeners = [];
1841
+ },
1842
+ once: (eventType) => {
1843
+ const bindings = [];
1844
+ return new Promise((resolve, reject) => {
1845
+ const handleIncomingMessage = (event) => {
1846
+ try {
1847
+ const message = event.data;
1848
+ if (message.type === eventType) {
1849
+ resolve(message);
1850
+ }
1851
+ } catch (error2) {
1852
+ reject(error2);
1853
+ }
1854
+ };
1855
+ bindings.push(this.context.events.addListener(navigator.serviceWorker, "message", handleIncomingMessage), this.context.events.addListener(navigator.serviceWorker, "messageerror", reject));
1856
+ }).finally(() => {
1857
+ bindings.forEach((unbind) => unbind());
1858
+ });
1866
1859
  }
1867
- console.groupEnd();
1868
- });
1869
- },
1870
- events: {
1871
- on(...args) {
1872
- return publicEmitter.on(...args);
1873
- },
1874
- removeListener(...args) {
1875
- return publicEmitter.removeListener(...args);
1876
1860
  },
1877
- removeAllListeners(...args) {
1878
- return publicEmitter.removeAllListeners(...args);
1861
+ useFallbackMode: !("serviceWorker" in navigator) || location.protocol === "file:"
1862
+ };
1863
+ Object.defineProperties(context, {
1864
+ requestHandlers: {
1865
+ get: () => this.currentHandlers
1879
1866
  }
1880
- }
1881
- };
1867
+ });
1868
+ this.startHandler = context.useFallbackMode ? createFallbackStart(context) : createStartHandler(context);
1869
+ this.stopHandler = context.useFallbackMode ? createFallbackStop(context) : createStop(context);
1870
+ return context;
1871
+ }
1872
+ async start(options = {}) {
1873
+ this.context.startOptions = mergeRight(DEFAULT_START_OPTIONS, options);
1874
+ return await this.startHandler(this.context.startOptions, options);
1875
+ }
1876
+ printHandlers() {
1877
+ const handlers = this.listHandlers();
1878
+ handlers.forEach((handler) => {
1879
+ const { header, callFrame } = handler.info;
1880
+ const pragma = handler.info.hasOwnProperty("operationType") ? "[graphql]" : "[rest]";
1881
+ console.groupCollapsed(`${pragma} ${header}`);
1882
+ if (callFrame) {
1883
+ console.log(`Declaration: ${callFrame}`);
1884
+ }
1885
+ console.log("Handler:", handler);
1886
+ console.groupEnd();
1887
+ });
1888
+ }
1889
+ stop() {
1890
+ super.dispose();
1891
+ this.context.events.removeAllListeners();
1892
+ this.context.emitter.removeAllListeners();
1893
+ this.stopHandler();
1894
+ }
1895
+ };
1896
+ function setupWorker(...handlers) {
1897
+ return new SetupWorkerApi(handlers);
1882
1898
  }
1883
1899
 
1884
1900
  // src/rest.ts
@@ -1931,6 +1947,7 @@ var graphql = __spreadProps(__spreadValues({}, standardGraphQLHandlers), {
1931
1947
  RESTMethods,
1932
1948
  RequestHandler,
1933
1949
  RestHandler,
1950
+ SetupApi,
1934
1951
  cleanUrl,
1935
1952
  compose,
1936
1953
  context,