@mswjs/interceptors 0.34.3 → 0.35.1

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 (72) hide show
  1. package/lib/browser/{chunk-FXSPMSSQ.js → chunk-2CAGU4FT.js} +10 -2
  2. package/lib/browser/chunk-2CAGU4FT.js.map +1 -0
  3. package/lib/browser/{chunk-EJYZ4HR3.js → chunk-FYSUKT3F.js} +4 -4
  4. package/lib/browser/{chunk-W7UG7MBM.mjs → chunk-G5SOR3ND.mjs} +92 -9
  5. package/lib/browser/chunk-G5SOR3ND.mjs.map +1 -0
  6. package/lib/browser/{chunk-KOFJYPUE.mjs → chunk-PRBA3ES4.mjs} +3 -3
  7. package/lib/browser/{chunk-TPZUQHHY.js → chunk-T5Q47QLJ.js} +97 -14
  8. package/lib/browser/chunk-T5Q47QLJ.js.map +1 -0
  9. package/lib/browser/{chunk-73X2CAEH.mjs → chunk-THPGBWJQ.mjs} +2 -2
  10. package/lib/browser/{chunk-GGUENBDN.mjs → chunk-XVPRNJO7.mjs} +9 -1
  11. package/lib/browser/chunk-XVPRNJO7.mjs.map +1 -0
  12. package/lib/browser/{chunk-NBHFK2DJ.js → chunk-YU6EJD6U.js} +9 -9
  13. package/lib/browser/index.js +2 -2
  14. package/lib/browser/index.mjs +1 -1
  15. package/lib/browser/interceptors/XMLHttpRequest/index.js +4 -4
  16. package/lib/browser/interceptors/XMLHttpRequest/index.mjs +3 -3
  17. package/lib/browser/interceptors/fetch/index.js +4 -4
  18. package/lib/browser/interceptors/fetch/index.mjs +3 -3
  19. package/lib/browser/presets/browser.js +6 -6
  20. package/lib/browser/presets/browser.mjs +4 -4
  21. package/lib/node/RemoteHttpInterceptor.js +11 -11
  22. package/lib/node/RemoteHttpInterceptor.mjs +5 -5
  23. package/lib/node/{chunk-HGQLG7KE.mjs → chunk-3NMVZQIH.mjs} +2 -2
  24. package/lib/node/{chunk-KA2KMHFU.mjs → chunk-77GKBGPN.mjs} +3 -3
  25. package/lib/node/{chunk-YGM3BCJU.js → chunk-AABH3XLQ.js} +10 -2
  26. package/lib/node/chunk-AABH3XLQ.js.map +1 -0
  27. package/lib/node/{chunk-W4AQXISM.js → chunk-BCUXF7NZ.js} +96 -13
  28. package/lib/node/chunk-BCUXF7NZ.js.map +1 -0
  29. package/lib/node/{chunk-WTJL7BRV.js → chunk-BMRE2LOX.js} +14 -14
  30. package/lib/node/{chunk-WGBCEHTV.mjs → chunk-C7JQJSAI.mjs} +3 -3
  31. package/lib/node/{chunk-6L3UERDR.js → chunk-FFSJ6QLA.js} +9 -9
  32. package/lib/node/{chunk-BUCULLYM.mjs → chunk-FQQAJBI2.mjs} +9 -1
  33. package/lib/node/{chunk-BUCULLYM.mjs.map → chunk-FQQAJBI2.mjs.map} +1 -1
  34. package/lib/node/{chunk-XSXCGXEY.mjs → chunk-M4WQE4TR.mjs} +2 -2
  35. package/lib/node/{chunk-42632LKH.js → chunk-PGTBKPWN.js} +3 -3
  36. package/lib/node/{chunk-GILG336Y.mjs → chunk-T5YM7SUV.mjs} +91 -8
  37. package/lib/node/chunk-T5YM7SUV.mjs.map +1 -0
  38. package/lib/node/{chunk-TQD7SQGP.js → chunk-VCUEA4PL.js} +4 -4
  39. package/lib/node/index.js +3 -3
  40. package/lib/node/index.mjs +2 -2
  41. package/lib/node/interceptors/ClientRequest/index.js +4 -4
  42. package/lib/node/interceptors/ClientRequest/index.mjs +3 -3
  43. package/lib/node/interceptors/XMLHttpRequest/index.js +4 -4
  44. package/lib/node/interceptors/XMLHttpRequest/index.mjs +3 -3
  45. package/lib/node/interceptors/fetch/index.js +4 -4
  46. package/lib/node/interceptors/fetch/index.mjs +3 -3
  47. package/lib/node/presets/node.js +8 -8
  48. package/lib/node/presets/node.mjs +5 -5
  49. package/package.json +1 -1
  50. package/src/interceptors/fetch/index.ts +30 -6
  51. package/src/interceptors/fetch/utils/createNetworkError.ts +5 -0
  52. package/src/interceptors/fetch/utils/followRedirect.ts +108 -0
  53. package/src/utils/responseUtils.ts +4 -0
  54. package/lib/browser/chunk-FXSPMSSQ.js.map +0 -1
  55. package/lib/browser/chunk-GGUENBDN.mjs.map +0 -1
  56. package/lib/browser/chunk-TPZUQHHY.js.map +0 -1
  57. package/lib/browser/chunk-W7UG7MBM.mjs.map +0 -1
  58. package/lib/node/chunk-GILG336Y.mjs.map +0 -1
  59. package/lib/node/chunk-W4AQXISM.js.map +0 -1
  60. package/lib/node/chunk-YGM3BCJU.js.map +0 -1
  61. /package/lib/browser/{chunk-EJYZ4HR3.js.map → chunk-FYSUKT3F.js.map} +0 -0
  62. /package/lib/browser/{chunk-KOFJYPUE.mjs.map → chunk-PRBA3ES4.mjs.map} +0 -0
  63. /package/lib/browser/{chunk-73X2CAEH.mjs.map → chunk-THPGBWJQ.mjs.map} +0 -0
  64. /package/lib/browser/{chunk-NBHFK2DJ.js.map → chunk-YU6EJD6U.js.map} +0 -0
  65. /package/lib/node/{chunk-HGQLG7KE.mjs.map → chunk-3NMVZQIH.mjs.map} +0 -0
  66. /package/lib/node/{chunk-KA2KMHFU.mjs.map → chunk-77GKBGPN.mjs.map} +0 -0
  67. /package/lib/node/{chunk-WTJL7BRV.js.map → chunk-BMRE2LOX.js.map} +0 -0
  68. /package/lib/node/{chunk-WGBCEHTV.mjs.map → chunk-C7JQJSAI.mjs.map} +0 -0
  69. /package/lib/node/{chunk-6L3UERDR.js.map → chunk-FFSJ6QLA.js.map} +0 -0
  70. /package/lib/node/{chunk-XSXCGXEY.mjs.map → chunk-M4WQE4TR.mjs.map} +0 -0
  71. /package/lib/node/{chunk-42632LKH.js.map → chunk-PGTBKPWN.js.map} +0 -0
  72. /package/lib/node/{chunk-TQD7SQGP.js.map → chunk-VCUEA4PL.js.map} +0 -0
@@ -9,13 +9,13 @@ var _chunkIDEEMJ3Fjs = require('./chunk-IDEEMJ3F.js');
9
9
 
10
10
 
11
11
 
12
- var _chunkTQD7SQGPjs = require('./chunk-TQD7SQGP.js');
12
+ var _chunkVCUEA4PLjs = require('./chunk-VCUEA4PL.js');
13
13
 
14
14
 
15
15
 
16
16
 
17
17
 
