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