@mswjs/interceptors 0.41.9 → 0.42.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 (335) hide show
  1. package/README.md +274 -228
  2. package/lib/browser/{bufferUtils-BiiO6HZv.mjs → buffer-utils-DJj7YzLG.js} +3 -3
  3. package/lib/browser/buffer-utils-DJj7YzLG.js.map +1 -0
  4. package/lib/browser/create-request-id-DlEd4GOA.js +184 -0
  5. package/lib/browser/create-request-id-DlEd4GOA.js.map +1 -0
  6. package/lib/browser/{getRawRequest-B1BqgWG6.mjs → fetch-utils-zxA_SD66.js} +123 -52
  7. package/lib/browser/fetch-utils-zxA_SD66.js.map +1 -0
  8. package/lib/browser/handle-request-CIOa9O-N.js +167 -0
  9. package/lib/browser/handle-request-CIOa9O-N.js.map +1 -0
  10. package/lib/{node/hasConfigurableGlobal-BiTmog1u.mjs → browser/has-configurable-global-Cew-dYqk.js} +5 -7
  11. package/lib/browser/has-configurable-global-Cew-dYqk.js.map +1 -0
  12. package/lib/browser/http-CB9rQ7i_.d.ts +105 -0
  13. package/lib/browser/{index.d.cts → index.d.ts} +33 -38
  14. package/lib/browser/index.js +130 -0
  15. package/lib/browser/index.js.map +1 -0
  16. package/lib/browser/interceptor-dtJZ_9QT.d.ts +50 -0
  17. package/lib/browser/interceptors/WebSocket/index.d.ts +2 -0
  18. package/lib/browser/interceptors/WebSocket/{index.mjs → index.js} +39 -30
  19. package/lib/browser/interceptors/WebSocket/index.js.map +1 -0
  20. package/lib/browser/interceptors/XMLHttpRequest/web.d.ts +11 -0
  21. package/lib/browser/interceptors/XMLHttpRequest/web.js +2 -0
  22. package/lib/browser/interceptors/fetch/web.d.ts +14 -0
  23. package/lib/browser/interceptors/fetch/web.js +2 -0
  24. package/lib/browser/presets/browser.d.ts +11 -0
  25. package/lib/browser/presets/browser.js +12 -0
  26. package/lib/browser/presets/browser.js.map +1 -0
  27. package/lib/browser/{resolveWebSocketUrl-C83-x9iE.mjs → resolve-web-socket-url-CSvNPLGi.js} +3 -3
  28. package/lib/browser/resolve-web-socket-url-CSvNPLGi.js.map +1 -0
  29. package/lib/browser/web-BjVDkiX0.js +248 -0
  30. package/lib/browser/web-BjVDkiX0.js.map +1 -0
  31. package/lib/browser/{XMLHttpRequest-DrZAf3w6.mjs → web-C2oKsT3Q.js} +327 -255
  32. package/lib/browser/web-C2oKsT3Q.js.map +1 -0
  33. package/lib/browser/{interceptors/WebSocket/index.d.cts → websocket-CC0nB0md.d.ts} +41 -33
  34. package/lib/node/batch-interceptor-ByEZVih3.js +119 -0
  35. package/lib/node/batch-interceptor-ByEZVih3.js.map +1 -0
  36. package/lib/node/batch-interceptor-CPjFK2td.d.ts +28 -0
  37. package/lib/node/buffer-utils-BvPY1Tc-.js +187 -0
  38. package/lib/node/buffer-utils-BvPY1Tc-.js.map +1 -0
  39. package/lib/node/fetch-utils-Dw1PsmtX.js +568 -0
  40. package/lib/node/fetch-utils-Dw1PsmtX.js.map +1 -0
  41. package/lib/node/has-configurable-global-CJCh_g1I.js +22 -0
  42. package/lib/node/has-configurable-global-CJCh_g1I.js.map +1 -0
  43. package/lib/node/http-CB9rQ7i_.d.ts +105 -0
  44. package/lib/{browser/interceptors/WebSocket/index.d.mts → node/index.d.ts} +120 -60
  45. package/lib/node/{index.mjs → index.js} +8 -11
  46. package/lib/node/index.js.map +1 -0
  47. package/lib/node/interceptor-dtJZ_9QT.d.ts +50 -0
  48. package/lib/node/interceptors/ClientRequest/index.d.ts +14 -0
  49. package/lib/node/interceptors/ClientRequest/index.js +67 -0
  50. package/lib/node/interceptors/ClientRequest/index.js.map +1 -0
  51. package/lib/node/interceptors/XMLHttpRequest/node.d.ts +12 -0
  52. package/lib/node/interceptors/XMLHttpRequest/node.js +74 -0
  53. package/lib/node/interceptors/XMLHttpRequest/node.js.map +1 -0
  54. package/lib/node/interceptors/fetch/node.d.ts +18 -0
  55. package/lib/node/interceptors/fetch/node.js +83 -0
  56. package/lib/node/interceptors/fetch/node.js.map +1 -0
  57. package/lib/node/interceptors/http/index.d.ts +14 -0
  58. package/lib/node/interceptors/http/index.js +32 -0
  59. package/lib/node/interceptors/http/index.js.map +1 -0
  60. package/lib/node/interceptors/net/index.d.ts +203 -0
  61. package/lib/node/interceptors/net/index.js +2 -0
  62. package/lib/node/llhttp/constants.cjs +485 -0
  63. package/lib/node/llhttp/constants.d.cts +957 -0
  64. package/lib/node/llhttp/llhttp.wasm +0 -0
  65. package/lib/node/net-DtMnyEeg.js +1388 -0
  66. package/lib/node/net-DtMnyEeg.js.map +1 -0
  67. package/lib/node/presets/node.d.ts +12 -0
  68. package/lib/node/presets/node.js +17 -0
  69. package/lib/node/presets/node.js.map +1 -0
  70. package/lib/node/{RemoteHttpInterceptor.d.cts → remote-http-interceptor.d.ts} +12 -11
  71. package/lib/node/{RemoteHttpInterceptor.mjs → remote-http-interceptor.js} +38 -33
  72. package/lib/node/remote-http-interceptor.js.map +1 -0
  73. package/lib/node/source-lP0yyEtA.js +1990 -0
  74. package/lib/node/source-lP0yyEtA.js.map +1 -0
  75. package/package.json +79 -118
  76. package/src/batch-interceptor.test.ts +475 -0
  77. package/src/batch-interceptor.ts +244 -0
  78. package/src/{createRequestId.test.ts → create-request-id.test.ts} +1 -2
  79. package/src/disposable.ts +13 -0
  80. package/src/events/http.ts +92 -0
  81. package/src/events/websocket.ts +47 -0
  82. package/src/glossary.ts +1 -27
  83. package/src/index.ts +18 -10
  84. package/src/interceptor.test.ts +279 -0
  85. package/src/interceptor.ts +139 -0
  86. package/src/interceptors/ClientRequest/index.test.ts +21 -39
  87. package/src/interceptors/ClientRequest/index.ts +64 -179
  88. package/src/interceptors/ClientRequest/utils/{recordRawHeaders.test.ts → record-raw-headers.test.ts} +1 -2
  89. package/src/interceptors/ClientRequest/utils/{recordRawHeaders.ts → record-raw-headers.ts} +29 -2
  90. package/src/interceptors/WebSocket/index.ts +33 -50
  91. package/src/interceptors/WebSocket/utils/{bindEvent.test.ts → bind-event.test.ts} +1 -2
  92. package/src/interceptors/WebSocket/utils/events.test.ts +0 -1
  93. package/src/interceptors/WebSocket/{WebSocketClassTransport.ts → web-socket-class-transport.ts} +3 -3
  94. package/src/interceptors/WebSocket/{WebSocketClientConnection.ts → web-socket-client-connection.ts} +4 -4
  95. package/src/interceptors/WebSocket/{WebSocketOverride.ts → web-socket-override.ts} +6 -7
  96. package/src/interceptors/WebSocket/{WebSocketServerConnection.ts → web-socket-server-connection.ts} +4 -4
  97. package/src/interceptors/WebSocket/{WebSocketTransport.ts → web-socket-transport.ts} +1 -1
  98. package/src/interceptors/XMLHttpRequest/node.ts +104 -0
  99. package/src/interceptors/XMLHttpRequest/polyfills/{ProgressEventPolyfill.ts → progress-event-polyfill.ts} +1 -1
  100. package/src/interceptors/XMLHttpRequest/utils/{concateArrayBuffer.test.ts → concat-array-buffer.test.ts} +1 -2
  101. package/src/interceptors/XMLHttpRequest/utils/{concatArrayBuffer.ts → concat-array-buffer.ts} +1 -1
  102. package/src/interceptors/XMLHttpRequest/utils/{createEvent.test.ts → create-event.test.ts} +3 -4
  103. package/src/interceptors/XMLHttpRequest/utils/{createEvent.ts → create-event.ts} +2 -2
  104. package/src/interceptors/XMLHttpRequest/utils/{createResponse.ts → create-response.ts} +1 -1
  105. package/src/interceptors/XMLHttpRequest/utils/{getBodyByteLength.test.ts → get-body-byte-length.test.ts} +1 -2
  106. package/src/interceptors/XMLHttpRequest/web.ts +34 -0
  107. package/src/interceptors/XMLHttpRequest/{XMLHttpRequestController.ts → xml-http-request-controller.ts} +363 -204
  108. package/src/interceptors/XMLHttpRequest/{XMLHttpRequestProxy.ts → xml-http-request-proxy.ts} +28 -25
  109. package/src/interceptors/fetch/node.ts +103 -0
  110. package/src/interceptors/fetch/utils/{followRedirect.ts → follow-redirect.ts} +1 -1
  111. package/src/interceptors/fetch/web.ts +217 -0
  112. package/src/interceptors/http/forward-events.test.ts +86 -0
  113. package/src/interceptors/http/forward-events.ts +139 -0
  114. package/src/interceptors/http/http-parser/index.ts +310 -0
  115. package/src/interceptors/http/http-parser/llhttp/constants.cjs +485 -0
  116. package/src/interceptors/http/http-parser/llhttp/constants.d.cts +957 -0
  117. package/src/interceptors/http/http-parser/llhttp/llhttp.wasm +0 -0
  118. package/src/interceptors/http/http-parser.ts +138 -0
  119. package/src/interceptors/http/index.ts +34 -0
  120. package/src/interceptors/http/source.ts +688 -0
  121. package/src/interceptors/net/index.ts +368 -0
  122. package/src/interceptors/net/socket-controller.ts +1476 -0
  123. package/src/interceptors/net/utils/address-info.ts +54 -0
  124. package/src/interceptors/net/utils/connection-options-to-url.ts +56 -0
  125. package/src/interceptors/net/utils/flush-writes.ts +57 -0
  126. package/src/interceptors/net/utils/get-tls-connect-options.ts +23 -0
  127. package/src/interceptors/net/utils/normalize-net-connect-args.test.ts +233 -0
  128. package/src/interceptors/net/utils/normalize-net-connect-args.ts +121 -0
  129. package/src/interceptors/net/utils/normalize-tls-connect-args.ts +50 -0
  130. package/src/presets/browser.ts +4 -4
  131. package/src/presets/node.ts +4 -4
  132. package/src/{RemoteHttpInterceptor.ts → remote-http-interceptor.ts} +55 -42
  133. package/src/request-context.ts +40 -0
  134. package/src/{RequestController.test.ts → request-controller.test.ts} +37 -3
  135. package/src/{RequestController.ts → request-controller.ts} +33 -11
  136. package/src/utils/{bufferUtils.test.ts → buffer-utils.test.ts} +1 -2
  137. package/src/utils/buffer-utils.ts +37 -0
  138. package/src/utils/{cloneObject.test.ts → clone-object.test.ts} +1 -2
  139. package/src/utils/{cloneObject.ts → clone-object.ts} +8 -8
  140. package/src/utils/{createProxy.test.ts → create-proxy.test.ts} +6 -4
  141. package/src/utils/{createProxy.ts → create-proxy.ts} +1 -1
  142. package/src/utils/{fetchUtils.test.ts → fetch-utils.test.ts} +1 -1
  143. package/src/utils/{fetchUtils.ts → fetch-utils.ts} +28 -3
  144. package/src/utils/{findPropertySource.test.ts → find-property-source.test.ts} +1 -2
  145. package/src/utils/{getCleanUrl.test.ts → get-clean-url.test.ts} +1 -2
  146. package/src/utils/{getUrlByRequestOptions.test.ts → get-url-by-request-options.test.ts} +4 -8
  147. package/src/utils/{getUrlByRequestOptions.ts → get-url-by-request-options.ts} +16 -16
  148. package/src/utils/{getValueBySymbol.test.ts → get-value-by-symbol.test.ts} +1 -2
  149. package/src/utils/{handleRequest.ts → handle-request.ts} +61 -41
  150. package/src/utils/{hasConfigurableGlobal.test.ts → has-configurable-global.test.ts} +1 -2
  151. package/src/utils/{hasConfigurableGlobal.ts → has-configurable-global.ts} +2 -4
  152. package/src/utils/{isObject.test.ts → is-object.test.ts} +1 -2
  153. package/src/utils/logger.test.ts +154 -0
  154. package/src/utils/logger.ts +154 -0
  155. package/src/utils/{parseJson.test.ts → parse-json.test.ts} +1 -2
  156. package/src/utils/{patchesRegistry.test.ts → patches-registry.test.ts} +1 -1
  157. package/src/utils/{patchesRegistry.ts → patches-registry.ts} +1 -1
  158. package/src/utils/{responseUtils.ts → response-utils.ts} +25 -2
  159. package/ClientRequest/package.json +0 -11
  160. package/RemoteHttpInterceptor/package.json +0 -11
  161. package/WebSocket/package.json +0 -12
  162. package/XMLHttpRequest/package.json +0 -12
  163. package/fetch/package.json +0 -12
  164. package/lib/browser/Interceptor-Deczogc8.d.cts +0 -65
  165. package/lib/browser/Interceptor-gqKgs-aF.d.mts +0 -65
  166. package/lib/browser/XMLHttpRequest-DrZAf3w6.mjs.map +0 -1
  167. package/lib/browser/XMLHttpRequest-gXuzzX1g.cjs +0 -751
  168. package/lib/browser/XMLHttpRequest-gXuzzX1g.cjs.map +0 -1
  169. package/lib/browser/bufferUtils-BiiO6HZv.mjs.map +0 -1
  170. package/lib/browser/bufferUtils-Uc0eRItL.cjs +0 -38
  171. package/lib/browser/bufferUtils-Uc0eRItL.cjs.map +0 -1
  172. package/lib/browser/createRequestId-DOf8Ktjs.cjs +0 -205
  173. package/lib/browser/createRequestId-DOf8Ktjs.cjs.map +0 -1
  174. package/lib/browser/createRequestId-DYCsFHOi.mjs +0 -170
  175. package/lib/browser/createRequestId-DYCsFHOi.mjs.map +0 -1
  176. package/lib/browser/fetch-5IMPqr9e.mjs +0 -236
  177. package/lib/browser/fetch-5IMPqr9e.mjs.map +0 -1
  178. package/lib/browser/fetch-Bt9rMY9c.cjs +0 -241
  179. package/lib/browser/fetch-Bt9rMY9c.cjs.map +0 -1
  180. package/lib/browser/getRawRequest-B1BqgWG6.mjs.map +0 -1
  181. package/lib/browser/getRawRequest-DdfaiPVH.cjs +0 -376
  182. package/lib/browser/getRawRequest-DdfaiPVH.cjs.map +0 -1
  183. package/lib/browser/glossary-1lhZx6Aw.d.cts +0 -69
  184. package/lib/browser/glossary-nkHWcwvY.d.mts +0 -69
  185. package/lib/browser/handleRequest-CJim54xG.cjs +0 -191
  186. package/lib/browser/handleRequest-CJim54xG.cjs.map +0 -1
  187. package/lib/browser/handleRequest-CPPgsG7s.mjs +0 -180
  188. package/lib/browser/handleRequest-CPPgsG7s.mjs.map +0 -1
  189. package/lib/browser/hasConfigurableGlobal-C8zq1MCg.mjs +0 -109
  190. package/lib/browser/hasConfigurableGlobal-C8zq1MCg.mjs.map +0 -1
  191. package/lib/browser/hasConfigurableGlobal-CS7adEvV.cjs +0 -126
  192. package/lib/browser/hasConfigurableGlobal-CS7adEvV.cjs.map +0 -1
  193. package/lib/browser/index.cjs +0 -70
  194. package/lib/browser/index.cjs.map +0 -1
  195. package/lib/browser/index.d.mts +0 -125
  196. package/lib/browser/index.mjs +0 -56
  197. package/lib/browser/index.mjs.map +0 -1
  198. package/lib/browser/interceptors/WebSocket/index.cjs +0 -618
  199. package/lib/browser/interceptors/WebSocket/index.cjs.map +0 -1
  200. package/lib/browser/interceptors/WebSocket/index.mjs.map +0 -1
  201. package/lib/browser/interceptors/XMLHttpRequest/index.cjs +0 -8
  202. package/lib/browser/interceptors/XMLHttpRequest/index.d.cts +0 -15
  203. package/lib/browser/interceptors/XMLHttpRequest/index.d.mts +0 -15
  204. package/lib/browser/interceptors/XMLHttpRequest/index.mjs +0 -8
  205. package/lib/browser/interceptors/fetch/index.cjs +0 -7
  206. package/lib/browser/interceptors/fetch/index.d.cts +0 -13
  207. package/lib/browser/interceptors/fetch/index.d.mts +0 -13
  208. package/lib/browser/interceptors/fetch/index.mjs +0 -7
  209. package/lib/browser/presets/browser.cjs +0 -18
  210. package/lib/browser/presets/browser.cjs.map +0 -1
  211. package/lib/browser/presets/browser.d.cts +0 -12
  212. package/lib/browser/presets/browser.d.mts +0 -14
  213. package/lib/browser/presets/browser.mjs +0 -18
  214. package/lib/browser/presets/browser.mjs.map +0 -1
  215. package/lib/browser/resolveWebSocketUrl-6K6EgqsA.cjs +0 -31
  216. package/lib/browser/resolveWebSocketUrl-6K6EgqsA.cjs.map +0 -1
  217. package/lib/browser/resolveWebSocketUrl-C83-x9iE.mjs.map +0 -1
  218. package/lib/node/BatchInterceptor-BGhH8z1z.cjs +0 -49
  219. package/lib/node/BatchInterceptor-BGhH8z1z.cjs.map +0 -1
  220. package/lib/node/BatchInterceptor-C4-RX5rg.mjs +0 -44
  221. package/lib/node/BatchInterceptor-C4-RX5rg.mjs.map +0 -1
  222. package/lib/node/BatchInterceptor-KKF8Q47I.d.cts +0 -26
  223. package/lib/node/BatchInterceptor-rSr-NH_H.d.mts +0 -26
  224. package/lib/node/ClientRequest-2loAH7xM.cjs +0 -1058
  225. package/lib/node/ClientRequest-2loAH7xM.cjs.map +0 -1
  226. package/lib/node/ClientRequest-DGhBX21V.mjs +0 -1049
  227. package/lib/node/ClientRequest-DGhBX21V.mjs.map +0 -1
  228. package/lib/node/Interceptor-BsZ21ue0.d.cts +0 -132
  229. package/lib/node/Interceptor-soD-WpQO.d.mts +0 -132
  230. package/lib/node/RemoteHttpInterceptor.cjs +0 -155
  231. package/lib/node/RemoteHttpInterceptor.cjs.map +0 -1
  232. package/lib/node/RemoteHttpInterceptor.d.mts +0 -39
  233. package/lib/node/RemoteHttpInterceptor.mjs.map +0 -1
  234. package/lib/node/XMLHttpRequest-BtDNZipW.cjs +0 -752
  235. package/lib/node/XMLHttpRequest-BtDNZipW.cjs.map +0 -1
  236. package/lib/node/XMLHttpRequest-Dw6Wm-UU.mjs +0 -746
  237. package/lib/node/XMLHttpRequest-Dw6Wm-UU.mjs.map +0 -1
  238. package/lib/node/bufferUtils-DxPxwff_.mjs +0 -20
  239. package/lib/node/bufferUtils-DxPxwff_.mjs.map +0 -1
  240. package/lib/node/bufferUtils-S5_-2eN4.cjs +0 -38
  241. package/lib/node/bufferUtils-S5_-2eN4.cjs.map +0 -1
  242. package/lib/node/chunk-CbDLau6x.cjs +0 -34
  243. package/lib/node/fetch-CaC3rGEu.mjs +0 -252
  244. package/lib/node/fetch-CaC3rGEu.mjs.map +0 -1
  245. package/lib/node/fetch-D2ClLNN-.cjs +0 -259
  246. package/lib/node/fetch-D2ClLNN-.cjs.map +0 -1
  247. package/lib/node/fetchUtils-BKJ1XmiO.mjs +0 -480
  248. package/lib/node/fetchUtils-BKJ1XmiO.mjs.map +0 -1
  249. package/lib/node/fetchUtils-umV5xXBy.cjs +0 -546
  250. package/lib/node/fetchUtils-umV5xXBy.cjs.map +0 -1
  251. package/lib/node/getRawRequest-B6znU6il.cjs +0 -36
  252. package/lib/node/getRawRequest-B6znU6il.cjs.map +0 -1
  253. package/lib/node/getRawRequest-C2-1urzA.mjs +0 -24
  254. package/lib/node/getRawRequest-C2-1urzA.mjs.map +0 -1
  255. package/lib/node/handleRequest-C-cKYjIh.cjs +0 -222
  256. package/lib/node/handleRequest-C-cKYjIh.cjs.map +0 -1
  257. package/lib/node/handleRequest-FIQv5pwH.mjs +0 -192
  258. package/lib/node/handleRequest-FIQv5pwH.mjs.map +0 -1
  259. package/lib/node/hasConfigurableGlobal-BiTmog1u.mjs.map +0 -1
  260. package/lib/node/hasConfigurableGlobal-MjY06_Ok.cjs +0 -108
  261. package/lib/node/hasConfigurableGlobal-MjY06_Ok.cjs.map +0 -1
  262. package/lib/node/index-BJ5E5aW-.d.cts +0 -113
  263. package/lib/node/index-DfoF45ih.d.mts +0 -113
  264. package/lib/node/index.cjs +0 -53
  265. package/lib/node/index.cjs.map +0 -1
  266. package/lib/node/index.d.cts +0 -104
  267. package/lib/node/index.d.mts +0 -104
  268. package/lib/node/index.mjs.map +0 -1
  269. package/lib/node/interceptors/ClientRequest/index.cjs +0 -6
  270. package/lib/node/interceptors/ClientRequest/index.d.cts +0 -2
  271. package/lib/node/interceptors/ClientRequest/index.d.mts +0 -3
  272. package/lib/node/interceptors/ClientRequest/index.mjs +0 -6
  273. package/lib/node/interceptors/XMLHttpRequest/index.cjs +0 -7
  274. package/lib/node/interceptors/XMLHttpRequest/index.d.cts +0 -14
  275. package/lib/node/interceptors/XMLHttpRequest/index.d.mts +0 -14
  276. package/lib/node/interceptors/XMLHttpRequest/index.mjs +0 -7
  277. package/lib/node/interceptors/fetch/index.cjs +0 -6
  278. package/lib/node/interceptors/fetch/index.d.cts +0 -12
  279. package/lib/node/interceptors/fetch/index.d.mts +0 -12
  280. package/lib/node/interceptors/fetch/index.mjs +0 -6
  281. package/lib/node/node-DIKcnzhK.cjs +0 -39
  282. package/lib/node/node-DIKcnzhK.cjs.map +0 -1
  283. package/lib/node/node-lsdNwZEW.mjs +0 -27
  284. package/lib/node/node-lsdNwZEW.mjs.map +0 -1
  285. package/lib/node/presets/node.cjs +0 -23
  286. package/lib/node/presets/node.cjs.map +0 -1
  287. package/lib/node/presets/node.d.cts +0 -13
  288. package/lib/node/presets/node.d.mts +0 -15
  289. package/lib/node/presets/node.mjs +0 -23
  290. package/lib/node/presets/node.mjs.map +0 -1
  291. package/lib/node/utils/node/index.cjs +0 -4
  292. package/lib/node/utils/node/index.d.cts +0 -16
  293. package/lib/node/utils/node/index.d.mts +0 -16
  294. package/lib/node/utils/node/index.mjs +0 -3
  295. package/presets/browser/package.json +0 -5
  296. package/presets/node/package.json +0 -11
  297. package/src/BatchInterceptor.test.ts +0 -255
  298. package/src/BatchInterceptor.ts +0 -96
  299. package/src/Interceptor.test.ts +0 -205
  300. package/src/Interceptor.ts +0 -249
  301. package/src/getRawRequest.ts +0 -21
  302. package/src/interceptors/ClientRequest/MockHttpSocket.ts +0 -724
  303. package/src/interceptors/ClientRequest/agents.ts +0 -110
  304. package/src/interceptors/ClientRequest/utils/getIncomingMessageBody.test.ts +0 -54
  305. package/src/interceptors/ClientRequest/utils/getIncomingMessageBody.ts +0 -45
  306. package/src/interceptors/ClientRequest/utils/normalizeClientRequestArgs.test.ts +0 -427
  307. package/src/interceptors/ClientRequest/utils/normalizeClientRequestArgs.ts +0 -268
  308. package/src/interceptors/ClientRequest/utils/parserUtils.ts +0 -48
  309. package/src/interceptors/Socket/MockSocket.test.ts +0 -264
  310. package/src/interceptors/Socket/MockSocket.ts +0 -58
  311. package/src/interceptors/Socket/utils/baseUrlFromConnectionOptions.ts +0 -26
  312. package/src/interceptors/Socket/utils/normalizeSocketWriteArgs.test.ts +0 -52
  313. package/src/interceptors/Socket/utils/normalizeSocketWriteArgs.ts +0 -33
  314. package/src/interceptors/XMLHttpRequest/index.ts +0 -40
  315. package/src/interceptors/fetch/index.ts +0 -203
  316. package/src/utils/bufferUtils.ts +0 -22
  317. package/src/utils/canParseUrl.ts +0 -13
  318. package/src/utils/emitAsync.ts +0 -25
  319. package/src/utils/nextTick.ts +0 -11
  320. package/src/utils/node/index.ts +0 -39
  321. /package/src/{createRequestId.ts → create-request-id.ts} +0 -0
  322. /package/src/{InterceptorError.ts → interceptor-error.ts} +0 -0
  323. /package/src/interceptors/WebSocket/utils/{bindEvent.ts → bind-event.ts} +0 -0
  324. /package/src/interceptors/XMLHttpRequest/polyfills/{EventPolyfill.ts → event-polyfill.ts} +0 -0
  325. /package/src/interceptors/XMLHttpRequest/utils/{getBodyByteLength.ts → get-body-byte-length.ts} +0 -0
  326. /package/src/interceptors/XMLHttpRequest/utils/{isDomParserSupportedType.ts → is-dom-parser-supported-type.ts} +0 -0
  327. /package/src/interceptors/fetch/utils/{createNetworkError.ts → create-network-error.ts} +0 -0
  328. /package/src/utils/{findPropertySource.ts → find-property-source.ts} +0 -0
  329. /package/src/utils/{getCleanUrl.ts → get-clean-url.ts} +0 -0
  330. /package/src/utils/{getValueBySymbol.ts → get-value-by-symbol.ts} +0 -0
  331. /package/src/utils/{isNodeLikeError.ts → is-node-like-error.ts} +0 -0
  332. /package/src/utils/{isObject.ts → is-object.ts} +0 -0
  333. /package/src/utils/{isPropertyAccessible.ts → is-property-accessible.ts} +0 -0
  334. /package/src/utils/{parseJson.ts → parse-json.ts} +0 -0
  335. /package/src/utils/{resolveWebSocketUrl.ts → resolve-web-socket-url.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buffer-utils-BvPY1Tc-.js","names":["#owners","#getLoggerNamespace"],"sources":["../../src/disposable.ts","../../src/utils/logger.ts","../../src/interceptor.ts","../../src/utils/buffer-utils.ts"],"sourcesContent":["export type DisposableSubscription = () => void\n\nexport class Disposable {\n protected subscriptions: Array<DisposableSubscription> = []\n\n public dispose() {\n let subscription: DisposableSubscription | undefined\n\n while ((subscription = this.subscriptions.pop())) {\n subscription()\n }\n }\n}\n","import debug from 'debug'\n\nexport type LogLevel = 'default' | 'verbose'\n\nexport interface Logger {\n info(message: string, ...positionals: Array<unknown>): void\n verbose(message: string, ...positionals: Array<unknown>): void\n isEnabled(level: LogLevel): boolean\n}\n\nconst LOG_TIMESTAMP_REGEXP = /\\d{2}:\\d{2}:\\d{2}\\.\\d{3}/\n\nfunction normalizeNamespace(namespace: string): string {\n return namespace\n .split(':')\n .map((segment) => {\n return segment\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/[^a-zA-Z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n .toLowerCase()\n })\n .filter(Boolean)\n .join(':')\n}\n\nfunction getTimestamp(): string {\n return new Date().toISOString().slice(11, 23)\n}\n\nasync function readBody(message: Request | Response): Promise<string | null> {\n if (message.body == null) {\n return null\n }\n\n try {\n return await message.clone().text()\n } catch {\n return null\n }\n}\n\nfunction formatHeaders(headers: Headers): Array<string> {\n return Array.from(headers.entries()).map(([name, value]) => {\n return `${name}: ${value}`\n })\n}\n\nasync function formatHttpMessage(\n startLine: string,\n message: Request | Response\n): Promise<string> {\n const lines = [startLine, ...formatHeaders(message.headers)]\n const body = await readBody(message)\n\n lines.push('', body ?? '')\n\n return lines.join('\\n')\n}\n\nexport async function formatRequest(request: Request): Promise<string> {\n return formatHttpMessage(`${request.method} ${request.url}`, request)\n}\n\nexport async function formatResponse(response: Response): Promise<string> {\n const statusText = response.statusText ? ` ${response.statusText}` : ''\n return formatHttpMessage(\n `HTTP ${response.status}${statusText}`,\n response\n )\n}\n\nfunction formatLogArguments(arguments_: Array<unknown>): void {\n const message = arguments_[0]\n\n if (typeof message === 'string') {\n const messageWithoutDebugTimestamp = message.replace(\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z /,\n ''\n )\n const timestampMatch = messageWithoutDebugTimestamp.match(\n LOG_TIMESTAMP_REGEXP\n )\n\n if (!timestampMatch || timestampMatch.index === undefined) {\n arguments_[0] = messageWithoutDebugTimestamp\n return\n }\n\n const messagePrefix = messageWithoutDebugTimestamp\n .slice(0, timestampMatch.index)\n .trim()\n const messageBody = messageWithoutDebugTimestamp\n .slice(timestampMatch.index + timestampMatch[0].length)\n .trimStart()\n\n arguments_[0] = `${timestampMatch[0]} ${messagePrefix} ${messageBody}`\n }\n}\n\nfunction useConciseTimestamp(logger: debug.Debugger): void {\n logger.log = (...arguments_) => {\n formatLogArguments(arguments_)\n debug.log(...arguments_)\n }\n}\n\nfunction isVerboseLoggingEnabled(): boolean {\n if (typeof process !== 'undefined' && process.env.DEBUG_LEVEL === 'verbose') {\n return true\n }\n\n /**\n * @note Consult the localStorage only in browser-like environments.\n * In Node.js 26+, reading \"globalThis.localStorage\" without the\n * \"--localstorage-file\" flag set emits an experimental warning\n * (a try/catch cannot suppress it). Node.js consumers control the\n * log level via the \"DEBUG_LEVEL\" environment variable above.\n */\n if (typeof document === 'undefined') {\n return false\n }\n\n try {\n return globalThis.localStorage?.getItem('debugLevel') === 'verbose'\n } catch {\n return false\n }\n}\n\nexport function createLogger(namespace: string): Logger {\n const normalizedNamespace = normalizeNamespace(namespace)\n const logger = debug(`interceptors:${normalizedNamespace}`)\n Reflect.set(logger, 'useColors', true)\n useConciseTimestamp(logger)\n\n return {\n info(message, ...positionals) {\n logger(`${getTimestamp()} ${message}`, ...positionals)\n },\n verbose(message, ...positionals) {\n if (!isVerboseLoggingEnabled()) {\n return\n }\n\n logger(`${getTimestamp()} ${message}`, ...positionals)\n },\n isEnabled(level) {\n return (\n logger.enabled && (level === 'default' || isVerboseLoggingEnabled())\n )\n },\n }\n}\n","import { Emitter, type DefaultEventMap } from 'rettime'\nimport { Disposable } from './disposable'\nimport { createLogger, type Logger } from './utils/logger'\n\nexport enum InterceptorReadyState {\n INACTIVE = 'INACTIVE',\n ACTIVE = 'ACTIVE',\n DISPOSED = 'DISPOSED',\n}\n\ndeclare global {\n var __MSW_INTERCEPTORS_REGISTRY: Map<symbol, Interceptor<any>> | undefined\n}\n\nconst interceptorsRegistry = (globalThis.__MSW_INTERCEPTORS_REGISTRY ??=\n new Map<symbol, Interceptor<any>>())\n\nexport abstract class Interceptor<\n Events extends DefaultEventMap,\n> extends Disposable {\n declare ['constructor']: typeof Interceptor\n\n protected emitter: Emitter<Events>\n protected readonly logger: Logger\n\n public readyState: InterceptorReadyState\n\n static readonly symbol: symbol\n\n #owners: Set<object>\n\n static singleton<T extends Interceptor<any>>(\n InterceptorClass: (new () => T) & { symbol: symbol }\n ): T {\n const symbol = InterceptorClass.symbol\n const existing = interceptorsRegistry.get(symbol)\n\n if (existing instanceof InterceptorClass) {\n return existing\n }\n\n const newInstance = new InterceptorClass()\n interceptorsRegistry.set(symbol, newInstance)\n return newInstance\n }\n\n constructor() {\n super()\n\n this.#owners = new Set()\n this.readyState = InterceptorReadyState.INACTIVE\n this.emitter = new Emitter()\n this.logger = createLogger(this.#getLoggerNamespace())\n }\n\n protected abstract predicate(): boolean\n protected abstract setup(): void\n\n public apply(owner: object = this): void {\n if (this.#owners.has(owner)) {\n return\n }\n\n if (\n this.readyState !== InterceptorReadyState.ACTIVE &&\n !this.predicate()\n ) {\n return\n }\n\n this.#owners.add(owner)\n\n if (this.readyState === InterceptorReadyState.ACTIVE) {\n return\n }\n\n try {\n this.setup()\n this.readyState = InterceptorReadyState.ACTIVE\n this.logger.info('apply')\n } catch (error) {\n this.dispose(owner)\n throw error\n }\n }\n\n public dispose(owner: object = this): void {\n if (!this.#owners.delete(owner)) {\n return\n }\n\n if (this.#owners.size > 0) {\n return\n }\n\n super.dispose()\n this.emitter.removeAllListeners()\n this.readyState = InterceptorReadyState.DISPOSED\n this.logger.info('disable')\n }\n\n public on: Emitter<Events>['on'] = (type, listener, options) => {\n return this.emitter.on(type, listener, options)\n }\n\n public once: Emitter<Events>['once'] = (type, listener, options) => {\n return this.emitter.once(type, listener, options)\n }\n\n public listeners: Emitter<Events>['listeners'] = (type) => {\n return this.emitter.listeners(type)\n }\n\n public listenerCount: Emitter<Events>['listenerCount'] = (type) => {\n return this.emitter.listenerCount(type)\n }\n\n public removeListener: Emitter<Events>['removeListener'] = (\n type,\n listener\n ) => {\n return this.emitter.removeListener(type, listener)\n }\n\n public removeAllListeners: Emitter<Events>['removeAllListeners'] = (type) => {\n this.logger.info('removeAllListeners %o', { eventType: type ?? '*' })\n return this.emitter.removeAllListeners(type)\n }\n\n #getLoggerNamespace(): string {\n const symbolDescription = this.constructor.symbol?.description\n\n if (symbolDescription) {\n return symbolDescription.replace(/-interceptor$/, '')\n }\n\n return this.constructor.name.replace(/Interceptor$/, '')\n }\n}\n","const encoder = new TextEncoder()\n\nexport function encodeBuffer(text: string) {\n return encoder.encode(text)\n}\n\nexport function decodeBuffer(buffer: AllowSharedBufferSource, encoding?: string): string {\n const decoder = new TextDecoder(encoding)\n return decoder.decode(buffer)\n}\n\n/**\n * Create an `ArrayBuffer` from the given `Uint8Array`.\n * Takes the byte offset into account to produce the right buffer\n * in the case when the buffer is bigger than the data view.\n */\nexport function toArrayBuffer(array: Uint8Array<ArrayBuffer>): ArrayBuffer {\n return array.buffer.slice(\n array.byteOffset,\n array.byteOffset + array.byteLength\n )\n}\n\nexport function toBuffer(\n data: string | Buffer | Uint8Array<ArrayBufferLike>,\n encoding?: BufferEncoding\n): Buffer {\n if (Buffer.isBuffer(data)) {\n return data\n }\n\n if (data instanceof Uint8Array) {\n return Buffer.from(data.buffer)\n }\n\n return Buffer.from(data, encoding)\n}\n"],"mappings":"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"}
@@ -0,0 +1,568 @@
1
+ import { s as formatResponse } from "./buffer-utils-BvPY1Tc-.js";
2
+ import { invariant } from "outvariant";
3
+ //#region src/interceptor-error.ts
4
+ var InterceptorError = class InterceptorError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = "InterceptorError";
8
+ Object.setPrototypeOf(this, InterceptorError.prototype);
9
+ }
10
+ };
11
+ //#endregion
12
+ //#region src/request-controller.ts
13
+ var RequestController = class RequestController {
14
+ static {
15
+ this.PENDING = 0;
16
+ }
17
+ static {
18
+ this.PASSTHROUGH = 1;
19
+ }
20
+ static {
21
+ this.RESPONSE = 2;
22
+ }
23
+ static {
24
+ this.ERROR = 3;
25
+ }
26
+ #handled;
27
+ constructor(request, source, options) {
28
+ this.request = request;
29
+ this.source = source;
30
+ this.options = options;
31
+ this.readyState = RequestController.PENDING;
32
+ this.#handled = Promise.withResolvers();
33
+ this.handled = this.#handled.promise;
34
+ }
35
+ /**
36
+ * Perform this request as-is.
37
+ */
38
+ async passthrough() {
39
+ invariant.as(InterceptorError, this.readyState === RequestController.PENDING, "Failed to passthrough the \"%s %s\" request: the request has already been handled", this.request.method, this.request.url);
40
+ this.readyState = RequestController.PASSTHROUGH;
41
+ if (this.options) this.options.logger.info("[%s] passthrough", this.options.requestId);
42
+ await this.source.passthrough();
43
+ this.#handled.resolve();
44
+ }
45
+ /**
46
+ * Respond to this request with the given `Response` instance.
47
+ *
48
+ * @example
49
+ * controller.respondWith(new Response())
50
+ * controller.respondWith(Response.json({ id }))
51
+ * controller.respondWith(Response.error())
52
+ */
53
+ respondWith(response) {
54
+ invariant.as(InterceptorError, this.readyState === RequestController.PENDING, "Failed to respond to the \"%s %s\" request with \"%d %s\": the request has already been handled (%d)", this.request.method, this.request.url, response.status, response.statusText || "OK", this.readyState);
55
+ this.readyState = RequestController.RESPONSE;
56
+ if (this.options?.logger.isEnabled("default")) {
57
+ const { logger, requestId } = this.options;
58
+ formatResponse(response).then((message) => {
59
+ logger.info("[%s] mocked %s", requestId, message);
60
+ });
61
+ }
62
+ this.#handled.resolve();
63
+ /**
64
+ * @note Although `source.respondWith()` is potentially asynchronous,
65
+ * do NOT await it for backward-compatibility. Awaiting it will short-circuit
66
+ * the request listener invocation as soon as a listener responds to a request.
67
+ * Ideally, that's what we want, but that's not what we promise the user.
68
+ */
69
+ this.source.respondWith(response);
70
+ }
71
+ /**
72
+ * Error this request with the given reason.
73
+ *
74
+ * @example
75
+ * controller.errorWith()
76
+ * controller.errorWith(new Error('Oops!'))
77
+ * controller.errorWith({ message: 'Oops!'})
78
+ */
79
+ errorWith(reason) {
80
+ invariant.as(InterceptorError, this.readyState === RequestController.PENDING, "Failed to error the \"%s %s\" request with \"%s\": the request has already been handled (%d)", this.request.method, this.request.url, reason?.toString(), this.readyState);
81
+ this.readyState = RequestController.ERROR;
82
+ if (this.options) this.options.logger.info("[%s] error %o", this.options.requestId, reason);
83
+ this.source.errorWith(reason);
84
+ this.#handled.resolve();
85
+ }
86
+ };
87
+ //#endregion
88
+ //#region src/create-request-id.ts
89
+ /**
90
+ * Generate a random ID string to represent a request.
91
+ * @example
92
+ * createRequestId()
93
+ * // "f774b6c9c600f"
94
+ */
95
+ function createRequestId() {
96
+ return Math.random().toString(16).slice(2);
97
+ }
98
+ //#endregion
99
+ //#region src/interceptors/ClientRequest/utils/record-raw-headers.ts
100
+ const kRawHeaders = Symbol("kRawHeaders");
101
+ const kRestorePatches = Symbol("kRestorePatches");
102
+ function recordRawHeader(headers, args, behavior) {
103
+ ensureRawHeadersSymbol(headers, []);
104
+ const rawHeaders = Reflect.get(headers, kRawHeaders);
105
+ if (behavior === "set") {
106
+ for (let index = rawHeaders.length - 1; index >= 0; index--) if (rawHeaders[index][0].toLowerCase() === args[0].toLowerCase()) rawHeaders.splice(index, 1);
107
+ }
108
+ rawHeaders.push(args);
109
+ }
110
+ /**
111
+ * Define the raw headers symbol on the given `Headers` instance.
112
+ * If the symbol already exists, this function does nothing.
113
+ */
114
+ function ensureRawHeadersSymbol(headers, rawHeaders) {
115
+ if (Reflect.has(headers, kRawHeaders)) return;
116
+ defineRawHeadersSymbol(headers, rawHeaders);
117
+ }
118
+ /**
119
+ * Define the raw headers symbol on the given `Headers` instance.
120
+ * If the symbol already exists, it gets overridden.
121
+ */
122
+ function defineRawHeadersSymbol(headers, rawHeaders) {
123
+ Object.defineProperty(headers, kRawHeaders, {
124
+ value: rawHeaders,
125
+ enumerable: false,
126
+ configurable: true
127
+ });
128
+ }
129
+ /**
130
+ * Patch the global `Headers` class to store raw headers.
131
+ * This is for compatibility with `IncomingMessage.prototype.rawHeaders`.
132
+ *
133
+ * @note Node.js has their own raw headers symbol but it
134
+ * only records the first header name in case of multi-value headers.
135
+ * Any other headers are normalized before comparing. This makes it
136
+ * incompatible with the `rawHeaders` format.
137
+ *
138
+ * let h = new Headers()
139
+ * h.append('X-Custom', 'one')
140
+ * h.append('x-custom', 'two')
141
+ * h[Symbol('headers map')] // Map { 'X-Custom' => 'one, two' }
142
+ */
143
+ function recordRawFetchHeaders() {
144
+ if (Reflect.get(Headers, kRestorePatches)) return Reflect.get(Headers, kRestorePatches);
145
+ const { Headers: OriginalHeaders, Request: OriginalRequest, Response: OriginalResponse } = globalThis;
146
+ const { set, append, delete: headersDeleteMethod } = Headers.prototype;
147
+ Object.defineProperty(Headers, kRestorePatches, {
148
+ value: () => {
149
+ Headers.prototype.set = set;
150
+ Headers.prototype.append = append;
151
+ Headers.prototype.delete = headersDeleteMethod;
152
+ globalThis.Headers = OriginalHeaders;
153
+ globalThis.Request = OriginalRequest;
154
+ globalThis.Response = OriginalResponse;
155
+ Object.setPrototypeOf(FetchRequest, OriginalRequest);
156
+ Object.setPrototypeOf(FetchRequest.prototype, OriginalRequest.prototype);
157
+ Object.setPrototypeOf(FetchResponse, OriginalResponse);
158
+ Object.setPrototypeOf(FetchResponse.prototype, OriginalResponse.prototype);
159
+ Reflect.deleteProperty(Headers, kRestorePatches);
160
+ },
161
+ enumerable: false,
162
+ /**
163
+ * @note Mark this property as configurable
164
+ * so we can delete it using `Reflect.delete` during cleanup.
165
+ */
166
+ configurable: true
167
+ });
168
+ Object.defineProperty(globalThis, "Headers", {
169
+ enumerable: true,
170
+ writable: true,
171
+ value: new Proxy(Headers, { construct(target, args, newTarget) {
172
+ const headersInit = args[0] || [];
173
+ if (headersInit instanceof Headers && Reflect.has(headersInit, kRawHeaders)) {
174
+ const sanitizedHeaders = Reflect.get(headersInit, kRawHeaders).map((tuple) => [tuple[0], tuple[1]]);
175
+ const headers = Reflect.construct(target, [sanitizedHeaders], newTarget);
176
+ ensureRawHeadersSymbol(headers, [...sanitizedHeaders]);
177
+ return headers;
178
+ }
179
+ const headers = Reflect.construct(target, args, newTarget);
180
+ if (!Reflect.has(headers, kRawHeaders)) ensureRawHeadersSymbol(headers, Array.isArray(headersInit) ? headersInit : Object.entries(headersInit));
181
+ return headers;
182
+ } })
183
+ });
184
+ Headers.prototype.set = new Proxy(Headers.prototype.set, { apply(target, thisArg, args) {
185
+ recordRawHeader(thisArg, [args[0], args[1]], "set");
186
+ return Reflect.apply(target, thisArg, args);
187
+ } });
188
+ Headers.prototype.append = new Proxy(Headers.prototype.append, { apply(target, thisArg, args) {
189
+ recordRawHeader(thisArg, [args[0], args[1]], "append");
190
+ return Reflect.apply(target, thisArg, args);
191
+ } });
192
+ Headers.prototype.delete = new Proxy(Headers.prototype.delete, { apply(target, thisArg, args) {
193
+ const rawHeaders = Reflect.get(thisArg, kRawHeaders);
194
+ if (rawHeaders) {
195
+ for (let index = rawHeaders.length - 1; index >= 0; index--) if (rawHeaders[index][0].toLowerCase() === args[0].toLowerCase()) rawHeaders.splice(index, 1);
196
+ }
197
+ return Reflect.apply(target, thisArg, args);
198
+ } });
199
+ Object.defineProperty(globalThis, "Request", {
200
+ enumerable: true,
201
+ writable: true,
202
+ value: new Proxy(Request, { construct(target, args, newTarget) {
203
+ const request = Reflect.construct(target, args, newTarget);
204
+ const inferredRawHeaders = [];
205
+ if (typeof args[0] === "object" && args[0].headers != null) inferredRawHeaders.push(...inferRawHeaders(args[0].headers));
206
+ if (typeof args[1] === "object" && args[1].headers != null) inferredRawHeaders.push(...inferRawHeaders(args[1].headers));
207
+ if (inferredRawHeaders.length > 0) ensureRawHeadersSymbol(request.headers, inferredRawHeaders);
208
+ return request;
209
+ } })
210
+ });
211
+ Object.defineProperty(globalThis, "Response", {
212
+ enumerable: true,
213
+ writable: true,
214
+ value: new Proxy(Response, { construct(target, args, newTarget) {
215
+ const response = Reflect.construct(target, args, newTarget);
216
+ if (typeof args[1] === "object" && args[1].headers != null) ensureRawHeadersSymbol(response.headers, inferRawHeaders(args[1].headers));
217
+ return response;
218
+ } })
219
+ });
220
+ /**
221
+ * Re-parent FetchRequest/FetchResponse so their `super()` calls go
222
+ * through the proxied globalThis.Request/Response above. Without this,
223
+ * FetchRequest extends the statically-captured (original) Request,
224
+ * bypassing the construct proxy that records raw headers.
225
+ */
226
+ Object.setPrototypeOf(FetchRequest, globalThis.Request);
227
+ Object.setPrototypeOf(FetchRequest.prototype, globalThis.Request.prototype);
228
+ Object.setPrototypeOf(FetchResponse, globalThis.Response);
229
+ Object.setPrototypeOf(FetchResponse.prototype, globalThis.Response.prototype);
230
+ return restoreHeadersPrototype;
231
+ }
232
+ function restoreHeadersPrototype() {
233
+ if (!Reflect.get(Headers, kRestorePatches)) return;
234
+ Reflect.get(Headers, kRestorePatches)();
235
+ }
236
+ function getRawFetchHeaders(headers) {
237
+ if (!Reflect.has(headers, kRawHeaders)) return Array.from(headers.entries());
238
+ const rawHeaders = Reflect.get(headers, kRawHeaders);
239
+ return rawHeaders.length > 0 ? rawHeaders : Array.from(headers.entries());
240
+ }
241
+ /**
242
+ * Infers the raw headers from the given `HeadersInit` provided
243
+ * to the Request/Response constructor.
244
+ *
245
+ * If the `init.headers` is a Headers instance, use it directly.
246
+ * That means the headers were created standalone and already have
247
+ * the raw headers stored.
248
+ * If the `init.headers` is a HeadersInit, create a new Headers
249
+ * instance out of it.
250
+ */
251
+ function inferRawHeaders(headers) {
252
+ if (headers instanceof Headers) return Reflect.get(headers, kRawHeaders) || [];
253
+ return Reflect.get(new Headers(headers), kRawHeaders);
254
+ }
255
+ function copyRawHeaders(source, destination) {
256
+ const rawHeaders = [...getRawFetchHeaders(source)];
257
+ if (rawHeaders.length === 0) return;
258
+ /**
259
+ * @note Add headers from trhe destination that raw headers from the source
260
+ * don't have. Undici automatically appends a "Content-Type" header for responses
261
+ * and, for some reason, that change is not recorded. This preserves it.
262
+ */
263
+ for (const [name, value] of destination) if (rawHeaders.every((header) => header[0].toLowerCase() !== name.toLowerCase())) rawHeaders.push([name, value]);
264
+ defineRawHeadersSymbol(destination, rawHeaders);
265
+ }
266
+ //#endregion
267
+ //#region src/utils/get-value-by-symbol.ts
268
+ /**
269
+ * Returns the value behind the symbol with the given name.
270
+ */
271
+ function getValueBySymbol(symbolName, source) {
272
+ const symbol = Object.getOwnPropertySymbols(source).find((symbol) => {
273
+ return symbol.description === symbolName;
274
+ });
275
+ if (symbol) return Reflect.get(source, symbol);
276
+ }
277
+ //#endregion
278
+ //#region src/utils/is-object.ts
279
+ /**
280
+ * Determines if a given value is an instance of object.
281
+ */
282
+ function isObject(value, loose = false) {
283
+ return loose ? Object.prototype.toString.call(value).startsWith("[object ") : Object.prototype.toString.call(value) === "[object Object]";
284
+ }
285
+ //#endregion
286
+ //#region src/utils/is-property-accessible.ts
287
+ /**
288
+ * A function that validates if property access is possible on an object
289
+ * without throwing. It returns `true` if the property access is possible
290
+ * and `false` otherwise.
291
+ *
292
+ * Environments like miniflare will throw on property access on certain objects
293
+ * like Request and Response, for unimplemented properties.
294
+ */
295
+ function isPropertyAccessible(obj, key) {
296
+ try {
297
+ obj[key];
298
+ return true;
299
+ } catch {
300
+ return false;
301
+ }
302
+ }
303
+ //#endregion
304
+ //#region src/utils/response-utils.ts
305
+ /**
306
+ * Creates a generic 500 Unhandled Exception response.
307
+ */
308
+ function createServerErrorResponse(body) {
309
+ return new Response(JSON.stringify(body instanceof Error ? {
310
+ name: body.name,
311
+ message: body.message,
312
+ stack: body.stack
313
+ } : body), {
314
+ status: 500,
315
+ statusText: "Unhandled Exception",
316
+ headers: { "Content-Type": "application/json" }
317
+ });
318
+ }
319
+ /**
320
+ * A key on the error a mocked `Response.error()` destroys the socket
321
+ * with, referencing that error response. Allows the client-side
322
+ * interceptors (e.g. fetch) to surface the error response to the
323
+ * consumer instead of the internal socket error.
324
+ */
325
+ const kErrorResponse = Symbol("kErrorResponse");
326
+ /**
327
+ * Get the mocked error response that caused the given error, if any.
328
+ */
329
+ function getErrorResponse(error) {
330
+ if (error instanceof Error && kErrorResponse in error && isResponseError(error[kErrorResponse])) return error[kErrorResponse];
331
+ }
332
+ /**
333
+ * Check if the given response is a `Response.error()`.
334
+ *
335
+ * @note Some environments, like Miniflare (Cloudflare) do not
336
+ * implement the "Response.type" property and throw on its access.
337
+ * Safely check if we can access "type" on "Response" before continuing.
338
+ * @see https://github.com/mswjs/msw/issues/1834
339
+ */
340
+ function isResponseError(response) {
341
+ return response != null && response instanceof Response && isPropertyAccessible(response, "type") && response.type === "error";
342
+ }
343
+ /**
344
+ * Check if the given value is a `Response` or a Response-like object.
345
+ * This is different from `value instanceof Response` because it supports
346
+ * custom `Response` constructors, like the one when using Undici directly.
347
+ */
348
+ function isResponseLike(value) {
349
+ return isObject(value, true) && isPropertyAccessible(value, "status") && isPropertyAccessible(value, "statusText") && isPropertyAccessible(value, "bodyUsed");
350
+ }
351
+ //#endregion
352
+ //#region src/utils/fetch-utils.ts
353
+ var FetchRequest = class FetchRequest extends Request {
354
+ static #resolveProperty(input, init = {}, key) {
355
+ return init[key] ?? (input instanceof Request ? input[key] : void 0);
356
+ }
357
+ /**
358
+ * Check if the given request method is configurable.
359
+ * @see https://fetch.spec.whatwg.org/#methods
360
+ */
361
+ static isConfigurableMethod(method) {
362
+ return method !== "CONNECT" && method !== "TRACE" && method !== "TRACK";
363
+ }
364
+ static isMethodWithBody(method) {
365
+ return method !== "HEAD" && method !== "GET" && FetchRequest.isConfigurableMethod(method);
366
+ }
367
+ /**
368
+ * Check if the given request `mode` is configurable.
369
+ * @see https://fetch.spec.whatwg.org/#concept-request-mode
370
+ */
371
+ static isConfigurableMode(mode) {
372
+ return mode !== "navigate" && mode !== "websocket" && mode !== "webtransport";
373
+ }
374
+ constructor(input, init) {
375
+ const method = FetchRequest.#resolveProperty(input, init, "method") || "GET";
376
+ const safeMethod = FetchRequest.isConfigurableMethod(method) ? method : "GET";
377
+ const hasExplicitBody = init != null && "body" in init;
378
+ /**
379
+ * Only include `body` in the super init when it needs to be overridden.
380
+ * When `input` is a Request and no explicit body is in `init`, let the
381
+ * Request constructor handle body transfer naturally so it properly
382
+ * marks the original request's body as consumed (bodyUsed = true).
383
+ */
384
+ const bodyInit = !FetchRequest.isMethodWithBody(method) ? { body: void 0 } : hasExplicitBody ? { body: init.body } : {};
385
+ const mode = FetchRequest.#resolveProperty(input, init, "mode") ?? void 0;
386
+ const safeMode = FetchRequest.isConfigurableMode(mode) ? mode : void 0;
387
+ super(input, {
388
+ ...init || {},
389
+ method: safeMethod,
390
+ mode: safeMode,
391
+ duplex: init?.duplex ?? (FetchRequest.isMethodWithBody(method) ? "half" : void 0),
392
+ ...bodyInit
393
+ });
394
+ if (method !== safeMethod) this.#setInternalProperty("method", method);
395
+ if (method === "CONNECT") {
396
+ const url = new URL(input instanceof Request ? input.url : input);
397
+ let authority;
398
+ /**
399
+ * @note Node.js has a bug parsing raw CONNECT requests URLs like
400
+ * "http://127.0.0.1:1337/localhost:80". It would treat "localhost:" as a protocol.
401
+ */
402
+ if (url.protocol === "localhost:") authority = url.href;
403
+ else authority = url.pathname.replace(/^\/+/, "");
404
+ /**
405
+ * @note Define "url" as a getter because Undici uses their own
406
+ * logic to resolve the "request.url" property. Simply reassigning
407
+ * its value doesn't do anything. This is a destructive action
408
+ * but it's safe because "CONNECT" requests are forbidden per fetch.
409
+ */
410
+ Object.defineProperty(this, "url", {
411
+ get: () => authority,
412
+ enumerable: true,
413
+ configurable: true
414
+ });
415
+ }
416
+ if (mode != null && mode !== safeMode) this.#setInternalProperty("mode", mode);
417
+ }
418
+ #setInternalProperty(key, value) {
419
+ const internalState = getValueBySymbol("state", this);
420
+ if (internalState) Reflect.set(internalState, key, value);
421
+ else Object.defineProperty(this, key, {
422
+ value,
423
+ enumerable: true,
424
+ configurable: true,
425
+ writable: false
426
+ });
427
+ }
428
+ };
429
+ const kStatus = Symbol("kStatus");
430
+ const kUrl = Symbol("kUrl");
431
+ var FetchResponse = class FetchResponse extends Response {
432
+ static from(response, init) {
433
+ if (response instanceof FetchResponse) return response;
434
+ if (isResponseError(response)) return response;
435
+ const fetchResponse = new FetchResponse(response.body, {
436
+ url: init?.url ?? response.url,
437
+ status: init?.status || response.status,
438
+ statusText: init?.statusText ?? response.statusText,
439
+ headers: init?.headers ?? response.headers
440
+ });
441
+ copyRawHeaders(response.headers, fetchResponse.headers);
442
+ return fetchResponse;
443
+ }
444
+ static {
445
+ this.STATUS_CODES_WITHOUT_BODY = [
446
+ 101,
447
+ 103,
448
+ 204,
449
+ 205,
450
+ 304
451
+ ];
452
+ }
453
+ static {
454
+ this.STATUS_CODES_WITH_REDIRECT = [
455
+ 301,
456
+ 302,
457
+ 303,
458
+ 307,
459
+ 308
460
+ ];
461
+ }
462
+ static isConfigurableStatusCode(status) {
463
+ return status >= 200 && status <= 599;
464
+ }
465
+ static isRedirectResponse(status) {
466
+ return FetchResponse.STATUS_CODES_WITH_REDIRECT.includes(status);
467
+ }
468
+ /**
469
+ * Returns a boolean indicating whether the given response status
470
+ * code represents a response that can have a body.
471
+ */
472
+ static isResponseWithBody(status) {
473
+ return !FetchResponse.STATUS_CODES_WITHOUT_BODY.includes(status);
474
+ }
475
+ static setStatus(status, response) {
476
+ /**
477
+ * @note Undici keeps an internal "Symbol(state)" that holds
478
+ * the actual value of response status. Update that in Node.js.
479
+ */
480
+ const internalState = getValueBySymbol("state", response);
481
+ if (internalState) internalState.status = status;
482
+ else Object.defineProperty(response, "status", {
483
+ value: status,
484
+ enumerable: true,
485
+ configurable: true,
486
+ writable: false
487
+ });
488
+ Object.defineProperty(response, kStatus, {
489
+ value: status,
490
+ enumerable: false
491
+ });
492
+ }
493
+ static setUrl(url, response) {
494
+ if (!url || url === "about:" || !URL.canParse(url)) return;
495
+ const state = getValueBySymbol("state", response);
496
+ if (state) state.urlList.push(new URL(url));
497
+ else Object.defineProperty(response, "url", {
498
+ value: url,
499
+ enumerable: true,
500
+ configurable: true,
501
+ writable: false
502
+ });
503
+ Object.defineProperty(response, kUrl, {
504
+ value: url,
505
+ enumerable: false
506
+ });
507
+ }
508
+ /**
509
+ * Parses the given raw HTTP headers into a Fetch API `Headers` instance.
510
+ */
511
+ static parseRawHeaders(rawHeaders) {
512
+ const headers = new Headers();
513
+ for (let line = 0; line < rawHeaders.length; line += 2) headers.append(rawHeaders[line], rawHeaders[line + 1]);
514
+ return headers;
515
+ }
516
+ /**
517
+ * Safely clones the given `Response`.
518
+ * Coerces response clone exceptions into 500 mocked responses.
519
+ * Handy in the environments that introduce arbitrary response
520
+ * cloning restrictions, like "101 Switching Protocols" cloning
521
+ * in "miniflare".
522
+ */
523
+ static clone(response) {
524
+ try {
525
+ return response.clone();
526
+ } catch (error) {
527
+ return Response.json(error instanceof Error ? {
528
+ name: error.name,
529
+ message: error.message,
530
+ stack: error.stack
531
+ } : {}, {
532
+ status: 500,
533
+ statusText: "Unclonable Response"
534
+ });
535
+ }
536
+ }
537
+ #status;
538
+ #url;
539
+ constructor(body, init = {}) {
540
+ const status = init.status ?? 200;
541
+ const safeStatus = FetchResponse.isConfigurableStatusCode(status) ? status : 200;
542
+ const finalBody = FetchResponse.isResponseWithBody(status) ? body : null;
543
+ super(finalBody, {
544
+ status: safeStatus,
545
+ statusText: init.statusText,
546
+ headers: init.headers
547
+ });
548
+ /**
549
+ * Since Node.js v24, Undici stores the Response state in an inaccessible field "#state".
550
+ * Forward the modified status/URL to the cloned response manually.
551
+ * @see https://github.com/nodejs/undici/blob/f734c87280e626c75f59aad55b65eb6a89cef392/lib/web/fetch/response.js#L242
552
+ */
553
+ if (status !== safeStatus) FetchResponse.setStatus(status, this);
554
+ FetchResponse.setUrl(init.url, this);
555
+ }
556
+ clone() {
557
+ const clonedResponse = super.clone();
558
+ const customStatus = Reflect.get(this, kStatus);
559
+ if (customStatus) FetchResponse.setStatus(customStatus, clonedResponse);
560
+ const customUrl = Reflect.get(this, kUrl);
561
+ if (customUrl) FetchResponse.setUrl(customUrl, clonedResponse);
562
+ return clonedResponse;
563
+ }
564
+ };
565
+ //#endregion
566
+ export { isResponseError as a, isObject as c, createRequestId as d, RequestController as f, getErrorResponse as i, getRawFetchHeaders as l, FetchResponse as n, isResponseLike as o, InterceptorError as p, createServerErrorResponse as r, kErrorResponse as s, FetchRequest as t, recordRawFetchHeaders as u };
567
+
568
+ //# sourceMappingURL=fetch-utils-Dw1PsmtX.js.map