18
- var _chunkYGM3BCJUjs = require('./chunk-YGM3BCJU.js');
18
+ var _chunkAABH3XLQjs = require('./chunk-AABH3XLQ.js');
19
19
 
20
20
  // src/interceptors/XMLHttpRequest/index.ts
21
21
  var _outvariant = require('outvariant');
@@ -203,7 +203,7 @@ function parseJson(data) {
203
203
 
204
204
  // src/interceptors/XMLHttpRequest/utils/createResponse.ts
205
205
  function createResponse(request, body) {
206
- const responseBodyOrNull = _chunkYGM3BCJUjs.isResponseWithoutBody.call(void 0, request.status) ? null : body;
206
+ const responseBodyOrNull = _chunkAABH3XLQjs.isResponseWithoutBody.call(void 0, request.status) ? null : body;
207
207
  return new Response(responseBodyOrNull, {
208
208
  status: request.status,
209
209
  statusText: request.statusText,
@@ -249,7 +249,7 @@ var XMLHttpRequestController = class {
249
249
  this[kIsRequestHandled] = false;
250
250
  this.events = /* @__PURE__ */ new Map();
251
251
  this.uploadEvents = /* @__PURE__ */ new Map();
252
- this.requestId = _chunkYGM3BCJUjs.createRequestId.call(void 0, );
252
+ this.requestId = _chunkAABH3XLQjs.createRequestId.call(void 0, );
253
253
  this.requestHeaders = new Headers();
254
254
  this.responseBuffer = new Uint8Array();
255
255
  this.request = createProxy(initialRequest, {
@@ -331,7 +331,7 @@ var XMLHttpRequestController = class {
331
331
  );
332
332
  if (IS_NODE) {
333
333
  this.request.setRequestHeader(
334
- _chunkYGM3BCJUjs.INTERNAL_REQUEST_ID_HEADER_NAME,
334
+ _chunkAABH3XLQjs.INTERNAL_REQUEST_ID_HEADER_NAME,
335
335
  this.requestId
336
336
  );
337
337
  }
@@ -737,13 +737,13 @@ function createXMLHttpRequestProxy({
737
737
  logger
738
738
  );
739
739
  xhrRequestController.onRequest = async function({ request, requestId }) {
740
- const controller = new (0, _chunkTQD7SQGPjs.RequestController)(request);
740
+ const controller = new (0, _chunkVCUEA4PLjs.RequestController)(request);
741
741
  this.logger.info("awaiting mocked response...");
742
742
  this.logger.info(
743
743
  'emitting the "request" event for %s listener(s)...',
744
744
  emitter.listenerCount("request")
745
745
  );
746
- const isRequestHandled = await _chunkTQD7SQGPjs.handleRequest.call(void 0, {
746
+ const isRequestHandled = await _chunkVCUEA4PLjs.handleRequest.call(void 0, {
747
747
  request,
748
748
  requestId,
749
749
  controller,
@@ -791,7 +791,7 @@ function createXMLHttpRequestProxy({
791
791
  }
792
792
 
793
793
  // src/interceptors/XMLHttpRequest/index.ts
794
- var _XMLHttpRequestInterceptor = class extends _chunkYGM3BCJUjs.Interceptor {
794
+ var _XMLHttpRequestInterceptor = class extends _chunkAABH3XLQjs.Interceptor {
795
795
  constructor() {
796
796
  super(_XMLHttpRequestInterceptor.interceptorSymbol);
797
797
  }
@@ -837,4 +837,4 @@ XMLHttpRequestInterceptor.interceptorSymbol = Symbol("xhr");
837
837
 
838
838
 
839
839
  exports.XMLHttpRequestInterceptor = XMLHttpRequestInterceptor;
840
- //# sourceMappingURL=chunk-6L3UERDR.js.map
840
+ //# sourceMappingURL=chunk-FFSJ6QLA.js.map
@@ -176,6 +176,13 @@ var RESPONSE_STATUS_CODES_WITHOUT_BODY = /* @__PURE__ */ new Set([
176
176
  205,
177
177
  304
178
178
  ]);
179
+ var RESPONSE_STATUS_CODES_WITH_REDIRECT = /* @__PURE__ */ new Set([
180
+ 301,
181
+ 302,
182
+ 303,
183
+ 307,
184
+ 308
185
+ ]);
179
186
  function isResponseWithoutBody(status) {
180
187
  return RESPONSE_STATUS_CODES_WITHOUT_BODY.has(status);
181
188
  }
@@ -210,8 +217,9 @@ export {
210
217
  createRequestId,
211
218
  isPropertyAccessible,
212
219
  RESPONSE_STATUS_CODES_WITHOUT_BODY,
220
+ RESPONSE_STATUS_CODES_WITH_REDIRECT,
213
221
  isResponseWithoutBody,
214
222
  createServerErrorResponse,
215
223
  isResponseError
216
224
  };
217
- //# sourceMappingURL=chunk-BUCULLYM.mjs.map
225
+ //# sourceMappingURL=chunk-FQQAJBI2.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Interceptor.ts","../../src/createRequestId.ts","../../src/utils/isPropertyAccessible.ts","../../src/utils/responseUtils.ts"],"sourcesContent":["import { Logger } from '@open-draft/logger'\nimport { Emitter, Listener } from 'strict-event-emitter'\n\nexport type InterceptorEventMap = Record<string, any>\nexport type InterceptorSubscription = () => void\n\n/**\n * Request header name to detect when a single request\n * is being handled by nested interceptors (XHR -> ClientRequest).\n * Obscure by design to prevent collisions with user-defined headers.\n * Ideally, come up with the Interceptor-level mechanism for this.\n * @see https://github.com/mswjs/interceptors/issues/378\n */\nexport const INTERNAL_REQUEST_ID_HEADER_NAME =\n 'x-interceptors-internal-request-id'\n\nexport function getGlobalSymbol<V>(symbol: Symbol): V | undefined {\n return (\n // @ts-ignore https://github.com/Microsoft/TypeScript/issues/24587\n globalThis[symbol] || undefined\n )\n}\n\nfunction setGlobalSymbol(symbol: Symbol, value: any): void {\n // @ts-ignore\n globalThis[symbol] = value\n}\n\nexport function deleteGlobalSymbol(symbol: Symbol): void {\n // @ts-ignore\n delete globalThis[symbol]\n}\n\nexport enum InterceptorReadyState {\n INACTIVE = 'INACTIVE',\n APPLYING = 'APPLYING',\n APPLIED = 'APPLIED',\n DISPOSING = 'DISPOSING',\n DISPOSED = 'DISPOSED',\n}\n\nexport type ExtractEventNames<Events extends Record<string, any>> =\n Events extends Record<infer EventName, any> ? EventName : never\n\nexport class Interceptor<Events extends InterceptorEventMap> {\n protected emitter: Emitter<Events>\n protected subscriptions: Array<InterceptorSubscription>\n protected logger: Logger\n\n public readyState: InterceptorReadyState\n\n constructor(private readonly symbol: symbol) {\n this.readyState = InterceptorReadyState.INACTIVE\n\n this.emitter = new Emitter()\n this.subscriptions = []\n this.logger = new Logger(symbol.description!)\n\n // Do not limit the maximum number of listeners\n // so not to limit the maximum amount of parallel events emitted.\n this.emitter.setMaxListeners(0)\n\n this.logger.info('constructing the interceptor...')\n }\n\n /**\n * Determine if this interceptor can be applied\n * in the current environment.\n */\n protected checkEnvironment(): boolean {\n return true\n }\n\n /**\n * Apply this interceptor to the current process.\n * Returns an already running interceptor instance if it's present.\n */\n public apply(): void {\n const logger = this.logger.extend('apply')\n logger.info('applying the interceptor...')\n\n if (this.readyState === InterceptorReadyState.APPLIED) {\n logger.info('intercepted already applied!')\n return\n }\n\n const shouldApply = this.checkEnvironment()\n\n if (!shouldApply) {\n logger.info('the interceptor cannot be applied in this environment!')\n return\n }\n\n this.readyState = InterceptorReadyState.APPLYING\n\n // Whenever applying a new interceptor, check if it hasn't been applied already.\n // This enables to apply the same interceptor multiple times, for example from a different\n // interceptor, only proxying events but keeping the stubs in a single place.\n const runningInstance = this.getInstance()\n\n if (runningInstance) {\n logger.info('found a running instance, reusing...')\n\n // Proxy any listeners you set on this instance to the running instance.\n this.on = (event, listener) => {\n logger.info('proxying the \"%s\" listener', event)\n\n // Add listeners to the running instance so they appear\n // at the top of the event listeners list and are executed first.\n runningInstance.emitter.addListener(event, listener)\n\n // Ensure that once this interceptor instance is disposed,\n // it removes all listeners it has appended to the running interceptor instance.\n this.subscriptions.push(() => {\n runningInstance.emitter.removeListener(event, listener)\n logger.info('removed proxied \"%s\" listener!', event)\n })\n\n return this\n }\n\n this.readyState = InterceptorReadyState.APPLIED\n\n return\n }\n\n logger.info('no running instance found, setting up a new instance...')\n\n // Setup the interceptor.\n this.setup()\n\n // Store the newly applied interceptor instance globally.\n this.setInstance()\n\n this.readyState = InterceptorReadyState.APPLIED\n }\n\n /**\n * Setup the module augments and stubs necessary for this interceptor.\n * This method is not run if there's a running interceptor instance\n * to prevent instantiating an interceptor multiple times.\n */\n protected setup(): void {}\n\n /**\n * Listen to the interceptor's public events.\n */\n public on<EventName extends ExtractEventNames<Events>>(\n event: EventName,\n listener: Listener<Events[EventName]>\n ): this {\n const logger = this.logger.extend('on')\n\n if (\n this.readyState === InterceptorReadyState.DISPOSING ||\n this.readyState === InterceptorReadyState.DISPOSED\n ) {\n logger.info('cannot listen to events, already disposed!')\n return this\n }\n\n logger.info('adding \"%s\" event listener:', event, listener)\n\n this.emitter.on(event, listener)\n return this\n }\n\n public once<EventName extends ExtractEventNames<Events>>(\n event: EventName,\n listener: Listener<Events[EventName]>\n ): this {\n this.emitter.once(event, listener)\n return this\n }\n\n public off<EventName extends ExtractEventNames<Events>>(\n event: EventName,\n listener: Listener<Events[EventName]>\n ): this {\n this.emitter.off(event, listener)\n return this\n }\n\n public removeAllListeners<EventName extends ExtractEventNames<Events>>(\n event?: EventName\n ): this {\n this.emitter.removeAllListeners(event)\n return this\n }\n\n /**\n * Disposes of any side-effects this interceptor has introduced.\n */\n public dispose(): void {\n const logger = this.logger.extend('dispose')\n\n if (this.readyState === InterceptorReadyState.DISPOSED) {\n logger.info('cannot dispose, already disposed!')\n return\n }\n\n logger.info('disposing the interceptor...')\n this.readyState = InterceptorReadyState.DISPOSING\n\n if (!this.getInstance()) {\n logger.info('no interceptors running, skipping dispose...')\n return\n }\n\n // Delete the global symbol as soon as possible,\n // indicating that the interceptor is no longer running.\n this.clearInstance()\n\n logger.info('global symbol deleted:', getGlobalSymbol(this.symbol))\n\n if (this.subscriptions.length > 0) {\n logger.info('disposing of %d subscriptions...', this.subscriptions.length)\n\n for (const dispose of this.subscriptions) {\n dispose()\n }\n\n this.subscriptions = []\n\n logger.info('disposed of all subscriptions!', this.subscriptions.length)\n }\n\n this.emitter.removeAllListeners()\n logger.info('destroyed the listener!')\n\n this.readyState = InterceptorReadyState.DISPOSED\n }\n\n private getInstance(): this | undefined {\n const instance = getGlobalSymbol<this>(this.symbol)\n this.logger.info('retrieved global instance:', instance?.constructor?.name)\n return instance\n }\n\n private setInstance(): void {\n setGlobalSymbol(this.symbol, this)\n this.logger.info('set global instance!', this.symbol.description)\n }\n\n private clearInstance(): void {\n deleteGlobalSymbol(this.symbol)\n this.logger.info('cleared global instance!', this.symbol.description)\n }\n}\n","/**\n * Generate a random ID string to represent a request.\n * @example\n * createRequestId()\n * // \"f774b6c9c600f\"\n */\nexport function createRequestId(): string {\n return Math.random().toString(16).slice(2)\n}\n","/**\n * A function that validates if property access is possible on an object\n * without throwing. It returns `true` if the property access is possible\n * and `false` otherwise.\n *\n * Environments like miniflare will throw on property access on certain objects\n * like Request and Response, for unimplemented properties.\n */\nexport function isPropertyAccessible<Obj extends Record<string, any>>(\n obj: Obj,\n key: keyof Obj\n) {\n try {\n obj[key]\n return true\n } catch {\n return false\n }\n}\n","import { isPropertyAccessible } from './isPropertyAccessible'\n\n/**\n * Response status codes for responses that cannot have body.\n * @see https://fetch.spec.whatwg.org/#statuses\n */\nexport const RESPONSE_STATUS_CODES_WITHOUT_BODY = new Set([\n 101, 103, 204, 205, 304,\n])\n\n/**\n * Returns a boolean indicating whether the given response status\n * code represents a response that cannot have a body.\n */\nexport function isResponseWithoutBody(status: number): boolean {\n return RESPONSE_STATUS_CODES_WITHOUT_BODY.has(status)\n}\n\n/**\n * Creates a generic 500 Unhandled Exception response.\n */\nexport function createServerErrorResponse(body: unknown): Response {\n return new Response(\n JSON.stringify(\n body instanceof Error\n ? {\n name: body.name,\n message: body.message,\n stack: body.stack,\n }\n : body\n ),\n {\n status: 500,\n statusText: 'Unhandled Exception',\n headers: {\n 'Content-Type': 'application/json',\n },\n }\n )\n}\n\nexport type ResponseError = Response & { type: 'error' }\n\n/**\n * Check if the given response is a `Response.error()`.\n *\n * @note Some environments, like Miniflare (Cloudflare) do not\n * implement the \"Response.type\" property and throw on its access.\n * Safely check if we can access \"type\" on \"Response\" before continuing.\n * @see https://github.com/mswjs/msw/issues/1834\n */\nexport function isResponseError(response: Response): response is ResponseError {\n return isPropertyAccessible(response, 'type') && response.type === 'error'\n}\n"],"mappings":"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","names":["InterceptorReadyState"]}
1
+ {"version":3,"sources":["../../src/Interceptor.ts","../../src/createRequestId.ts","../../src/utils/isPropertyAccessible.ts","../../src/utils/responseUtils.ts"],"sourcesContent":["import { Logger } from '@open-draft/logger'\nimport { Emitter, Listener } from 'strict-event-emitter'\n\nexport type InterceptorEventMap = Record<string, any>\nexport type InterceptorSubscription = () => void\n\n/**\n * Request header name to detect when a single request\n * is being handled by nested interceptors (XHR -> ClientRequest).\n * Obscure by design to prevent collisions with user-defined headers.\n * Ideally, come up with the Interceptor-level mechanism for this.\n * @see https://github.com/mswjs/interceptors/issues/378\n */\nexport const INTERNAL_REQUEST_ID_HEADER_NAME =\n 'x-interceptors-internal-request-id'\n\nexport function getGlobalSymbol<V>(symbol: Symbol): V | undefined {\n return (\n // @ts-ignore https://github.com/Microsoft/TypeScript/issues/24587\n globalThis[symbol] || undefined\n )\n}\n\nfunction setGlobalSymbol(symbol: Symbol, value: any): void {\n // @ts-ignore\n globalThis[symbol] = value\n}\n\nexport function deleteGlobalSymbol(symbol: Symbol): void {\n // @ts-ignore\n delete globalThis[symbol]\n}\n\nexport enum InterceptorReadyState {\n INACTIVE = 'INACTIVE',\n APPLYING = 'APPLYING',\n APPLIED = 'APPLIED',\n DISPOSING = 'DISPOSING',\n DISPOSED = 'DISPOSED',\n}\n\nexport type ExtractEventNames<Events extends Record<string, any>> =\n Events extends Record<infer EventName, any> ? EventName : never\n\nexport class Interceptor<Events extends InterceptorEventMap> {\n protected emitter: Emitter<Events>\n protected subscriptions: Array<InterceptorSubscription>\n protected logger: Logger\n\n public readyState: InterceptorReadyState\n\n constructor(private readonly symbol: symbol) {\n this.readyState = InterceptorReadyState.INACTIVE\n\n this.emitter = new Emitter()\n this.subscriptions = []\n this.logger = new Logger(symbol.description!)\n\n // Do not limit the maximum number of listeners\n // so not to limit the maximum amount of parallel events emitted.\n this.emitter.setMaxListeners(0)\n\n this.logger.info('constructing the interceptor...')\n }\n\n /**\n * Determine if this interceptor can be applied\n * in the current environment.\n */\n protected checkEnvironment(): boolean {\n return true\n }\n\n /**\n * Apply this interceptor to the current process.\n * Returns an already running interceptor instance if it's present.\n */\n public apply(): void {\n const logger = this.logger.extend('apply')\n logger.info('applying the interceptor...')\n\n if (this.readyState === InterceptorReadyState.APPLIED) {\n logger.info('intercepted already applied!')\n return\n }\n\n const shouldApply = this.checkEnvironment()\n\n if (!shouldApply) {\n logger.info('the interceptor cannot be applied in this environment!')\n return\n }\n\n this.readyState = InterceptorReadyState.APPLYING\n\n // Whenever applying a new interceptor, check if it hasn't been applied already.\n // This enables to apply the same interceptor multiple times, for example from a different\n // interceptor, only proxying events but keeping the stubs in a single place.\n const runningInstance = this.getInstance()\n\n if (runningInstance) {\n logger.info('found a running instance, reusing...')\n\n // Proxy any listeners you set on this instance to the running instance.\n this.on = (event, listener) => {\n logger.info('proxying the \"%s\" listener', event)\n\n // Add listeners to the running instance so they appear\n // at the top of the event listeners list and are executed first.\n runningInstance.emitter.addListener(event, listener)\n\n // Ensure that once this interceptor instance is disposed,\n // it removes all listeners it has appended to the running interceptor instance.\n this.subscriptions.push(() => {\n runningInstance.emitter.removeListener(event, listener)\n logger.info('removed proxied \"%s\" listener!', event)\n })\n\n return this\n }\n\n this.readyState = InterceptorReadyState.APPLIED\n\n return\n }\n\n logger.info('no running instance found, setting up a new instance...')\n\n // Setup the interceptor.\n this.setup()\n\n // Store the newly applied interceptor instance globally.\n this.setInstance()\n\n this.readyState = InterceptorReadyState.APPLIED\n }\n\n /**\n * Setup the module augments and stubs necessary for this interceptor.\n * This method is not run if there's a running interceptor instance\n * to prevent instantiating an interceptor multiple times.\n */\n protected setup(): void {}\n\n /**\n * Listen to the interceptor's public events.\n */\n public on<EventName extends ExtractEventNames<Events>>(\n event: EventName,\n listener: Listener<Events[EventName]>\n ): this {\n const logger = this.logger.extend('on')\n\n if (\n this.readyState === InterceptorReadyState.DISPOSING ||\n this.readyState === InterceptorReadyState.DISPOSED\n ) {\n logger.info('cannot listen to events, already disposed!')\n return this\n }\n\n logger.info('adding \"%s\" event listener:', event, listener)\n\n this.emitter.on(event, listener)\n return this\n }\n\n public once<EventName extends ExtractEventNames<Events>>(\n event: EventName,\n listener: Listener<Events[EventName]>\n ): this {\n this.emitter.once(event, listener)\n return this\n }\n\n public off<EventName extends ExtractEventNames<Events>>(\n event: EventName,\n listener: Listener<Events[EventName]>\n ): this {\n this.emitter.off(event, listener)\n return this\n }\n\n public removeAllListeners<EventName extends ExtractEventNames<Events>>(\n event?: EventName\n ): this {\n this.emitter.removeAllListeners(event)\n return this\n }\n\n /**\n * Disposes of any side-effects this interceptor has introduced.\n */\n public dispose(): void {\n const logger = this.logger.extend('dispose')\n\n if (this.readyState === InterceptorReadyState.DISPOSED) {\n logger.info('cannot dispose, already disposed!')\n return\n }\n\n logger.info('disposing the interceptor...')\n this.readyState = InterceptorReadyState.DISPOSING\n\n if (!this.getInstance()) {\n logger.info('no interceptors running, skipping dispose...')\n return\n }\n\n // Delete the global symbol as soon as possible,\n // indicating that the interceptor is no longer running.\n this.clearInstance()\n\n logger.info('global symbol deleted:', getGlobalSymbol(this.symbol))\n\n if (this.subscriptions.length > 0) {\n logger.info('disposing of %d subscriptions...', this.subscriptions.length)\n\n for (const dispose of this.subscriptions) {\n dispose()\n }\n\n this.subscriptions = []\n\n logger.info('disposed of all subscriptions!', this.subscriptions.length)\n }\n\n this.emitter.removeAllListeners()\n logger.info('destroyed the listener!')\n\n this.readyState = InterceptorReadyState.DISPOSED\n }\n\n private getInstance(): this | undefined {\n const instance = getGlobalSymbol<this>(this.symbol)\n this.logger.info('retrieved global instance:', instance?.constructor?.name)\n return instance\n }\n\n private setInstance(): void {\n setGlobalSymbol(this.symbol, this)\n this.logger.info('set global instance!', this.symbol.description)\n }\n\n private clearInstance(): void {\n deleteGlobalSymbol(this.symbol)\n this.logger.info('cleared global instance!', this.symbol.description)\n }\n}\n","/**\n * Generate a random ID string to represent a request.\n * @example\n * createRequestId()\n * // \"f774b6c9c600f\"\n */\nexport function createRequestId(): string {\n return Math.random().toString(16).slice(2)\n}\n","/**\n * A function that validates if property access is possible on an object\n * without throwing. It returns `true` if the property access is possible\n * and `false` otherwise.\n *\n * Environments like miniflare will throw on property access on certain objects\n * like Request and Response, for unimplemented properties.\n */\nexport function isPropertyAccessible<Obj extends Record<string, any>>(\n obj: Obj,\n key: keyof Obj\n) {\n try {\n obj[key]\n return true\n } catch {\n return false\n }\n}\n","import { isPropertyAccessible } from './isPropertyAccessible'\n\n/**\n * Response status codes for responses that cannot have body.\n * @see https://fetch.spec.whatwg.org/#statuses\n */\nexport const RESPONSE_STATUS_CODES_WITHOUT_BODY = new Set([\n 101, 103, 204, 205, 304,\n])\n\nexport const RESPONSE_STATUS_CODES_WITH_REDIRECT = new Set([\n 301, 302, 303, 307, 308,\n])\n\n/**\n * Returns a boolean indicating whether the given response status\n * code represents a response that cannot have a body.\n */\nexport function isResponseWithoutBody(status: number): boolean {\n return RESPONSE_STATUS_CODES_WITHOUT_BODY.has(status)\n}\n\n/**\n * Creates a generic 500 Unhandled Exception response.\n */\nexport function createServerErrorResponse(body: unknown): Response {\n return new Response(\n JSON.stringify(\n body instanceof Error\n ? {\n name: body.name,\n message: body.message,\n stack: body.stack,\n }\n : body\n ),\n {\n status: 500,\n statusText: 'Unhandled Exception',\n headers: {\n 'Content-Type': 'application/json',\n },\n }\n )\n}\n\nexport type ResponseError = Response & { type: 'error' }\n\n/**\n * Check if the given response is a `Response.error()`.\n *\n * @note Some environments, like Miniflare (Cloudflare) do not\n * implement the \"Response.type\" property and throw on its access.\n * Safely check if we can access \"type\" on \"Response\" before continuing.\n * @see https://github.com/mswjs/msw/issues/1834\n */\nexport function isResponseError(response: Response): response is ResponseError {\n return isPropertyAccessible(response, 'type') && response.type === 'error'\n}\n"],"mappings":"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","names":["InterceptorReadyState"]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createServerErrorResponse,
3
3
  isResponseError
4
- } from "./chunk-BUCULLYM.mjs";
4
+ } from "./chunk-FQQAJBI2.mjs";
5
5
 
6
6
  // src/RequestController.ts
7
7
  import { invariant } from "outvariant";
@@ -193,4 +193,4 @@ export {
193
193
  emitAsync,
194
194
  handleRequest
195
195
  };
196
- //# sourceMappingURL=chunk-XSXCGXEY.mjs.map
196
+ //# sourceMappingURL=chunk-M4WQE4TR.mjs.map
@@ -1,9 +1,9 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkYGM3BCJUjs = require('./chunk-YGM3BCJU.js');
3
+ var _chunkAABH3XLQjs = require('./chunk-AABH3XLQ.js');
4
4
 
5
5
  // src/BatchInterceptor.ts
6
- var BatchInterceptor = class extends _chunkYGM3BCJUjs.Interceptor {
6
+ var BatchInterceptor = class extends _chunkAABH3XLQjs.Interceptor {
7
7
  constructor(options) {
8
8
  BatchInterceptor.symbol = Symbol(options.name);
9
9
  super(BatchInterceptor.symbol);
@@ -48,4 +48,4 @@ var BatchInterceptor = class extends _chunkYGM3BCJUjs.Interceptor {
48
48
 
49
49
 
50
50
  exports.BatchInterceptor = BatchInterceptor;
51
- //# sourceMappingURL=chunk-42632LKH.js.map
51
+ //# sourceMappingURL=chunk-PGTBKPWN.js.map
@@ -5,11 +5,12 @@ import {
5
5
  RequestController,
6
6
  emitAsync,
7
7
  handleRequest
8
- } from "./chunk-XSXCGXEY.mjs";
8
+ } from "./chunk-M4WQE4TR.mjs";
9
9
  import {
10
10
  Interceptor,
11
+ RESPONSE_STATUS_CODES_WITH_REDIRECT,
11
12
  createRequestId
12
- } from "./chunk-BUCULLYM.mjs";
13
+ } from "./chunk-FQQAJBI2.mjs";
13
14
 
14
15
  // src/interceptors/fetch/index.ts
15
16
  import { invariant } from "outvariant";
@@ -25,6 +26,76 @@ function canParseUrl(url) {
25
26
  }
26
27
  }
27
28
 
29
+ // src/interceptors/fetch/utils/createNetworkError.ts
30
+ function createNetworkError(cause) {
31
+ return Object.assign(new TypeError("Failed to fetch"), {
32
+ cause
33
+ });
34
+ }
35
+
36
+ // src/interceptors/fetch/utils/followRedirect.ts
37
+ var REQUEST_BODY_HEADERS = [
38
+ "content-encoding",
39
+ "content-language",
40
+ "content-location",
41
+ "content-type",
42
+ "content-length"
43
+ ];
44
+ var kRedirectCount = Symbol("kRedirectCount");
45
+ async function followFetchRedirect(request, response) {
46
+ if (response.status !== 303 && request.body != null) {
47
+ return Promise.reject(createNetworkError());
48
+ }
49
+ const requestUrl = new URL(request.url);
50
+ let locationUrl;
51
+ try {
52
+ locationUrl = new URL(response.headers.get("location"), request.url);
53
+ } catch (error) {
54
+ return Promise.reject(createNetworkError(error));
55
+ }
56
+ if (!(locationUrl.protocol === "http:" || locationUrl.protocol === "https:")) {
57
+ return Promise.reject(
58
+ createNetworkError("URL scheme must be a HTTP(S) scheme")
59
+ );
60
+ }
61
+ if (Reflect.get(request, kRedirectCount) > 20) {
62
+ return Promise.reject(createNetworkError("redirect count exceeded"));
63
+ }
64
+ Object.defineProperty(request, kRedirectCount, {
65
+ value: (Reflect.get(request, kRedirectCount) || 0) + 1
66
+ });
67
+ if (request.mode === "cors" && (locationUrl.username || locationUrl.password) && !sameOrigin(requestUrl, locationUrl)) {
68
+ return Promise.reject(
69
+ createNetworkError('cross origin not allowed for request mode "cors"')
70
+ );
71
+ }
72
+ const requestInit = {};
73
+ if ([301, 302].includes(response.status) && request.method === "POST" || response.status === 303 && !["HEAD", "GET"].includes(request.method)) {
74
+ requestInit.method = "GET";
75
+ requestInit.body = null;
76
+ REQUEST_BODY_HEADERS.forEach((headerName) => {
77
+ request.headers.delete(headerName);
78
+ });
79
+ }
80
+ if (!sameOrigin(requestUrl, locationUrl)) {
81
+ request.headers.delete("authorization");
82
+ request.headers.delete("proxy-authorization");
83
+ request.headers.delete("cookie");
84
+ request.headers.delete("host");
85
+ }
86
+ requestInit.headers = request.headers;
87
+ return fetch(new Request(locationUrl, requestInit));
88
+ }
89
+ function sameOrigin(left, right) {
90
+ if (left.origin === right.origin && left.origin === "null") {
91
+ return true;
92
+ }
93
+ if (left.protocol === right.protocol && left.hostname === right.hostname && left.port === right.port) {
94
+ return true;
95
+ }
96
+ return false;
97
+ }
98
+
28
99
  // src/interceptors/fetch/index.ts
29
100
  var _FetchInterceptor = class extends Interceptor {
30
101
  constructor() {
@@ -60,6 +131,23 @@ var _FetchInterceptor = class extends Interceptor {
60
131
  this.logger.info("received mocked response!", {
61
132
  response
62
133
  });
134
+ if (RESPONSE_STATUS_CODES_WITH_REDIRECT.has(response.status)) {
135
+ if (request.redirect === "error") {
136
+ responsePromise.reject(createNetworkError("unexpected redirect"));
137
+ return;
138
+ }
139
+ if (request.redirect === "follow") {
140
+ followFetchRedirect(request, response).then(
141
+ (response2) => {
142
+ responsePromise.resolve(response2);
143
+ },
144
+ (reason) => {
145
+ responsePromise.reject(reason);
146
+ }
147
+ );
148
+ return;
149
+ }
150
+ }
63
151
  if (this.emitter.listenerCount("response") > 0) {
64
152
  this.logger.info('emitting the "response" event...');
65
153
  await emitAsync(this.emitter, "response", {
@@ -130,13 +218,8 @@ var _FetchInterceptor = class extends Interceptor {
130
218
  };
131
219
  var FetchInterceptor = _FetchInterceptor;
132
220
  FetchInterceptor.symbol = Symbol("fetch");
133
- function createNetworkError(cause) {
134
- return Object.assign(new TypeError("Failed to fetch"), {
135
- cause
136
- });
137
- }
138
221
 
139
222
  export {
140
223
  FetchInterceptor
141
224
  };
142
- //# sourceMappingURL=chunk-GILG336Y.mjs.map
225
+ //# sourceMappingURL=chunk-T5YM7SUV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/interceptors/fetch/index.ts","../../src/utils/canParseUrl.ts","../../src/interceptors/fetch/utils/createNetworkError.ts","../../src/interceptors/fetch/utils/followRedirect.ts"],"sourcesContent":["import { invariant } from 'outvariant'\nimport { DeferredPromise } from '@open-draft/deferred-promise'\nimport { HttpRequestEventMap, IS_PATCHED_MODULE } from '../../glossary'\nimport { Interceptor } from '../../Interceptor'\nimport { RequestController } from '../../RequestController'\nimport { emitAsync } from '../../utils/emitAsync'\nimport { handleRequest } from '../../utils/handleRequest'\nimport { canParseUrl } from '../../utils/canParseUrl'\nimport { createRequestId } from '../../createRequestId'\nimport { RESPONSE_STATUS_CODES_WITH_REDIRECT } from '../../utils/responseUtils'\nimport { createNetworkError } from './utils/createNetworkError'\nimport { followFetchRedirect } from './utils/followRedirect'\n\nexport class FetchInterceptor extends Interceptor<HttpRequestEventMap> {\n static symbol = Symbol('fetch')\n\n constructor() {\n super(FetchInterceptor.symbol)\n }\n\n protected checkEnvironment() {\n return (\n typeof globalThis !== 'undefined' &&\n typeof globalThis.fetch !== 'undefined'\n )\n }\n\n protected async setup() {\n const pureFetch = globalThis.fetch\n\n invariant(\n !(pureFetch as any)[IS_PATCHED_MODULE],\n 'Failed to patch the \"fetch\" module: already patched.'\n )\n\n globalThis.fetch = async (input, init) => {\n const requestId = createRequestId()\n\n /**\n * @note Resolve potentially relative request URL\n * against the present `location`. This is mainly\n * for native `fetch` in JSDOM.\n * @see https://github.com/mswjs/msw/issues/1625\n */\n const resolvedInput =\n typeof input === 'string' &&\n typeof location !== 'undefined' &&\n !canParseUrl(input)\n ? new URL(input, location.origin)\n : input\n\n const request = new Request(resolvedInput, init)\n const responsePromise = new DeferredPromise<Response>()\n const controller = new RequestController(request)\n\n this.logger.info('[%s] %s', request.method, request.url)\n this.logger.info('awaiting for the mocked response...')\n\n this.logger.info(\n 'emitting the \"request\" event for %s listener(s)...',\n this.emitter.listenerCount('request')\n )\n\n const isRequestHandled = await handleRequest({\n request,\n requestId,\n emitter: this.emitter,\n controller,\n onResponse: async (response) => {\n this.logger.info('received mocked response!', {\n response,\n })\n\n /**\n * Undici's handling of following redirect responses.\n * Treat the \"manual\" redirect mode as a regular mocked response.\n * This way, the client can manually follow the redirect it receives.\n * @see https://github.com/nodejs/undici/blob/a6dac3149c505b58d2e6d068b97f4dc993da55f0/lib/web/fetch/index.js#L1173\n */\n if (RESPONSE_STATUS_CODES_WITH_REDIRECT.has(response.status)) {\n // Reject the request promise if its `redirect` is set to `error`\n // and it receives a mocked redirect response.\n if (request.redirect === 'error') {\n responsePromise.reject(createNetworkError('unexpected redirect'))\n return\n }\n\n if (request.redirect === 'follow') {\n followFetchRedirect(request, response).then(\n (response) => {\n responsePromise.resolve(response)\n },\n (reason) => {\n responsePromise.reject(reason)\n }\n )\n return\n }\n }\n\n if (this.emitter.listenerCount('response') > 0) {\n this.logger.info('emitting the \"response\" event...')\n\n // Await the response listeners to finish before resolving\n // the response promise. This ensures all your logic finishes\n // before the interceptor resolves the pending response.\n await emitAsync(this.emitter, 'response', {\n // Clone the mocked response for the \"response\" event listener.\n // This way, the listener can read the response and not lock its body\n // for the actual fetch consumer.\n response: response.clone(),\n isMockedResponse: true,\n request,\n requestId,\n })\n }\n\n // Set the \"response.url\" property to equal the intercepted request URL.\n Object.defineProperty(response, 'url', {\n writable: false,\n enumerable: true,\n configurable: false,\n value: request.url,\n })\n\n responsePromise.resolve(response)\n },\n onRequestError: (response) => {\n this.logger.info('request has errored!', { response })\n responsePromise.reject(createNetworkError(response))\n },\n onError: (error) => {\n this.logger.info('request has been aborted!', { error })\n responsePromise.reject(error)\n },\n })\n\n if (isRequestHandled) {\n this.logger.info('request has been handled, returning mock promise...')\n return responsePromise\n }\n\n this.logger.info(\n 'no mocked response received, performing request as-is...'\n )\n\n return pureFetch(request).then((response) => {\n this.logger.info('original fetch performed', response)\n\n if (this.emitter.listenerCount('response') > 0) {\n this.logger.info('emitting the \"response\" event...')\n\n const responseClone = response.clone()\n\n this.emitter.emit('response', {\n response: responseClone,\n isMockedResponse: false,\n request,\n requestId,\n })\n }\n\n return response\n })\n }\n\n Object.defineProperty(globalThis.fetch, IS_PATCHED_MODULE, {\n enumerable: true,\n configurable: true,\n value: true,\n })\n\n this.subscriptions.push(() => {\n Object.defineProperty(globalThis.fetch, IS_PATCHED_MODULE, {\n value: undefined,\n })\n\n globalThis.fetch = pureFetch\n\n this.logger.info(\n 'restored native \"globalThis.fetch\"!',\n globalThis.fetch.name\n )\n })\n }\n}\n","/**\n * Returns a boolean indicating whether the given URL string\n * can be parsed into a `URL` instance.\n * A substitute for `URL.canParse()` for Node.js 18.\n */\nexport function canParseUrl(url: string): boolean {\n try {\n new URL(url)\n return true\n } catch (_error) {\n return false\n }\n}\n","export function createNetworkError(cause?: unknown) {\n return Object.assign(new TypeError('Failed to fetch'), {\n cause,\n })\n}\n","import { createNetworkError } from './createNetworkError'\n\nconst REQUEST_BODY_HEADERS = [\n 'content-encoding',\n 'content-language',\n 'content-location',\n 'content-type',\n 'content-length',\n]\n\nconst kRedirectCount = Symbol('kRedirectCount')\n\n/**\n * @see https://github.com/nodejs/undici/blob/a6dac3149c505b58d2e6d068b97f4dc993da55f0/lib/web/fetch/index.js#L1210\n */\nexport async function followFetchRedirect(\n request: Request,\n response: Response\n): Promise<Response> {\n if (response.status !== 303 && request.body != null) {\n return Promise.reject(createNetworkError())\n }\n\n const requestUrl = new URL(request.url)\n\n let locationUrl: URL\n try {\n // If the location is a relative URL, use the request URL as the base URL.\n locationUrl = new URL(response.headers.get('location')!, request.url) \n } catch (error) {\n return Promise.reject(createNetworkError(error))\n }\n\n if (\n !(locationUrl.protocol === 'http:' || locationUrl.protocol === 'https:')\n ) {\n return Promise.reject(\n createNetworkError('URL scheme must be a HTTP(S) scheme')\n )\n }\n\n if (Reflect.get(request, kRedirectCount) > 20) {\n return Promise.reject(createNetworkError('redirect count exceeded'))\n }\n\n Object.defineProperty(request, kRedirectCount, {\n value: (Reflect.get(request, kRedirectCount) || 0) + 1,\n })\n\n if (\n request.mode === 'cors' &&\n (locationUrl.username || locationUrl.password) &&\n !sameOrigin(requestUrl, locationUrl)\n ) {\n return Promise.reject(\n createNetworkError('cross origin not allowed for request mode \"cors\"')\n )\n }\n\n const requestInit: RequestInit = {}\n\n if (\n ([301, 302].includes(response.status) && request.method === 'POST') ||\n (response.status === 303 && !['HEAD', 'GET'].includes(request.method))\n ) {\n requestInit.method = 'GET'\n requestInit.body = null\n\n REQUEST_BODY_HEADERS.forEach((headerName) => {\n request.headers.delete(headerName)\n })\n }\n\n if (!sameOrigin(requestUrl, locationUrl)) {\n request.headers.delete('authorization')\n request.headers.delete('proxy-authorization')\n request.headers.delete('cookie')\n request.headers.delete('host')\n }\n\n /**\n * @note Undici \"safely\" extracts the request body.\n * I suspect we cannot dispatch this request again\n * since its body has been read and the stream is locked.\n */\n\n requestInit.headers = request.headers\n return fetch(new Request(locationUrl, requestInit))\n}\n\n/**\n * @see https://github.com/nodejs/undici/blob/a6dac3149c505b58d2e6d068b97f4dc993da55f0/lib/web/fetch/util.js#L761\n */\nfunction sameOrigin(left: URL, right: URL): boolean {\n if (left.origin === right.origin && left.origin === 'null') {\n return true\n }\n\n if (\n left.protocol === right.protocol &&\n left.hostname === right.hostname &&\n left.port === right.port\n ) {\n return true\n }\n\n return false\n}\n"],"mappings":"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","names":["response"]}
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
3
 
4
- var _chunkYGM3BCJUjs = require('./chunk-YGM3BCJU.js');
4
+ var _chunkAABH3XLQjs = require('./chunk-AABH3XLQ.js');
5
5
 
6
6
  // src/RequestController.ts
7
7
  var _outvariant = require('outvariant');
@@ -94,7 +94,7 @@ async function handleRequest(options) {
94
94
  const handleResponse = async (response) => {
95
95
  if (response instanceof Error) {
96
96
  options.onError(response);
97
- } else if (_chunkYGM3BCJUjs.isResponseError.call(void 0, response)) {
97
+ } else if (_chunkAABH3XLQjs.isResponseError.call(void 0, response)) {
98
98
  options.onRequestError(response);
99
99
  } else {
100
100
  await options.onResponse(response);
@@ -179,7 +179,7 @@ async function handleRequest(options) {
179
179
  return handleResponse(nextResult.data);
180
180
  }
181
181
  }
182
- options.onResponse(_chunkYGM3BCJUjs.createServerErrorResponse.call(void 0, result.error));
182
+ options.onResponse(_chunkAABH3XLQjs.createServerErrorResponse.call(void 0, result.error));
183
183
  return true;
184
184
  }
185
185
  if (result.data) {
@@ -193,4 +193,4 @@ async function handleRequest(options) {
193
193
 
194
194
 
195
195
  exports.RequestController = RequestController; exports.emitAsync = emitAsync; exports.handleRequest = handleRequest;
196
- //# sourceMappingURL=chunk-TQD7SQGP.js.map
196
+ //# sourceMappingURL=chunk-VCUEA4PL.js.map
package/lib/node/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunk42632LKHjs = require('./chunk-42632LKH.js');
3
+ var _chunkPGTBKPWNjs = require('./chunk-PGTBKPWN.js');
4
4
 
5
5
 
6
6
 
@@ -16,7 +16,7 @@ var _chunkIDEEMJ3Fjs = require('./chunk-IDEEMJ3F.js');
16
16
 
17
17
 
18
18
 
19
- var _chunkYGM3BCJUjs = require('./chunk-YGM3BCJU.js');
19
+ var _chunkAABH3XLQjs = require('./chunk-AABH3XLQ.js');
20
20
 
21
21
  // src/utils/getCleanUrl.ts
22
22
  function getCleanUrl(url, isAbsolute = true) {
@@ -35,5 +35,5 @@ function getCleanUrl(url, isAbsolute = true) {
35
35
 
36
36
 
37
37
 
38
- exports.BatchInterceptor = _chunk42632LKHjs.BatchInterceptor; exports.INTERNAL_REQUEST_ID_HEADER_NAME = _chunkYGM3BCJUjs.INTERNAL_REQUEST_ID_HEADER_NAME; exports.IS_PATCHED_MODULE = _chunkIDEEMJ3Fjs.IS_PATCHED_MODULE; exports.Interceptor = _chunkYGM3BCJUjs.Interceptor; exports.InterceptorReadyState = _chunkYGM3BCJUjs.InterceptorReadyState; exports.createRequestId = _chunkYGM3BCJUjs.createRequestId; exports.decodeBuffer = _chunkLK6DILFKjs.decodeBuffer; exports.deleteGlobalSymbol = _chunkYGM3BCJUjs.deleteGlobalSymbol; exports.encodeBuffer = _chunkLK6DILFKjs.encodeBuffer; exports.getCleanUrl = getCleanUrl; exports.getGlobalSymbol = _chunkYGM3BCJUjs.getGlobalSymbol; exports.isResponseWithoutBody = _chunkYGM3BCJUjs.isResponseWithoutBody;
38
+ exports.BatchInterceptor = _chunkPGTBKPWNjs.BatchInterceptor; exports.INTERNAL_REQUEST_ID_HEADER_NAME = _chunkAABH3XLQjs.INTERNAL_REQUEST_ID_HEADER_NAME; exports.IS_PATCHED_MODULE = _chunkIDEEMJ3Fjs.IS_PATCHED_MODULE; exports.Interceptor = _chunkAABH3XLQjs.Interceptor; exports.InterceptorReadyState = _chunkAABH3XLQjs.InterceptorReadyState; exports.createRequestId = _chunkAABH3XLQjs.createRequestId; exports.decodeBuffer = _chunkLK6DILFKjs.decodeBuffer; exports.deleteGlobalSymbol = _chunkAABH3XLQjs.deleteGlobalSymbol; exports.encodeBuffer = _chunkLK6DILFKjs.encodeBuffer; exports.getCleanUrl = getCleanUrl; exports.getGlobalSymbol = _chunkAABH3XLQjs.getGlobalSymbol; exports.isResponseWithoutBody = _chunkAABH3XLQjs.isResponseWithoutBody;
39
39
  //# sourceMappingURL=index.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  BatchInterceptor
3
- } from "./chunk-HGQLG7KE.mjs";
3
+ } from "./chunk-3NMVZQIH.mjs";
4
4
  import {
5
5
  decodeBuffer,
6
6
  encodeBuffer
@@ -16,7 +16,7 @@ import {
16
16
  deleteGlobalSymbol,
17
17
  getGlobalSymbol,
18
18
  isResponseWithoutBody
19
- } from "./chunk-BUCULLYM.mjs";
19
+ } from "./chunk-FQQAJBI2.mjs";
20
20
 
21
21
  // src/utils/getCleanUrl.ts
22
22
  function getCleanUrl(url, isAbsolute = true) {
@@ -1,9 +1,9 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkWTJL7BRVjs = require('../../chunk-WTJL7BRV.js');
4
- require('../../chunk-TQD7SQGP.js');
5
- require('../../chunk-YGM3BCJU.js');
3
+ var _chunkBMRE2LOXjs = require('../../chunk-BMRE2LOX.js');
4
+ require('../../chunk-VCUEA4PL.js');
5
+ require('../../chunk-AABH3XLQ.js');
6
6
 
7
7
 
8
- exports.ClientRequestInterceptor = _chunkWTJL7BRVjs.ClientRequestInterceptor;
8
+ exports.ClientRequestInterceptor = _chunkBMRE2LOXjs.ClientRequestInterceptor;
9
9
  //# sourceMappingURL=index.js.map
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  ClientRequestInterceptor
3
- } from "../../chunk-KA2KMHFU.mjs";
4
- import "../../chunk-XSXCGXEY.mjs";
5
- import "../../chunk-BUCULLYM.mjs";
3
+ } from "../../chunk-77GKBGPN.mjs";
4
+ import "../../chunk-M4WQE4TR.mjs";
5
+ import "../../chunk-FQQAJBI2.mjs";
6
6
  export {
7
7
  ClientRequestInterceptor
8
8
  };
@@ -1,11 +1,11 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunk6L3UERDRjs = require('../../chunk-6L3UERDR.js');
3
+ var _chunkFFSJ6QLAjs = require('../../chunk-FFSJ6QLA.js');
4
4
  require('../../chunk-LK6DILFK.js');
5
5
  require('../../chunk-IDEEMJ3F.js');
6
- require('../../chunk-TQD7SQGP.js');
7
- require('../../chunk-YGM3BCJU.js');
6
+ require('../../chunk-VCUEA4PL.js');
7
+ require('../../chunk-AABH3XLQ.js');
8
8
 
9
9
 
10
- exports.XMLHttpRequestInterceptor = _chunk6L3UERDRjs.XMLHttpRequestInterceptor;
10
+ exports.XMLHttpRequestInterceptor = _chunkFFSJ6QLAjs.XMLHttpRequestInterceptor;
11
11
  //# sourceMappingURL=index.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  XMLHttpRequestInterceptor
3
- } from "../../chunk-WGBCEHTV.mjs";
3
+ } from "../../chunk-C7JQJSAI.mjs";
4
4
  import "../../chunk-6HYIRFX2.mjs";
5
5
  import "../../chunk-BZ3Y7YV5.mjs";
6
- import "../../chunk-XSXCGXEY.mjs";
7
- import "../../chunk-BUCULLYM.mjs";
6
+ import "../../chunk-M4WQE4TR.mjs";
7
+ import "../../chunk-FQQAJBI2.mjs";
8
8
  export {
9
9
  XMLHttpRequestInterceptor
10
10
  };
@@ -1,10 +1,10 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkW4AQXISMjs = require('../../chunk-W4AQXISM.js');
3
+ var _chunkBCUXF7NZjs = require('../../chunk-BCUXF7NZ.js');
4
4
  require('../../chunk-IDEEMJ3F.js');
5
- require('../../chunk-TQD7SQGP.js');
6
- require('../../chunk-YGM3BCJU.js');
5
+ require('../../chunk-VCUEA4PL.js');
6
+ require('../../chunk-AABH3XLQ.js');
7
7
 
8
8
 
9
- exports.FetchInterceptor = _chunkW4AQXISMjs.FetchInterceptor;
9
+ exports.FetchInterceptor = _chunkBCUXF7NZjs.FetchInterceptor;
10
10
  //# sourceMappingURL=index.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  FetchInterceptor
3
- } from "../../chunk-GILG336Y.mjs";
3
+ } from "../../chunk-T5YM7SUV.mjs";
4
4
  import "../../chunk-BZ3Y7YV5.mjs";
5
- import "../../chunk-XSXCGXEY.mjs";
6
- import "../../chunk-BUCULLYM.mjs";
5
+ import "../../chunk-M4WQE4TR.mjs";
6
+ import "../../chunk-FQQAJBI2.mjs";
7
7
  export {
8
8
  FetchInterceptor
9
9
  };
@@ -1,22 +1,22 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkWTJL7BRVjs = require('../chunk-WTJL7BRV.js');
3
+ var _chunkBMRE2LOXjs = require('../chunk-BMRE2LOX.js');
4
4
 
5
5
 
6
- var _chunk6L3UERDRjs = require('../chunk-6L3UERDR.js');
6
+ var _chunkFFSJ6QLAjs = require('../chunk-FFSJ6QLA.js');
7
7
  require('../chunk-LK6DILFK.js');
8
8
 
9
9
 
10
- var _chunkW4AQXISMjs = require('../chunk-W4AQXISM.js');
10
+ var _chunkBCUXF7NZjs = require('../chunk-BCUXF7NZ.js');
11
11
  require('../chunk-IDEEMJ3F.js');
12
- require('../chunk-TQD7SQGP.js');
13
- require('../chunk-YGM3BCJU.js');
12
+ require('../chunk-VCUEA4PL.js');
13
+ require('../chunk-AABH3XLQ.js');
14
14
 
15
15
  // src/presets/node.ts
16
16
  var node_default = [
17
- new (0, _chunkWTJL7BRVjs.ClientRequestInterceptor)(),
18
- new (0, _chunk6L3UERDRjs.XMLHttpRequestInterceptor)(),
19
- new (0, _chunkW4AQXISMjs.FetchInterceptor)()
17
+ new (0, _chunkBMRE2LOXjs.ClientRequestInterceptor)(),
18
+ new (0, _chunkFFSJ6QLAjs.XMLHttpRequestInterceptor)(),
19
+ new (0, _chunkBCUXF7NZjs.FetchInterceptor)()
20
20
  ];
21
21
 
22
22
 
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  ClientRequestInterceptor
3
- } from "../chunk-KA2KMHFU.mjs";
3
+ } from "../chunk-77GKBGPN.mjs";
4
4
  import {
5
5
  XMLHttpRequestInterceptor
6
- } from "../chunk-WGBCEHTV.mjs";
6
+ } from "../chunk-C7JQJSAI.mjs";
7
7
  import "../chunk-6HYIRFX2.mjs";
8
8
  import {
9
9
  FetchInterceptor
10
- } from "../chunk-GILG336Y.mjs";
10
+ } from "../chunk-T5YM7SUV.mjs";
11
11
  import "../chunk-BZ3Y7YV5.mjs";
12
- import "../chunk-XSXCGXEY.mjs";
13
- import "../chunk-BUCULLYM.mjs";
12
+ import "../chunk-M4WQE4TR.mjs";
13
+ import "../chunk-FQQAJBI2.mjs";
14
14
 
15
15
  // src/presets/node.ts
16
16
  var node_default = [
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mswjs/interceptors",
3
3
  "description": "Low-level HTTP/HTTPS/XHR/fetch request interception library.",
4
- "version": "0.34.3",
4
+ "version": "0.35.1",
5
5
  "main": "./lib/node/index.js",
6
6
  "module": "./lib/node/index.mjs",
7
7
  "types": "./lib/node/index.d.ts",