@mswjs/interceptors 0.39.8 → 0.41.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.
Files changed (282) hide show
  1. package/ClientRequest/package.json +7 -2
  2. package/RemoteHttpInterceptor/package.json +7 -2
  3. package/WebSocket/package.json +9 -2
  4. package/XMLHttpRequest/package.json +9 -3
  5. package/fetch/package.json +9 -3
  6. package/lib/browser/Interceptor-2mUoKZL1.d.mts +65 -0
  7. package/lib/browser/Interceptor-Deczogc8.d.cts +65 -0
  8. package/lib/browser/XMLHttpRequest-BUfglQD1.cjs +761 -0
  9. package/lib/browser/XMLHttpRequest-BUfglQD1.cjs.map +1 -0
  10. package/lib/browser/XMLHttpRequest-DS5fc8Qs.mjs +756 -0
  11. package/lib/browser/XMLHttpRequest-DS5fc8Qs.mjs.map +1 -0
  12. package/lib/browser/bufferUtils-BiiO6HZv.mjs +20 -0
  13. package/lib/browser/bufferUtils-BiiO6HZv.mjs.map +1 -0
  14. package/lib/browser/bufferUtils-Uc0eRItL.cjs +38 -0
  15. package/lib/browser/bufferUtils-Uc0eRItL.cjs.map +1 -0
  16. package/lib/browser/createRequestId-Cs4oXfa1.cjs +205 -0
  17. package/lib/browser/createRequestId-Cs4oXfa1.cjs.map +1 -0
  18. package/lib/browser/createRequestId-DQcIlohW.mjs +170 -0
  19. package/lib/browser/createRequestId-DQcIlohW.mjs.map +1 -0
  20. package/lib/browser/fetch-BHcqM3z7.cjs +253 -0
  21. package/lib/browser/fetch-BHcqM3z7.cjs.map +1 -0
  22. package/lib/browser/fetch-DSJoynSF.mjs +248 -0
  23. package/lib/browser/fetch-DSJoynSF.mjs.map +1 -0
  24. package/lib/browser/getRawRequest-BTaNLFr0.mjs +218 -0
  25. package/lib/browser/getRawRequest-BTaNLFr0.mjs.map +1 -0
  26. package/lib/browser/getRawRequest-zx8rUJL2.cjs +259 -0
  27. package/lib/browser/getRawRequest-zx8rUJL2.cjs.map +1 -0
  28. package/lib/browser/glossary-BdLS4k1H.d.cts +70 -0
  29. package/lib/browser/glossary-gEEJhK4S.d.mts +70 -0
  30. package/lib/browser/handleRequest-DI6a7Dty.cjs +189 -0
  31. package/lib/browser/handleRequest-DI6a7Dty.cjs.map +1 -0
  32. package/lib/browser/handleRequest-DxGbCTbb.mjs +178 -0
  33. package/lib/browser/handleRequest-DxGbCTbb.mjs.map +1 -0
  34. package/lib/browser/hasConfigurableGlobal-C8kXFDic.mjs +33 -0
  35. package/lib/browser/hasConfigurableGlobal-C8kXFDic.mjs.map +1 -0
  36. package/lib/browser/hasConfigurableGlobal-D7S3l5h6.cjs +45 -0
  37. package/lib/browser/hasConfigurableGlobal-D7S3l5h6.cjs.map +1 -0
  38. package/lib/browser/index.cjs +68 -0
  39. package/lib/browser/index.cjs.map +1 -0
  40. package/lib/browser/index.d.cts +87 -0
  41. package/lib/browser/index.d.mts +87 -0
  42. package/lib/browser/index.mjs +49 -75
  43. package/lib/browser/index.mjs.map +1 -1
  44. package/lib/browser/interceptors/WebSocket/index.cjs +621 -0
  45. package/lib/browser/interceptors/WebSocket/index.cjs.map +1 -0
  46. package/lib/browser/interceptors/WebSocket/index.d.cts +277 -0
  47. package/lib/browser/interceptors/WebSocket/index.d.mts +277 -0
  48. package/lib/browser/interceptors/WebSocket/index.mjs +587 -694
  49. package/lib/browser/interceptors/WebSocket/index.mjs.map +1 -1
  50. package/lib/browser/interceptors/XMLHttpRequest/index.cjs +7 -0
  51. package/lib/browser/interceptors/XMLHttpRequest/index.d.cts +15 -0
  52. package/lib/browser/interceptors/XMLHttpRequest/index.d.mts +15 -0
  53. package/lib/browser/interceptors/XMLHttpRequest/index.mjs +7 -12
  54. package/lib/browser/interceptors/fetch/index.cjs +6 -0
  55. package/lib/browser/interceptors/fetch/index.d.cts +13 -0
  56. package/lib/browser/interceptors/fetch/index.d.mts +13 -0
  57. package/lib/browser/interceptors/fetch/index.mjs +6 -11
  58. package/lib/browser/presets/browser.cjs +17 -0
  59. package/lib/browser/presets/browser.cjs.map +1 -0
  60. package/lib/browser/presets/browser.d.cts +12 -0
  61. package/lib/browser/presets/browser.d.mts +14 -0
  62. package/lib/browser/presets/browser.mjs +15 -19
  63. package/lib/browser/presets/browser.mjs.map +1 -1
  64. package/lib/node/BatchInterceptor-3LnAnLTx.cjs +49 -0
  65. package/lib/node/BatchInterceptor-3LnAnLTx.cjs.map +1 -0
  66. package/lib/node/BatchInterceptor-D7mXzHcQ.d.mts +26 -0
  67. package/lib/node/BatchInterceptor-DFaBPilf.mjs +44 -0
  68. package/lib/node/BatchInterceptor-DFaBPilf.mjs.map +1 -0
  69. package/lib/node/BatchInterceptor-D_YqR8qU.d.cts +26 -0
  70. package/lib/node/ClientRequest-2rDe54Ui.cjs +1043 -0
  71. package/lib/node/ClientRequest-2rDe54Ui.cjs.map +1 -0
  72. package/lib/node/ClientRequest-Ca8Qykuv.mjs +1034 -0
  73. package/lib/node/ClientRequest-Ca8Qykuv.mjs.map +1 -0
  74. package/lib/node/Interceptor-DEazpLJd.d.mts +133 -0
  75. package/lib/node/Interceptor-DJ2akVWI.d.cts +133 -0
  76. package/lib/node/RemoteHttpInterceptor.cjs +154 -0
  77. package/lib/node/RemoteHttpInterceptor.cjs.map +1 -0
  78. package/lib/node/RemoteHttpInterceptor.d.cts +39 -0
  79. package/lib/node/RemoteHttpInterceptor.d.mts +39 -0
  80. package/lib/node/RemoteHttpInterceptor.mjs +145 -186
  81. package/lib/node/RemoteHttpInterceptor.mjs.map +1 -1
  82. package/lib/node/XMLHttpRequest-B7kJdYYI.cjs +763 -0
  83. package/lib/node/XMLHttpRequest-B7kJdYYI.cjs.map +1 -0
  84. package/lib/node/XMLHttpRequest-C8dIZpds.mjs +757 -0
  85. package/lib/node/XMLHttpRequest-C8dIZpds.mjs.map +1 -0
  86. package/lib/node/bufferUtils-DiCTqG-7.cjs +38 -0
  87. package/lib/node/bufferUtils-DiCTqG-7.cjs.map +1 -0
  88. package/lib/node/bufferUtils-_8XfKIfX.mjs +20 -0
  89. package/lib/node/bufferUtils-_8XfKIfX.mjs.map +1 -0
  90. package/lib/node/chunk-CbDLau6x.cjs +34 -0
  91. package/lib/node/fetch-BmXpK10r.cjs +272 -0
  92. package/lib/node/fetch-BmXpK10r.cjs.map +1 -0
  93. package/lib/node/fetch-G1DVwDKG.mjs +265 -0
  94. package/lib/node/fetch-G1DVwDKG.mjs.map +1 -0
  95. package/lib/node/fetchUtils-BaY5iWXw.cjs +419 -0
  96. package/lib/node/fetchUtils-BaY5iWXw.cjs.map +1 -0
  97. package/lib/node/fetchUtils-CoU35g3M.mjs +359 -0
  98. package/lib/node/fetchUtils-CoU35g3M.mjs.map +1 -0
  99. package/lib/node/getRawRequest-BavnMWh_.cjs +36 -0
  100. package/lib/node/getRawRequest-BavnMWh_.cjs.map +1 -0
  101. package/lib/node/getRawRequest-DnwmXyOW.mjs +24 -0
  102. package/lib/node/getRawRequest-DnwmXyOW.mjs.map +1 -0
  103. package/lib/node/glossary-BLKRyLBd.cjs +12 -0
  104. package/lib/node/glossary-BLKRyLBd.cjs.map +1 -0
  105. package/lib/node/glossary-glQBRnVD.mjs +6 -0
  106. package/lib/node/glossary-glQBRnVD.mjs.map +1 -0
  107. package/lib/node/handleRequest-Bb7Y-XLw.cjs +220 -0
  108. package/lib/node/handleRequest-Bb7Y-XLw.cjs.map +1 -0
  109. package/lib/node/handleRequest-Y97UwBbF.mjs +190 -0
  110. package/lib/node/handleRequest-Y97UwBbF.mjs.map +1 -0
  111. package/lib/node/hasConfigurableGlobal-C97fWuaA.cjs +26 -0
  112. package/lib/node/hasConfigurableGlobal-C97fWuaA.cjs.map +1 -0
  113. package/lib/node/hasConfigurableGlobal-DBJA0vjm.mjs +20 -0
  114. package/lib/node/hasConfigurableGlobal-DBJA0vjm.mjs.map +1 -0
  115. package/lib/node/index-BMbJ8FXL.d.cts +113 -0
  116. package/lib/node/index-C0YAQ36w.d.mts +113 -0
  117. package/lib/node/index.cjs +30 -0
  118. package/lib/node/index.cjs.map +1 -0
  119. package/lib/node/index.d.cts +66 -0
  120. package/lib/node/index.d.mts +66 -0
  121. package/lib/node/index.mjs +13 -39
  122. package/lib/node/index.mjs.map +1 -1
  123. package/lib/node/interceptors/ClientRequest/index.cjs +6 -0
  124. package/lib/node/interceptors/ClientRequest/index.d.cts +2 -0
  125. package/lib/node/interceptors/ClientRequest/index.d.mts +3 -0
  126. package/lib/node/interceptors/ClientRequest/index.mjs +6 -11
  127. package/lib/node/interceptors/XMLHttpRequest/index.cjs +6 -0
  128. package/lib/node/interceptors/XMLHttpRequest/index.d.cts +14 -0
  129. package/lib/node/interceptors/XMLHttpRequest/index.d.mts +14 -0
  130. package/lib/node/interceptors/XMLHttpRequest/index.mjs +6 -13
  131. package/lib/node/interceptors/fetch/index.cjs +5 -0
  132. package/lib/node/interceptors/fetch/index.d.cts +12 -0
  133. package/lib/node/interceptors/fetch/index.d.mts +12 -0
  134. package/lib/node/interceptors/fetch/index.mjs +5 -12
  135. package/lib/node/node-DwCc6iuP.mjs +27 -0
  136. package/lib/node/node-DwCc6iuP.mjs.map +1 -0
  137. package/lib/node/node-dKdAf3tC.cjs +39 -0
  138. package/lib/node/node-dKdAf3tC.cjs.map +1 -0
  139. package/lib/node/presets/node.cjs +22 -0
  140. package/lib/node/presets/node.cjs.map +1 -0
  141. package/lib/node/presets/node.d.cts +13 -0
  142. package/lib/node/presets/node.d.mts +15 -0
  143. package/lib/node/presets/node.mjs +18 -23
  144. package/lib/node/presets/node.mjs.map +1 -1
  145. package/lib/node/utils/node/index.cjs +4 -0
  146. package/lib/node/utils/node/{index.d.ts → index.d.cts} +5 -2
  147. package/lib/node/utils/node/index.d.mts +16 -0
  148. package/lib/node/utils/node/index.mjs +3 -10
  149. package/package.json +34 -59
  150. package/presets/browser/package.json +2 -3
  151. package/presets/node/package.json +7 -2
  152. package/src/RemoteHttpInterceptor.ts +18 -13
  153. package/src/RequestController.test.ts +78 -31
  154. package/src/RequestController.ts +63 -39
  155. package/src/index.ts +4 -0
  156. package/src/interceptors/ClientRequest/MockHttpSocket.ts +43 -9
  157. package/src/interceptors/ClientRequest/index.ts +14 -18
  158. package/src/interceptors/ClientRequest/utils/parserUtils.ts +48 -0
  159. package/src/interceptors/WebSocket/index.ts +4 -1
  160. package/src/interceptors/XMLHttpRequest/XMLHttpRequestController.ts +45 -35
  161. package/src/interceptors/XMLHttpRequest/XMLHttpRequestProxy.ts +24 -21
  162. package/src/interceptors/XMLHttpRequest/utils/getBodyByteLength.test.ts +2 -2
  163. package/src/interceptors/fetch/index.ts +61 -50
  164. package/src/utils/handleRequest.ts +65 -95
  165. package/lib/browser/Interceptor-af98b768.d.ts +0 -63
  166. package/lib/browser/chunk-2HUMWGRD.js +0 -37
  167. package/lib/browser/chunk-2HUMWGRD.js.map +0 -1
  168. package/lib/browser/chunk-2QICSCCS.js +0 -238
  169. package/lib/browser/chunk-2QICSCCS.js.map +0 -1
  170. package/lib/browser/chunk-3RXCRGL2.mjs +0 -117
  171. package/lib/browser/chunk-3RXCRGL2.mjs.map +0 -1
  172. package/lib/browser/chunk-6HYIRFX2.mjs +0 -22
  173. package/lib/browser/chunk-6HYIRFX2.mjs.map +0 -1
  174. package/lib/browser/chunk-E3CCOBRX.js +0 -846
  175. package/lib/browser/chunk-E3CCOBRX.js.map +0 -1
  176. package/lib/browser/chunk-E7UVBHVO.mjs +0 -846
  177. package/lib/browser/chunk-E7UVBHVO.mjs.map +0 -1
  178. package/lib/browser/chunk-H74PGQ4Y.js +0 -296
  179. package/lib/browser/chunk-H74PGQ4Y.js.map +0 -1
  180. package/lib/browser/chunk-LK6DILFK.js +0 -22
  181. package/lib/browser/chunk-LK6DILFK.js.map +0 -1
  182. package/lib/browser/chunk-PTTUYYVR.mjs +0 -238
  183. package/lib/browser/chunk-PTTUYYVR.mjs.map +0 -1
  184. package/lib/browser/chunk-Q7K2XAEP.mjs +0 -296
  185. package/lib/browser/chunk-Q7K2XAEP.mjs.map +0 -1
  186. package/lib/browser/chunk-QED3Q6Z2.mjs +0 -169
  187. package/lib/browser/chunk-QED3Q6Z2.mjs.map +0 -1
  188. package/lib/browser/chunk-T7TBRNJZ.js +0 -117
  189. package/lib/browser/chunk-T7TBRNJZ.js.map +0 -1
  190. package/lib/browser/chunk-TIPR373R.js +0 -169
  191. package/lib/browser/chunk-TIPR373R.js.map +0 -1
  192. package/lib/browser/chunk-VYSDLBSS.mjs +0 -37
  193. package/lib/browser/chunk-VYSDLBSS.mjs.map +0 -1
  194. package/lib/browser/glossary-7152281e.d.ts +0 -69
  195. package/lib/browser/index.d.ts +0 -83
  196. package/lib/browser/index.js +0 -81
  197. package/lib/browser/index.js.map +0 -1
  198. package/lib/browser/interceptors/WebSocket/index.d.ts +0 -271
  199. package/lib/browser/interceptors/WebSocket/index.js +0 -721
  200. package/lib/browser/interceptors/WebSocket/index.js.map +0 -1
  201. package/lib/browser/interceptors/XMLHttpRequest/index.d.ts +0 -15
  202. package/lib/browser/interceptors/XMLHttpRequest/index.js +0 -12
  203. package/lib/browser/interceptors/XMLHttpRequest/index.js.map +0 -1
  204. package/lib/browser/interceptors/XMLHttpRequest/index.mjs.map +0 -1
  205. package/lib/browser/interceptors/fetch/index.d.ts +0 -14
  206. package/lib/browser/interceptors/fetch/index.js +0 -11
  207. package/lib/browser/interceptors/fetch/index.js.map +0 -1
  208. package/lib/browser/interceptors/fetch/index.mjs.map +0 -1
  209. package/lib/browser/presets/browser.d.ts +0 -15
  210. package/lib/browser/presets/browser.js +0 -21
  211. package/lib/browser/presets/browser.js.map +0 -1
  212. package/lib/node/BatchInterceptor-5b72232f.d.ts +0 -24
  213. package/lib/node/Interceptor-bc5a9d8e.d.ts +0 -130
  214. package/lib/node/RemoteHttpInterceptor.d.ts +0 -45
  215. package/lib/node/RemoteHttpInterceptor.js +0 -193
  216. package/lib/node/RemoteHttpInterceptor.js.map +0 -1
  217. package/lib/node/chunk-3CNGDJFB.mjs +0 -313
  218. package/lib/node/chunk-3CNGDJFB.mjs.map +0 -1
  219. package/lib/node/chunk-3GJB4JDF.mjs +0 -14
  220. package/lib/node/chunk-3GJB4JDF.mjs.map +0 -1
  221. package/lib/node/chunk-4NEYTVWD.mjs +0 -848
  222. package/lib/node/chunk-4NEYTVWD.mjs.map +0 -1
  223. package/lib/node/chunk-4YBV77DG.js +0 -32
  224. package/lib/node/chunk-4YBV77DG.js.map +0 -1
  225. package/lib/node/chunk-6HYIRFX2.mjs +0 -22
  226. package/lib/node/chunk-6HYIRFX2.mjs.map +0 -1
  227. package/lib/node/chunk-6YM4PLBI.mjs +0 -7
  228. package/lib/node/chunk-6YM4PLBI.mjs.map +0 -1
  229. package/lib/node/chunk-72ZIHMEB.js +0 -249
  230. package/lib/node/chunk-72ZIHMEB.js.map +0 -1
  231. package/lib/node/chunk-73NOP3T5.js +0 -7
  232. package/lib/node/chunk-73NOP3T5.js.map +0 -1
  233. package/lib/node/chunk-A7Q4RTDJ.mjs +0 -249
  234. package/lib/node/chunk-A7Q4RTDJ.mjs.map +0 -1
  235. package/lib/node/chunk-A7U44ARP.js +0 -268
  236. package/lib/node/chunk-A7U44ARP.js.map +0 -1
  237. package/lib/node/chunk-EKNRB5ZS.mjs +0 -1115
  238. package/lib/node/chunk-EKNRB5ZS.mjs.map +0 -1
  239. package/lib/node/chunk-IHJSPMYM.mjs +0 -268
  240. package/lib/node/chunk-IHJSPMYM.mjs.map +0 -1
  241. package/lib/node/chunk-LK6DILFK.js +0 -22
  242. package/lib/node/chunk-LK6DILFK.js.map +0 -1
  243. package/lib/node/chunk-N4ZZFE24.js +0 -1115
  244. package/lib/node/chunk-N4ZZFE24.js.map +0 -1
  245. package/lib/node/chunk-PFGO5BSM.js +0 -25
  246. package/lib/node/chunk-PFGO5BSM.js.map +0 -1
  247. package/lib/node/chunk-R6JVCM7X.js +0 -51
  248. package/lib/node/chunk-R6JVCM7X.js.map +0 -1
  249. package/lib/node/chunk-RC2XPCC4.mjs +0 -51
  250. package/lib/node/chunk-RC2XPCC4.mjs.map +0 -1
  251. package/lib/node/chunk-SMXZPJEA.js +0 -14
  252. package/lib/node/chunk-SMXZPJEA.js.map +0 -1
  253. package/lib/node/chunk-TJDMZZXE.mjs +0 -32
  254. package/lib/node/chunk-TJDMZZXE.mjs.map +0 -1
  255. package/lib/node/chunk-TX5GBTFY.mjs +0 -25
  256. package/lib/node/chunk-TX5GBTFY.mjs.map +0 -1
  257. package/lib/node/chunk-VV2LUF5K.js +0 -848
  258. package/lib/node/chunk-VV2LUF5K.js.map +0 -1
  259. package/lib/node/chunk-Z5LWCBZS.js +0 -313
  260. package/lib/node/chunk-Z5LWCBZS.js.map +0 -1
  261. package/lib/node/index.d.ts +0 -62
  262. package/lib/node/index.js +0 -43
  263. package/lib/node/index.js.map +0 -1
  264. package/lib/node/interceptors/ClientRequest/index.d.ts +0 -111
  265. package/lib/node/interceptors/ClientRequest/index.js +0 -11
  266. package/lib/node/interceptors/ClientRequest/index.js.map +0 -1
  267. package/lib/node/interceptors/ClientRequest/index.mjs.map +0 -1
  268. package/lib/node/interceptors/XMLHttpRequest/index.d.ts +0 -14
  269. package/lib/node/interceptors/XMLHttpRequest/index.js +0 -13
  270. package/lib/node/interceptors/XMLHttpRequest/index.js.map +0 -1
  271. package/lib/node/interceptors/XMLHttpRequest/index.mjs.map +0 -1
  272. package/lib/node/interceptors/fetch/index.d.ts +0 -13
  273. package/lib/node/interceptors/fetch/index.js +0 -12
  274. package/lib/node/interceptors/fetch/index.js.map +0 -1
  275. package/lib/node/interceptors/fetch/index.mjs.map +0 -1
  276. package/lib/node/presets/node.d.ts +0 -16
  277. package/lib/node/presets/node.js +0 -27
  278. package/lib/node/presets/node.js.map +0 -1
  279. package/lib/node/utils/node/index.js +0 -10
  280. package/lib/node/utils/node/index.js.map +0 -1
  281. package/lib/node/utils/node/index.mjs.map +0 -1
  282. package/src/utils/RequestController.ts +0 -21
@@ -0,0 +1,763 @@
1
+ const require_chunk = require('./chunk-CbDLau6x.cjs');
2
+ const require_glossary = require('./glossary-BLKRyLBd.cjs');
3
+ const require_fetchUtils = require('./fetchUtils-BaY5iWXw.cjs');
4
+ const require_bufferUtils = require('./bufferUtils-DiCTqG-7.cjs');
5
+ const require_getRawRequest = require('./getRawRequest-BavnMWh_.cjs');
6
+ const require_handleRequest = require('./handleRequest-Bb7Y-XLw.cjs');
7
+ const require_hasConfigurableGlobal = require('./hasConfigurableGlobal-C97fWuaA.cjs');
8
+ let outvariant = require("outvariant");
9
+ let is_node_process = require("is-node-process");
10
+
11
+ //#region src/interceptors/XMLHttpRequest/utils/concatArrayBuffer.ts
12
+ /**
13
+ * Concatenate two `Uint8Array` buffers.
14
+ */
15
+ function concatArrayBuffer(left, right) {
16
+ const result = new Uint8Array(left.byteLength + right.byteLength);
17
+ result.set(left, 0);
18
+ result.set(right, left.byteLength);
19
+ return result;
20
+ }
21
+
22
+ //#endregion
23
+ //#region src/interceptors/XMLHttpRequest/polyfills/EventPolyfill.ts
24
+ var EventPolyfill = class {
25
+ constructor(type, options) {
26
+ this.NONE = 0;
27
+ this.CAPTURING_PHASE = 1;
28
+ this.AT_TARGET = 2;
29
+ this.BUBBLING_PHASE = 3;
30
+ this.type = "";
31
+ this.srcElement = null;
32
+ this.currentTarget = null;
33
+ this.eventPhase = 0;
34
+ this.isTrusted = true;
35
+ this.composed = false;
36
+ this.cancelable = true;
37
+ this.defaultPrevented = false;
38
+ this.bubbles = true;
39
+ this.lengthComputable = true;
40
+ this.loaded = 0;
41
+ this.total = 0;
42
+ this.cancelBubble = false;
43
+ this.returnValue = true;
44
+ this.type = type;
45
+ this.target = options?.target || null;
46
+ this.currentTarget = options?.currentTarget || null;
47
+ this.timeStamp = Date.now();
48
+ }
49
+ composedPath() {
50
+ return [];
51
+ }
52
+ initEvent(type, bubbles, cancelable) {
53
+ this.type = type;
54
+ this.bubbles = !!bubbles;
55
+ this.cancelable = !!cancelable;
56
+ }
57
+ preventDefault() {
58
+ this.defaultPrevented = true;
59
+ }
60
+ stopPropagation() {}
61
+ stopImmediatePropagation() {}
62
+ };
63
+
64
+ //#endregion
65
+ //#region src/interceptors/XMLHttpRequest/polyfills/ProgressEventPolyfill.ts
66
+ var ProgressEventPolyfill = class extends EventPolyfill {
67
+ constructor(type, init) {
68
+ super(type);
69
+ this.lengthComputable = init?.lengthComputable || false;
70
+ this.composed = init?.composed || false;
71
+ this.loaded = init?.loaded || 0;
72
+ this.total = init?.total || 0;
73
+ }
74
+ };
75
+
76
+ //#endregion
77
+ //#region src/interceptors/XMLHttpRequest/utils/createEvent.ts
78
+ const SUPPORTS_PROGRESS_EVENT = typeof ProgressEvent !== "undefined";
79
+ function createEvent(target, type, init) {
80
+ const progressEvents = [
81
+ "error",
82
+ "progress",
83
+ "loadstart",
84
+ "loadend",
85
+ "load",
86
+ "timeout",
87
+ "abort"
88
+ ];
89
+ /**
90
+ * `ProgressEvent` is not supported in React Native.
91
+ * @see https://github.com/mswjs/interceptors/issues/40
92
+ */
93
+ const ProgressEventClass = SUPPORTS_PROGRESS_EVENT ? ProgressEvent : ProgressEventPolyfill;
94
+ return progressEvents.includes(type) ? new ProgressEventClass(type, {
95
+ lengthComputable: true,
96
+ loaded: init?.loaded || 0,
97
+ total: init?.total || 0
98
+ }) : new EventPolyfill(type, {
99
+ target,
100
+ currentTarget: target
101
+ });
102
+ }
103
+
104
+ //#endregion
105
+ //#region src/utils/findPropertySource.ts
106
+ /**
107
+ * Returns the source object of the given property on the target object
108
+ * (the target itself, any parent in its prototype, or null).
109
+ */
110
+ function findPropertySource(target, propertyName) {
111
+ if (!(propertyName in target)) return null;
112
+ if (Object.prototype.hasOwnProperty.call(target, propertyName)) return target;
113
+ const prototype = Reflect.getPrototypeOf(target);
114
+ return prototype ? findPropertySource(prototype, propertyName) : null;
115
+ }
116
+
117
+ //#endregion
118
+ //#region src/utils/createProxy.ts
119
+ function createProxy(target, options) {
120
+ return new Proxy(target, optionsToProxyHandler(options));
121
+ }
122
+ function optionsToProxyHandler(options) {
123
+ const { constructorCall, methodCall, getProperty, setProperty } = options;
124
+ const handler = {};
125
+ if (typeof constructorCall !== "undefined") handler.construct = function(target, args, newTarget) {
126
+ const next = Reflect.construct.bind(null, target, args, newTarget);
127
+ return constructorCall.call(newTarget, args, next);
128
+ };
129
+ handler.set = function(target, propertyName, nextValue) {
130
+ const next = () => {
131
+ const propertySource = findPropertySource(target, propertyName) || target;
132
+ const ownDescriptors = Reflect.getOwnPropertyDescriptor(propertySource, propertyName);
133
+ if (typeof ownDescriptors?.set !== "undefined") {
134
+ ownDescriptors.set.apply(target, [nextValue]);
135
+ return true;
136
+ }
137
+ return Reflect.defineProperty(propertySource, propertyName, {
138
+ writable: true,
139
+ enumerable: true,
140
+ configurable: true,
141
+ value: nextValue
142
+ });
143
+ };
144
+ if (typeof setProperty !== "undefined") return setProperty.call(target, [propertyName, nextValue], next);
145
+ return next();
146
+ };
147
+ handler.get = function(target, propertyName, receiver) {
148
+ /**
149
+ * @note Using `Reflect.get()` here causes "TypeError: Illegal invocation".
150
+ */
151
+ const next = () => target[propertyName];
152
+ const value = typeof getProperty !== "undefined" ? getProperty.call(target, [propertyName, receiver], next) : next();
153
+ if (typeof value === "function") return (...args) => {
154
+ const next$1 = value.bind(target, ...args);
155
+ if (typeof methodCall !== "undefined") return methodCall.call(target, [propertyName, args], next$1);
156
+ return next$1();
157
+ };
158
+ return value;
159
+ };
160
+ return handler;
161
+ }
162
+
163
+ //#endregion
164
+ //#region src/interceptors/XMLHttpRequest/utils/isDomParserSupportedType.ts
165
+ function isDomParserSupportedType(type) {
166
+ return [
167
+ "application/xhtml+xml",
168
+ "application/xml",
169
+ "image/svg+xml",
170
+ "text/html",
171
+ "text/xml"
172
+ ].some((supportedType) => {
173
+ return type.startsWith(supportedType);
174
+ });
175
+ }
176
+
177
+ //#endregion
178
+ //#region src/utils/parseJson.ts
179
+ /**
180
+ * Parses a given string into JSON.
181
+ * Gracefully handles invalid JSON by returning `null`.
182
+ */
183
+ function parseJson(data) {
184
+ try {
185
+ return JSON.parse(data);
186
+ } catch (_) {
187
+ return null;
188
+ }
189
+ }
190
+
191
+ //#endregion
192
+ //#region src/interceptors/XMLHttpRequest/utils/createResponse.ts
193
+ /**
194
+ * Creates a Fetch API `Response` instance from the given
195
+ * `XMLHttpRequest` instance and a response body.
196
+ */
197
+ function createResponse(request, body) {
198
+ return new require_fetchUtils.FetchResponse(require_fetchUtils.FetchResponse.isResponseWithBody(request.status) ? body : null, {
199
+ url: request.responseURL,
200
+ status: request.status,
201
+ statusText: request.statusText,
202
+ headers: createHeadersFromXMLHttpRequestHeaders(request.getAllResponseHeaders())
203
+ });
204
+ }
205
+ function createHeadersFromXMLHttpRequestHeaders(headersString) {
206
+ const headers = new Headers();
207
+ const lines = headersString.split(/[\r\n]+/);
208
+ for (const line of lines) {
209
+ if (line.trim() === "") continue;
210
+ const [name, ...parts] = line.split(": ");
211
+ const value = parts.join(": ");
212
+ headers.append(name, value);
213
+ }
214
+ return headers;
215
+ }
216
+
217
+ //#endregion
218
+ //#region src/interceptors/XMLHttpRequest/utils/getBodyByteLength.ts
219
+ /**
220
+ * Return a total byte length of the given request/response body.
221
+ * If the `Content-Length` header is present, it will be used as the byte length.
222
+ */
223
+ async function getBodyByteLength(input) {
224
+ const explicitContentLength = input.headers.get("content-length");
225
+ if (explicitContentLength != null && explicitContentLength !== "") return Number(explicitContentLength);
226
+ return (await input.arrayBuffer()).byteLength;
227
+ }
228
+
229
+ //#endregion
230
+ //#region src/interceptors/XMLHttpRequest/XMLHttpRequestController.ts
231
+ const kIsRequestHandled = Symbol("kIsRequestHandled");
232
+ const IS_NODE = (0, is_node_process.isNodeProcess)();
233
+ const kFetchRequest = Symbol("kFetchRequest");
234
+ /**
235
+ * An `XMLHttpRequest` instance controller that allows us
236
+ * to handle any given request instance (e.g. responding to it).
237
+ */
238
+ var XMLHttpRequestController = class {
239
+ constructor(initialRequest, logger) {
240
+ this.initialRequest = initialRequest;
241
+ this.logger = logger;
242
+ this.method = "GET";
243
+ this.url = null;
244
+ this[kIsRequestHandled] = false;
245
+ this.events = /* @__PURE__ */ new Map();
246
+ this.uploadEvents = /* @__PURE__ */ new Map();
247
+ this.requestId = require_fetchUtils.createRequestId();
248
+ this.requestHeaders = new Headers();
249
+ this.responseBuffer = new Uint8Array();
250
+ this.request = createProxy(initialRequest, {
251
+ setProperty: ([propertyName, nextValue], invoke) => {
252
+ switch (propertyName) {
253
+ case "ontimeout": {
254
+ const eventName = propertyName.slice(2);
255
+ /**
256
+ * @note Proxy callbacks to event listeners because JSDOM has trouble
257
+ * translating these properties to callbacks. It seemed to be operating
258
+ * on events exclusively.
259
+ */
260
+ this.request.addEventListener(eventName, nextValue);
261
+ return invoke();
262
+ }
263
+ default: return invoke();
264
+ }
265
+ },
266
+ methodCall: ([methodName, args], invoke) => {
267
+ switch (methodName) {
268
+ case "open": {
269
+ const [method, url] = args;
270
+ if (typeof url === "undefined") {
271
+ this.method = "GET";
272
+ this.url = toAbsoluteUrl(method);
273
+ } else {
274
+ this.method = method;
275
+ this.url = toAbsoluteUrl(url);
276
+ }
277
+ this.logger = this.logger.extend(`${this.method} ${this.url.href}`);
278
+ this.logger.info("open", this.method, this.url.href);
279
+ return invoke();
280
+ }
281
+ case "addEventListener": {
282
+ const [eventName, listener] = args;
283
+ this.registerEvent(eventName, listener);
284
+ this.logger.info("addEventListener", eventName, listener);
285
+ return invoke();
286
+ }
287
+ case "setRequestHeader": {
288
+ const [name, value] = args;
289
+ this.requestHeaders.set(name, value);
290
+ this.logger.info("setRequestHeader", name, value);
291
+ return invoke();
292
+ }
293
+ case "send": {
294
+ const [body] = args;
295
+ this.request.addEventListener("load", () => {
296
+ if (typeof this.onResponse !== "undefined") {
297
+ const fetchResponse = createResponse(
298
+ this.request,
299
+ /**
300
+ * The `response` property is the right way to read
301
+ * the ambiguous response body, as the request's "responseType" may differ.
302
+ * @see https://xhr.spec.whatwg.org/#the-response-attribute
303
+ */
304
+ this.request.response
305
+ );
306
+ this.onResponse.call(this, {
307
+ response: fetchResponse,
308
+ isMockedResponse: this[kIsRequestHandled],
309
+ request: fetchRequest,
310
+ requestId: this.requestId
311
+ });
312
+ }
313
+ });
314
+ const requestBody = typeof body === "string" ? require_bufferUtils.encodeBuffer(body) : body;
315
+ const fetchRequest = this.toFetchApiRequest(requestBody);
316
+ this[kFetchRequest] = fetchRequest.clone();
317
+ /**
318
+ * @note Start request handling on the next tick so that the user
319
+ * could add event listeners for "loadend" before the interceptor fires it.
320
+ */
321
+ queueMicrotask(() => {
322
+ (this.onRequest?.call(this, {
323
+ request: fetchRequest,
324
+ requestId: this.requestId
325
+ }) || Promise.resolve()).finally(() => {
326
+ if (!this[kIsRequestHandled]) {
327
+ this.logger.info("request callback settled but request has not been handled (readystate %d), performing as-is...", this.request.readyState);
328
+ /**
329
+ * @note Set the intercepted request ID on the original request in Node.js
330
+ * so that if it triggers any other interceptors, they don't attempt
331
+ * to process it once again.
332
+ *
333
+ * For instance, XMLHttpRequest is often implemented via "http.ClientRequest"
334
+ * and we don't want for both XHR and ClientRequest interceptors to
335
+ * handle the same request at the same time (e.g. emit the "response" event twice).
336
+ */
337
+ if (IS_NODE) this.request.setRequestHeader(require_fetchUtils.INTERNAL_REQUEST_ID_HEADER_NAME, this.requestId);
338
+ return invoke();
339
+ }
340
+ });
341
+ });
342
+ break;
343
+ }
344
+ default: return invoke();
345
+ }
346
+ }
347
+ });
348
+ /**
349
+ * Proxy the `.upload` property to gather the event listeners/callbacks.
350
+ */
351
+ define(this.request, "upload", createProxy(this.request.upload, {
352
+ setProperty: ([propertyName, nextValue], invoke) => {
353
+ switch (propertyName) {
354
+ case "onloadstart":
355
+ case "onprogress":
356
+ case "onaboart":
357
+ case "onerror":
358
+ case "onload":
359
+ case "ontimeout":
360
+ case "onloadend": {
361
+ const eventName = propertyName.slice(2);
362
+ this.registerUploadEvent(eventName, nextValue);
363
+ }
364
+ }
365
+ return invoke();
366
+ },
367
+ methodCall: ([methodName, args], invoke) => {
368
+ switch (methodName) {
369
+ case "addEventListener": {
370
+ const [eventName, listener] = args;
371
+ this.registerUploadEvent(eventName, listener);
372
+ this.logger.info("upload.addEventListener", eventName, listener);
373
+ return invoke();
374
+ }
375
+ }
376
+ }
377
+ }));
378
+ }
379
+ registerEvent(eventName, listener) {
380
+ const nextEvents = (this.events.get(eventName) || []).concat(listener);
381
+ this.events.set(eventName, nextEvents);
382
+ this.logger.info("registered event \"%s\"", eventName, listener);
383
+ }
384
+ registerUploadEvent(eventName, listener) {
385
+ const nextEvents = (this.uploadEvents.get(eventName) || []).concat(listener);
386
+ this.uploadEvents.set(eventName, nextEvents);
387
+ this.logger.info("registered upload event \"%s\"", eventName, listener);
388
+ }
389
+ /**
390
+ * Responds to the current request with the given
391
+ * Fetch API `Response` instance.
392
+ */
393
+ async respondWith(response) {
394
+ /**
395
+ * @note Since `XMLHttpRequestController` delegates the handling of the responses
396
+ * to the "load" event listener that doesn't distinguish between the mocked and original
397
+ * responses, mark the request that had a mocked response with a corresponding symbol.
398
+ *
399
+ * Mark this request as having a mocked response immediately since
400
+ * calculating request/response total body length is asynchronous.
401
+ */
402
+ this[kIsRequestHandled] = true;
403
+ /**
404
+ * Dispatch request upload events for requests with a body.
405
+ * @see https://github.com/mswjs/interceptors/issues/573
406
+ */
407
+ if (this[kFetchRequest]) {
408
+ const totalRequestBodyLength = await getBodyByteLength(this[kFetchRequest]);
409
+ this.trigger("loadstart", this.request.upload, {
410
+ loaded: 0,
411
+ total: totalRequestBodyLength
412
+ });
413
+ this.trigger("progress", this.request.upload, {
414
+ loaded: totalRequestBodyLength,
415
+ total: totalRequestBodyLength
416
+ });
417
+ this.trigger("load", this.request.upload, {
418
+ loaded: totalRequestBodyLength,
419
+ total: totalRequestBodyLength
420
+ });
421
+ this.trigger("loadend", this.request.upload, {
422
+ loaded: totalRequestBodyLength,
423
+ total: totalRequestBodyLength
424
+ });
425
+ }
426
+ this.logger.info("responding with a mocked response: %d %s", response.status, response.statusText);
427
+ define(this.request, "status", response.status);
428
+ define(this.request, "statusText", response.statusText);
429
+ define(this.request, "responseURL", this.url.href);
430
+ this.request.getResponseHeader = new Proxy(this.request.getResponseHeader, { apply: (_, __, args) => {
431
+ this.logger.info("getResponseHeader", args[0]);
432
+ if (this.request.readyState < this.request.HEADERS_RECEIVED) {
433
+ this.logger.info("headers not received yet, returning null");
434
+ return null;
435
+ }
436
+ const headerValue = response.headers.get(args[0]);
437
+ this.logger.info("resolved response header \"%s\" to", args[0], headerValue);
438
+ return headerValue;
439
+ } });
440
+ this.request.getAllResponseHeaders = new Proxy(this.request.getAllResponseHeaders, { apply: () => {
441
+ this.logger.info("getAllResponseHeaders");
442
+ if (this.request.readyState < this.request.HEADERS_RECEIVED) {
443
+ this.logger.info("headers not received yet, returning empty string");
444
+ return "";
445
+ }
446
+ const allHeaders = Array.from(response.headers.entries()).map(([headerName, headerValue]) => {
447
+ return `${headerName}: ${headerValue}`;
448
+ }).join("\r\n");
449
+ this.logger.info("resolved all response headers to", allHeaders);
450
+ return allHeaders;
451
+ } });
452
+ Object.defineProperties(this.request, {
453
+ response: {
454
+ enumerable: true,
455
+ configurable: false,
456
+ get: () => this.response
457
+ },
458
+ responseText: {
459
+ enumerable: true,
460
+ configurable: false,
461
+ get: () => this.responseText
462
+ },
463
+ responseXML: {
464
+ enumerable: true,
465
+ configurable: false,
466
+ get: () => this.responseXML
467
+ }
468
+ });
469
+ const totalResponseBodyLength = await getBodyByteLength(response.clone());
470
+ this.logger.info("calculated response body length", totalResponseBodyLength);
471
+ this.trigger("loadstart", this.request, {
472
+ loaded: 0,
473
+ total: totalResponseBodyLength
474
+ });
475
+ this.setReadyState(this.request.HEADERS_RECEIVED);
476
+ this.setReadyState(this.request.LOADING);
477
+ const finalizeResponse = () => {
478
+ this.logger.info("finalizing the mocked response...");
479
+ this.setReadyState(this.request.DONE);
480
+ this.trigger("load", this.request, {
481
+ loaded: this.responseBuffer.byteLength,
482
+ total: totalResponseBodyLength
483
+ });
484
+ this.trigger("loadend", this.request, {
485
+ loaded: this.responseBuffer.byteLength,
486
+ total: totalResponseBodyLength
487
+ });
488
+ };
489
+ if (response.body) {
490
+ this.logger.info("mocked response has body, streaming...");
491
+ const reader = response.body.getReader();
492
+ const readNextResponseBodyChunk = async () => {
493
+ const { value, done } = await reader.read();
494
+ if (done) {
495
+ this.logger.info("response body stream done!");
496
+ finalizeResponse();
497
+ return;
498
+ }
499
+ if (value) {
500
+ this.logger.info("read response body chunk:", value);
501
+ this.responseBuffer = concatArrayBuffer(this.responseBuffer, value);
502
+ this.trigger("progress", this.request, {
503
+ loaded: this.responseBuffer.byteLength,
504
+ total: totalResponseBodyLength
505
+ });
506
+ }
507
+ readNextResponseBodyChunk();
508
+ };
509
+ readNextResponseBodyChunk();
510
+ } else finalizeResponse();
511
+ }
512
+ responseBufferToText() {
513
+ return require_bufferUtils.decodeBuffer(this.responseBuffer);
514
+ }
515
+ get response() {
516
+ this.logger.info("getResponse (responseType: %s)", this.request.responseType);
517
+ if (this.request.readyState !== this.request.DONE) return null;
518
+ switch (this.request.responseType) {
519
+ case "json": {
520
+ const responseJson = parseJson(this.responseBufferToText());
521
+ this.logger.info("resolved response JSON", responseJson);
522
+ return responseJson;
523
+ }
524
+ case "arraybuffer": {
525
+ const arrayBuffer = require_bufferUtils.toArrayBuffer(this.responseBuffer);
526
+ this.logger.info("resolved response ArrayBuffer", arrayBuffer);
527
+ return arrayBuffer;
528
+ }
529
+ case "blob": {
530
+ const mimeType = this.request.getResponseHeader("Content-Type") || "text/plain";
531
+ const responseBlob = new Blob([this.responseBufferToText()], { type: mimeType });
532
+ this.logger.info("resolved response Blob (mime type: %s)", responseBlob, mimeType);
533
+ return responseBlob;
534
+ }
535
+ default: {
536
+ const responseText = this.responseBufferToText();
537
+ this.logger.info("resolving \"%s\" response type as text", this.request.responseType, responseText);
538
+ return responseText;
539
+ }
540
+ }
541
+ }
542
+ get responseText() {
543
+ /**
544
+ * Throw when trying to read the response body as text when the
545
+ * "responseType" doesn't expect text. This just respects the spec better.
546
+ * @see https://xhr.spec.whatwg.org/#the-responsetext-attribute
547
+ */
548
+ (0, outvariant.invariant)(this.request.responseType === "" || this.request.responseType === "text", "InvalidStateError: The object is in invalid state.");
549
+ if (this.request.readyState !== this.request.LOADING && this.request.readyState !== this.request.DONE) return "";
550
+ const responseText = this.responseBufferToText();
551
+ this.logger.info("getResponseText: \"%s\"", responseText);
552
+ return responseText;
553
+ }
554
+ get responseXML() {
555
+ (0, outvariant.invariant)(this.request.responseType === "" || this.request.responseType === "document", "InvalidStateError: The object is in invalid state.");
556
+ if (this.request.readyState !== this.request.DONE) return null;
557
+ const contentType = this.request.getResponseHeader("Content-Type") || "";
558
+ if (typeof DOMParser === "undefined") {
559
+ console.warn("Cannot retrieve XMLHttpRequest response body as XML: DOMParser is not defined. You are likely using an environment that is not browser or does not polyfill browser globals correctly.");
560
+ return null;
561
+ }
562
+ if (isDomParserSupportedType(contentType)) return new DOMParser().parseFromString(this.responseBufferToText(), contentType);
563
+ return null;
564
+ }
565
+ errorWith(error) {
566
+ /**
567
+ * @note Mark this request as handled even if it received a mock error.
568
+ * This prevents the controller from trying to perform this request as-is.
569
+ */
570
+ this[kIsRequestHandled] = true;
571
+ this.logger.info("responding with an error");
572
+ this.setReadyState(this.request.DONE);
573
+ this.trigger("error", this.request);
574
+ this.trigger("loadend", this.request);
575
+ }
576
+ /**
577
+ * Transitions this request's `readyState` to the given one.
578
+ */
579
+ setReadyState(nextReadyState) {
580
+ this.logger.info("setReadyState: %d -> %d", this.request.readyState, nextReadyState);
581
+ if (this.request.readyState === nextReadyState) {
582
+ this.logger.info("ready state identical, skipping transition...");
583
+ return;
584
+ }
585
+ define(this.request, "readyState", nextReadyState);
586
+ this.logger.info("set readyState to: %d", nextReadyState);
587
+ if (nextReadyState !== this.request.UNSENT) {
588
+ this.logger.info("triggering \"readystatechange\" event...");
589
+ this.trigger("readystatechange", this.request);
590
+ }
591
+ }
592
+ /**
593
+ * Triggers given event on the `XMLHttpRequest` instance.
594
+ */
595
+ trigger(eventName, target, options) {
596
+ const callback = target[`on${eventName}`];
597
+ const event = createEvent(target, eventName, options);
598
+ this.logger.info("trigger \"%s\"", eventName, options || "");
599
+ if (typeof callback === "function") {
600
+ this.logger.info("found a direct \"%s\" callback, calling...", eventName);
601
+ callback.call(target, event);
602
+ }
603
+ const events = target instanceof XMLHttpRequestUpload ? this.uploadEvents : this.events;
604
+ for (const [registeredEventName, listeners] of events) if (registeredEventName === eventName) {
605
+ this.logger.info("found %d listener(s) for \"%s\" event, calling...", listeners.length, eventName);
606
+ listeners.forEach((listener) => listener.call(target, event));
607
+ }
608
+ }
609
+ /**
610
+ * Converts this `XMLHttpRequest` instance into a Fetch API `Request` instance.
611
+ */
612
+ toFetchApiRequest(body) {
613
+ this.logger.info("converting request to a Fetch API Request...");
614
+ const resolvedBody = body instanceof Document ? body.documentElement.innerText : body;
615
+ const fetchRequest = new Request(this.url.href, {
616
+ method: this.method,
617
+ headers: this.requestHeaders,
618
+ credentials: this.request.withCredentials ? "include" : "same-origin",
619
+ body: ["GET", "HEAD"].includes(this.method.toUpperCase()) ? null : resolvedBody
620
+ });
621
+ define(fetchRequest, "headers", createProxy(fetchRequest.headers, { methodCall: ([methodName, args], invoke) => {
622
+ switch (methodName) {
623
+ case "append":
624
+ case "set": {
625
+ const [headerName, headerValue] = args;
626
+ this.request.setRequestHeader(headerName, headerValue);
627
+ break;
628
+ }
629
+ case "delete": {
630
+ const [headerName] = args;
631
+ console.warn(`XMLHttpRequest: Cannot remove a "${headerName}" header from the Fetch API representation of the "${fetchRequest.method} ${fetchRequest.url}" request. XMLHttpRequest headers cannot be removed.`);
632
+ break;
633
+ }
634
+ }
635
+ return invoke();
636
+ } }));
637
+ require_getRawRequest.setRawRequest(fetchRequest, this.request);
638
+ this.logger.info("converted request to a Fetch API Request!", fetchRequest);
639
+ return fetchRequest;
640
+ }
641
+ };
642
+ function toAbsoluteUrl(url) {
643
+ /**
644
+ * @note XMLHttpRequest interceptor may run in environments
645
+ * that implement XMLHttpRequest but don't implement "location"
646
+ * (for example, React Native). If that's the case, return the
647
+ * input URL as-is (nothing to be relative to).
648
+ * @see https://github.com/mswjs/msw/issues/1777
649
+ */
650
+ if (typeof location === "undefined") return new URL(url);
651
+ return new URL(url.toString(), location.href);
652
+ }
653
+ function define(target, property, value) {
654
+ Reflect.defineProperty(target, property, {
655
+ writable: true,
656
+ enumerable: true,
657
+ value
658
+ });
659
+ }
660
+
661
+ //#endregion
662
+ //#region src/interceptors/XMLHttpRequest/XMLHttpRequestProxy.ts
663
+ /**
664
+ * Create a proxied `XMLHttpRequest` class.
665
+ * The proxied class establishes spies on certain methods,
666
+ * allowing us to intercept requests and respond to them.
667
+ */
668
+ function createXMLHttpRequestProxy({ emitter, logger }) {
669
+ return new Proxy(globalThis.XMLHttpRequest, { construct(target, args, newTarget) {
670
+ logger.info("constructed new XMLHttpRequest");
671
+ const originalRequest = Reflect.construct(target, args, newTarget);
672
+ /**
673
+ * @note Forward prototype descriptors onto the proxied object.
674
+ * XMLHttpRequest is implemented in JSDOM in a way that assigns
675
+ * a bunch of descriptors, like "set responseType()" on the prototype.
676
+ * With this propagation, we make sure that those descriptors trigger
677
+ * when the user operates with the proxied request instance.
678
+ */
679
+ const prototypeDescriptors = Object.getOwnPropertyDescriptors(target.prototype);
680
+ for (const propertyName in prototypeDescriptors) Reflect.defineProperty(originalRequest, propertyName, prototypeDescriptors[propertyName]);
681
+ const xhrRequestController = new XMLHttpRequestController(originalRequest, logger);
682
+ xhrRequestController.onRequest = async function({ request, requestId }) {
683
+ const controller = new require_fetchUtils.RequestController(request, {
684
+ passthrough: () => {
685
+ this.logger.info("no mocked response received, performing request as-is...");
686
+ },
687
+ respondWith: async (response) => {
688
+ if (require_handleRequest.isResponseError(response)) {
689
+ this.errorWith(/* @__PURE__ */ new TypeError("Network error"));
690
+ return;
691
+ }
692
+ await this.respondWith(response);
693
+ },
694
+ errorWith: (reason) => {
695
+ this.logger.info("request errored!", { error: reason });
696
+ if (reason instanceof Error) this.errorWith(reason);
697
+ }
698
+ });
699
+ this.logger.info("awaiting mocked response...");
700
+ this.logger.info("emitting the \"request\" event for %s listener(s)...", emitter.listenerCount("request"));
701
+ await require_handleRequest.handleRequest({
702
+ request,
703
+ requestId,
704
+ controller,
705
+ emitter
706
+ });
707
+ };
708
+ xhrRequestController.onResponse = async function({ response, isMockedResponse, request, requestId }) {
709
+ this.logger.info("emitting the \"response\" event for %s listener(s)...", emitter.listenerCount("response"));
710
+ emitter.emit("response", {
711
+ response,
712
+ isMockedResponse,
713
+ request,
714
+ requestId
715
+ });
716
+ };
717
+ return xhrRequestController.request;
718
+ } });
719
+ }
720
+
721
+ //#endregion
722
+ //#region src/interceptors/XMLHttpRequest/index.ts
723
+ var XMLHttpRequestInterceptor = class XMLHttpRequestInterceptor extends require_fetchUtils.Interceptor {
724
+ static {
725
+ this.interceptorSymbol = Symbol("xhr");
726
+ }
727
+ constructor() {
728
+ super(XMLHttpRequestInterceptor.interceptorSymbol);
729
+ }
730
+ checkEnvironment() {
731
+ return require_hasConfigurableGlobal.hasConfigurableGlobal("XMLHttpRequest");
732
+ }
733
+ setup() {
734
+ const logger = this.logger.extend("setup");
735
+ logger.info("patching \"XMLHttpRequest\" module...");
736
+ const PureXMLHttpRequest = globalThis.XMLHttpRequest;
737
+ (0, outvariant.invariant)(!PureXMLHttpRequest[require_glossary.IS_PATCHED_MODULE], "Failed to patch the \"XMLHttpRequest\" module: already patched.");
738
+ globalThis.XMLHttpRequest = createXMLHttpRequestProxy({
739
+ emitter: this.emitter,
740
+ logger: this.logger
741
+ });
742
+ logger.info("native \"XMLHttpRequest\" module patched!", globalThis.XMLHttpRequest.name);
743
+ Object.defineProperty(globalThis.XMLHttpRequest, require_glossary.IS_PATCHED_MODULE, {
744
+ enumerable: true,
745
+ configurable: true,
746
+ value: true
747
+ });
748
+ this.subscriptions.push(() => {
749
+ Object.defineProperty(globalThis.XMLHttpRequest, require_glossary.IS_PATCHED_MODULE, { value: void 0 });
750
+ globalThis.XMLHttpRequest = PureXMLHttpRequest;
751
+ logger.info("native \"XMLHttpRequest\" module restored!", globalThis.XMLHttpRequest.name);
752
+ });
753
+ }
754
+ };
755
+
756
+ //#endregion
757
+ Object.defineProperty(exports, 'XMLHttpRequestInterceptor', {
758
+ enumerable: true,
759
+ get: function () {
760
+ return XMLHttpRequestInterceptor;
761
+ }
762
+ });
763
+ //# sourceMappingURL=XMLHttpRequest-B7kJdYYI.cjs.map