@mswjs/interceptors 0.41.8 → 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} +40 -31
  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/{node/XMLHttpRequest-DhupxLHX.mjs → browser/web-C2oKsT3Q.js} +328 -256
  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 +65 -180
  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 +34 -51
  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} +66 -47
  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-B11I9TBx.cjs +0 -751
  167. package/lib/browser/XMLHttpRequest-B11I9TBx.cjs.map +0 -1
  168. package/lib/browser/XMLHttpRequest-DHEkSoRN.mjs +0 -746
  169. package/lib/browser/XMLHttpRequest-DHEkSoRN.mjs.map +0 -1
  170. package/lib/browser/bufferUtils-BiiO6HZv.mjs.map +0 -1
  171. package/lib/browser/bufferUtils-Uc0eRItL.cjs +0 -38
  172. package/lib/browser/bufferUtils-Uc0eRItL.cjs.map +0 -1
  173. package/lib/browser/createRequestId-DOf8Ktjs.cjs +0 -205
  174. package/lib/browser/createRequestId-DOf8Ktjs.cjs.map +0 -1
  175. package/lib/browser/createRequestId-DYCsFHOi.mjs +0 -170
  176. package/lib/browser/createRequestId-DYCsFHOi.mjs.map +0 -1
  177. package/lib/browser/fetch-BJwfdses.mjs +0 -236
  178. package/lib/browser/fetch-BJwfdses.mjs.map +0 -1
  179. package/lib/browser/fetch-M8iXkZ3L.cjs +0 -241
  180. package/lib/browser/fetch-M8iXkZ3L.cjs.map +0 -1
  181. package/lib/browser/getRawRequest-B1BqgWG6.mjs.map +0 -1
  182. package/lib/browser/getRawRequest-DdfaiPVH.cjs +0 -376
  183. package/lib/browser/getRawRequest-DdfaiPVH.cjs.map +0 -1
  184. package/lib/browser/glossary-1lhZx6Aw.d.cts +0 -69
  185. package/lib/browser/glossary-nkHWcwvY.d.mts +0 -69
  186. package/lib/browser/handleRequest-1Yqu_ho_.mjs +0 -178
  187. package/lib/browser/handleRequest-1Yqu_ho_.mjs.map +0 -1
  188. package/lib/browser/handleRequest-Cz4_wmQ9.cjs +0 -189
  189. package/lib/browser/handleRequest-Cz4_wmQ9.cjs.map +0 -1
  190. package/lib/browser/hasConfigurableGlobal-C8zq1MCg.mjs +0 -109
  191. package/lib/browser/hasConfigurableGlobal-C8zq1MCg.mjs.map +0 -1
  192. package/lib/browser/hasConfigurableGlobal-CS7adEvV.cjs +0 -126
  193. package/lib/browser/hasConfigurableGlobal-CS7adEvV.cjs.map +0 -1
  194. package/lib/browser/index.cjs +0 -70
  195. package/lib/browser/index.cjs.map +0 -1
  196. package/lib/browser/index.d.mts +0 -125
  197. package/lib/browser/index.mjs +0 -56
  198. package/lib/browser/index.mjs.map +0 -1
  199. package/lib/browser/interceptors/WebSocket/index.cjs +0 -618
  200. package/lib/browser/interceptors/WebSocket/index.cjs.map +0 -1
  201. package/lib/browser/interceptors/WebSocket/index.mjs.map +0 -1
  202. package/lib/browser/interceptors/XMLHttpRequest/index.cjs +0 -8
  203. package/lib/browser/interceptors/XMLHttpRequest/index.d.cts +0 -15
  204. package/lib/browser/interceptors/XMLHttpRequest/index.d.mts +0 -15
  205. package/lib/browser/interceptors/XMLHttpRequest/index.mjs +0 -8
  206. package/lib/browser/interceptors/fetch/index.cjs +0 -7
  207. package/lib/browser/interceptors/fetch/index.d.cts +0 -13
  208. package/lib/browser/interceptors/fetch/index.d.mts +0 -13
  209. package/lib/browser/interceptors/fetch/index.mjs +0 -7
  210. package/lib/browser/presets/browser.cjs +0 -18
  211. package/lib/browser/presets/browser.cjs.map +0 -1
  212. package/lib/browser/presets/browser.d.cts +0 -12
  213. package/lib/browser/presets/browser.d.mts +0 -14
  214. package/lib/browser/presets/browser.mjs +0 -18
  215. package/lib/browser/presets/browser.mjs.map +0 -1
  216. package/lib/browser/resolveWebSocketUrl-6K6EgqsA.cjs +0 -31
  217. package/lib/browser/resolveWebSocketUrl-6K6EgqsA.cjs.map +0 -1
  218. package/lib/browser/resolveWebSocketUrl-C83-x9iE.mjs.map +0 -1
  219. package/lib/node/BatchInterceptor-DdMNfSUY.mjs +0 -44
  220. package/lib/node/BatchInterceptor-DdMNfSUY.mjs.map +0 -1
  221. package/lib/node/BatchInterceptor-KKF8Q47I.d.cts +0 -26
  222. package/lib/node/BatchInterceptor-Z1lwK23r.cjs +0 -49
  223. package/lib/node/BatchInterceptor-Z1lwK23r.cjs.map +0 -1
  224. package/lib/node/BatchInterceptor-rSr-NH_H.d.mts +0 -26
  225. package/lib/node/ClientRequest-DFs7FPNi.cjs +0 -1058
  226. package/lib/node/ClientRequest-DFs7FPNi.cjs.map +0 -1
  227. package/lib/node/ClientRequest-dRpI9v1o.mjs +0 -1049
  228. package/lib/node/ClientRequest-dRpI9v1o.mjs.map +0 -1
  229. package/lib/node/Interceptor-BsZ21ue0.d.cts +0 -132
  230. package/lib/node/Interceptor-soD-WpQO.d.mts +0 -132
  231. package/lib/node/RemoteHttpInterceptor.cjs +0 -155
  232. package/lib/node/RemoteHttpInterceptor.cjs.map +0 -1
  233. package/lib/node/RemoteHttpInterceptor.d.mts +0 -39
  234. package/lib/node/RemoteHttpInterceptor.mjs.map +0 -1
  235. package/lib/node/XMLHttpRequest-DhupxLHX.mjs.map +0 -1
  236. package/lib/node/XMLHttpRequest-Dyi6ahGz.cjs +0 -752
  237. package/lib/node/XMLHttpRequest-Dyi6ahGz.cjs.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-BqMcbuYR.mjs +0 -252
  244. package/lib/node/fetch-BqMcbuYR.mjs.map +0 -1
  245. package/lib/node/fetch-aQJu1Gf_.cjs +0 -259
  246. package/lib/node/fetch-aQJu1Gf_.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-DCLzePtS.mjs +0 -190
  256. package/lib/node/handleRequest-DCLzePtS.mjs.map +0 -1
  257. package/lib/node/handleRequest-DVOthWJo.cjs +0 -220
  258. package/lib/node/handleRequest-DVOthWJo.cjs.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 -95
  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
@@ -1,14 +1,15 @@
1
- import { ChildProcess } from 'child_process'
2
- import { HttpRequestEventMap } from './glossary'
3
- import { Interceptor } from './Interceptor'
4
- import { BatchInterceptor } from './BatchInterceptor'
1
+ import type { ChildProcess } from 'node:child_process'
2
+ import { type HttpRequestEventMap, HttpResponseEvent } from './events/http'
3
+ import { Interceptor } from './interceptor'
4
+ import { BatchInterceptor } from './batch-interceptor'
5
5
  import { ClientRequestInterceptor } from './interceptors/ClientRequest'
6
- import { XMLHttpRequestInterceptor } from './interceptors/XMLHttpRequest'
7
- import { FetchInterceptor } from './interceptors/fetch'
8
- import { handleRequest } from './utils/handleRequest'
9
- import { RequestController } from './RequestController'
10
- import { FetchRequest, FetchResponse } from './utils/fetchUtils'
11
- import { isResponseError } from './utils/responseUtils'
6
+ import { XMLHttpRequestInterceptor } from './interceptors/XMLHttpRequest/node'
7
+ import { FetchInterceptor } from './interceptors/fetch/node'
8
+ import { handleRequest } from './utils/handle-request'
9
+ import { RequestController } from './request-controller'
10
+ import { FetchRequest, FetchResponse } from './utils/fetch-utils'
11
+ import { isResponseError } from './utils/response-utils'
12
+ import { createLogger } from './utils/logger'
12
13
 
13
14
  export interface SerializedRequest {
14
15
  id: string
@@ -16,7 +17,7 @@ export interface SerializedRequest {
16
17
  method: string
17
18
  headers: Array<[string, string]>
18
19
  credentials: RequestCredentials
19
- body: string
20
+ body: string | null
20
21
  }
21
22
 
22
23
  interface RevivedRequest extends Omit<SerializedRequest, 'url' | 'headers'> {
@@ -28,9 +29,11 @@ export interface SerializedResponse {
28
29
  status: number
29
30
  statusText: string
30
31
  headers: Array<[string, string]>
31
- body: string
32
+ body: string | null
32
33
  }
33
34
 
35
+ const logger = createLogger('remote-http')
36
+
34
37
  export class RemoteHttpInterceptor extends BatchInterceptor<
35
38
  [ClientRequestInterceptor, XMLHttpRequestInterceptor, FetchInterceptor]
36
39
  > {
@@ -62,10 +65,10 @@ export class RemoteHttpInterceptor extends BatchInterceptor<
62
65
  body: ['GET', 'HEAD'].includes(request.method)
63
66
  ? null
64
67
  : await request.text(),
65
- } as SerializedRequest)
68
+ } satisfies SerializedRequest)
66
69
 
67
- this.logger.info(
68
- 'sent serialized request to the child:',
70
+ logger.verbose(
71
+ 'sent serialized request to child: %s',
69
72
  serializedRequest
70
73
  )
71
74
 
@@ -108,7 +111,7 @@ export class RemoteHttpInterceptor extends BatchInterceptor<
108
111
  })
109
112
 
110
113
  // Listen for the mocked response message from the parent.
111
- this.logger.info(
114
+ logger.verbose(
112
115
  'add "message" listener to the parent process',
113
116
  handleParentMessage
114
117
  )
@@ -141,22 +144,24 @@ export interface RemoveResolverOptions {
141
144
  }
142
145
 
143
146
  export class RemoteHttpResolver extends Interceptor<HttpRequestEventMap> {
144
- static symbol = Symbol('remote-resolver')
147
+ static symbol = Symbol.for('remote-http-resolver')
145
148
  private process: ChildProcess
146
149
 
147
150
  constructor(options: RemoveResolverOptions) {
148
- super(RemoteHttpResolver.symbol)
151
+ super()
149
152
  this.process = options.process
150
153
  }
151
154
 
152
- protected setup() {
153
- const logger = this.logger.extend('setup')
155
+ protected predicate(): boolean {
156
+ return true
157
+ }
154
158
 
159
+ protected setup() {
155
160
  const handleChildMessage: NodeJS.MessageListener = async (message) => {
156
- logger.info('received message from child!', message)
161
+ logger.verbose('received message from child %o', message)
157
162
 
158
163
  if (typeof message !== 'string' || !message.startsWith('request:')) {
159
- logger.info('unknown message, ignoring...')
164
+ logger.verbose('unknown message, ignoring')
160
165
  return
161
166
  }
162
167
 
@@ -168,9 +173,9 @@ export class RemoteHttpResolver extends Interceptor<HttpRequestEventMap> {
168
173
  const requestJson = JSON.parse(
169
174
  serializedRequest,
170
175
  requestReviver
171
- ) as RevivedRequest
176
+ ) satisfies RevivedRequest
172
177
 
173
- logger.info('parsed intercepted request', requestJson)
178
+ logger.verbose('parsed intercepted request %o', requestJson)
174
179
 
175
180
  const request = new FetchRequest(requestJson.url, {
176
181
  method: requestJson.method,
@@ -180,69 +185,77 @@ export class RemoteHttpResolver extends Interceptor<HttpRequestEventMap> {
180
185
  })
181
186
 
182
187
  const controller = new RequestController(request, {
183
- passthrough: () => {},
188
+ passthrough: () => {
189
+ // Intentionally empty.
190
+ },
184
191
  respondWith: async (response) => {
185
192
  if (isResponseError(response)) {
186
- this.logger.info('received a network error!', { response })
193
+ logger.verbose('received a network error %o', { response })
187
194
  throw new Error('Not implemented')
188
195
  }
189
196
 
190
- this.logger.info('received mocked response!', { response })
191
-
192
197
  const responseClone = FetchResponse.clone(response)
193
198
  const responseText = await responseClone.text()
194
199
 
195
- // // Send the mocked response to the child process.
200
+ // Send the mocked response to the child process.
196
201
  const serializedResponse = JSON.stringify({
197
202
  status: response.status,
198
203
  statusText: response.statusText,
199
204
  headers: Array.from(response.headers.entries()),
200
205
  body: responseText,
201
- } as SerializedResponse)
206
+ } satisfies SerializedResponse)
202
207
 
203
208
  this.process.send(
204
209
  `response:${requestJson.id}:${serializedResponse}`,
205
- (error) => {
210
+ async (error) => {
206
211
  if (error) {
207
212
  return
208
213
  }
209
214
 
210
215
  // Emit an optimistic "response" event at this point,
211
216
  // not to rely on the back-and-forth signaling for the sake of the event.
212
- this.emitter.emit('response', {
213
- request,
214
- requestId: requestJson.id,
215
- response: responseClone,
216
- isMockedResponse: true,
217
- })
217
+ await this.emitter.emitAsPromise(
218
+ new HttpResponseEvent({
219
+ initiator: null,
220
+ request,
221
+ requestId: requestJson.id,
222
+ response: responseClone,
223
+ responseType: 'mock',
224
+ })
225
+ )
218
226
  }
219
227
  )
220
228
 
221
- logger.info(
222
- 'sent serialized mocked response to the parent:',
229
+ logger.verbose(
230
+ 'sent serialized mocked response to parent: %s',
223
231
  serializedResponse
224
232
  )
225
233
  },
226
234
  errorWith: (reason) => {
227
- this.logger.info('request has errored!', { error: reason })
235
+ logger.verbose('request errored %o', { error: reason })
228
236
  throw new Error('Not implemented')
229
237
  },
238
+ }, {
239
+ logger,
240
+ requestId: requestJson.id,
230
241
  })
231
242
 
232
243
  await handleRequest({
244
+ initiator: null,
233
245
  request,
234
246
  requestId: requestJson.id,
235
247
  controller,
236
248
  emitter: this.emitter,
249
+ logger,
237
250
  })
238
251
  }
239
252
 
240
253
  this.subscriptions.push(() => {
241
254
  this.process.removeListener('message', handleChildMessage)
242
- logger.info('removed the "message" listener from the child process!')
255
+ logger.verbose('removed "message" listener from child process')
243
256
  })
244
257
 
245
- logger.info('adding a "message" listener to the child process')
258
+ logger.verbose('adding "message" listener to child process')
246
259
  this.process.addListener('message', handleChildMessage)
247
260
 
248
261
  this.process.once('error', () => this.dispose())
@@ -0,0 +1,40 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks'
2
+ import type { Logger } from './utils/logger'
3
+
4
+ interface RequestContext {
5
+ initiator: unknown
6
+ logger?: Logger
7
+ transformRequest?: (request: Request) => Request
8
+ }
9
+
10
+ export const requestContext = new AsyncLocalStorage<RequestContext>()
11
+
12
+ export function runInRequestContext<T>(callback: () => T, logger?: Logger): T {
13
+ /**
14
+ * @note Never shadow an existing request context. Nested calls
15
+ * (e.g. a patched entry point re-entered synchronously, or a request
16
+ * made within the fetch/XMLHttpRequest interceptor context) must run
17
+ * within the parent context so the sockets they create capture it.
18
+ */
19
+ if (requestContext.getStore()) {
20
+ return callback()
21
+ }
22
+
23
+ /**
24
+ * @note The initiator is the callback's return value (e.g. the
25
+ * "ClientRequest" instance), so it cannot be known before running
26
+ * the callback. The context is mutated in place once the callback
27
+ * returns; readers hold the context object by reference and sample
28
+ * "initiator" only after the request has been written.
29
+ */
30
+ const context: RequestContext = {
31
+ initiator: undefined,
32
+ logger,
33
+ }
34
+
35
+ return requestContext.run(context, () => {
36
+ const initiator = callback()
37
+ context.initiator = initiator
38
+ return initiator
39
+ })
40
+ }
@@ -1,9 +1,9 @@
1
- import { vi, it, expect } from 'vitest'
2
1
  import {
3
2
  RequestController,
4
3
  type RequestControllerSource,
5
- } from './RequestController'
6
- import { InterceptorError } from './InterceptorError'
4
+ } from './request-controller'
5
+ import { InterceptorError } from './interceptor-error'
6
+ import type { Logger } from './utils/logger'
7
7
 
8
8
  const defaultSource = {
9
9
  passthrough() {},
@@ -41,6 +41,40 @@ it('handles a request when calling ".respondWith()" with a mocked response', asy
41
41
  await expect(response.text()).resolves.toBe('hello world')
42
42
  })
43
43
 
44
+ it('logs a mocked resolution and response as a single message', async () => {
45
+ const info = vi.fn<Logger['info']>()
46
+ const logger = {
47
+ info,
48
+ verbose: vi.fn<Logger['verbose']>(),
49
+ isEnabled() {
50
+ return true
51
+ },
52
+ } satisfies Logger
53
+ const controller = new RequestController(
54
+ new Request('http://localhost'),
55
+ defaultSource,
56
+ { logger, requestId: 'request-id' }
57
+ )
58
+
59
+ controller.respondWith(
60
+ new Response(null, {
61
+ status: 201,
62
+ statusText: 'Created',
63
+ headers: {
64
+ 'x-example': 'yes',
65
+ },
66
+ })
67
+ )
68
+
69
+ await vi.waitFor(() => {
70
+ expect(info).toHaveBeenCalledWith(
71
+ '[%s] mocked %s',
72
+ 'request-id',
73
+ ['HTTP 201 Created', 'x-example: yes', '', ''].join('\n')
74
+ )
75
+ })
76
+ })
77
+
44
78
  it('handles the request when calling ".errorWith()" with an error', async () => {
45
79
  const errorWith = vi.fn<RequestControllerSource['errorWith']>()
46
80
  const controller = new RequestController(new Request('http://localhost'), {
@@ -1,11 +1,16 @@
1
- import { DeferredPromise } from '@open-draft/deferred-promise'
2
1
  import { invariant } from 'outvariant'
3
- import { InterceptorError } from './InterceptorError'
2
+ import { InterceptorError } from './interceptor-error'
3
+ import { formatResponse, type Logger } from './utils/logger'
4
4
 
5
5
  export interface RequestControllerSource {
6
- passthrough(): void
7
- respondWith(response: Response): void
8
- errorWith(reason?: unknown): void
6
+ passthrough(): void | Promise<void>
7
+ respondWith(response: Response): void | Promise<void>
8
+ errorWith(reason?: unknown): void | Promise<void>
9
+ }
10
+
11
+ interface RequestControllerOptions {
12
+ logger: Logger
13
+ requestId: string
9
14
  }
10
15
 
11
16
  export class RequestController {
@@ -22,16 +27,16 @@ export class RequestController {
22
27
  */
23
28
  public handled: Promise<void>
24
29
 
30
+ readonly #handled: PromiseWithResolvers<void>
31
+
25
32
  constructor(
26
33
  protected readonly request: Request,
27
- protected readonly source: RequestControllerSource
34
+ protected readonly source: RequestControllerSource,
35
+ protected readonly options?: RequestControllerOptions
28
36
  ) {
29
37
  this.readyState = RequestController.PENDING
30
- this.handled = new DeferredPromise<void>()
31
- }
32
-
33
- get #handled() {
34
- return this.handled as DeferredPromise<void>
38
+ this.#handled = Promise.withResolvers<void>()
39
+ this.handled = this.#handled.promise
35
40
  }
36
41
 
37
42
  /**
@@ -47,6 +52,9 @@ export class RequestController {
47
52
  )
48
53
 
49
54
  this.readyState = RequestController.PASSTHROUGH
55
+ if (this.options) {
56
+ this.options.logger.info('[%s] passthrough', this.options.requestId)
57
+ }
50
58
  await this.source.passthrough()
51
59
  this.#handled.resolve()
52
60
  }
@@ -72,6 +80,13 @@ export class RequestController {
72
80
  )
73
81
 
74
82
  this.readyState = RequestController.RESPONSE
83
+ if (this.options?.logger.isEnabled('default')) {
84
+ const { logger, requestId } = this.options
85
+
86
+ void formatResponse(response).then((message) => {
87
+ logger.info('[%s] mocked %s', requestId, message)
88
+ })
89
+ }
75
90
  this.#handled.resolve()
76
91
 
77
92
  /**
@@ -103,6 +118,13 @@ export class RequestController {
103
118
  )
104
119
 
105
120
  this.readyState = RequestController.ERROR
121
+ if (this.options) {
122
+ this.options.logger.info(
123
+ '[%s] error %o',
124
+ this.options.requestId,
125
+ reason
126
+ )
127
+ }
106
128
  this.source.errorWith(reason)
107
129
  this.#handled.resolve()
108
130
  }
@@ -1,5 +1,4 @@
1
- import { it, expect } from 'vitest'
2
- import { decodeBuffer, encodeBuffer } from './bufferUtils'
1
+ import { decodeBuffer, encodeBuffer } from './buffer-utils'
3
2
 
4
3
  it('encodes utf-8 string', () => {
5
4
  const encoded = encodeBuffer('😁')
@@ -0,0 +1,37 @@
1
+ const encoder = new TextEncoder()
2
+
3
+ export function encodeBuffer(text: string) {
4
+ return encoder.encode(text)
5
+ }
6
+
7
+ export function decodeBuffer(buffer: AllowSharedBufferSource, encoding?: string): string {
8
+ const decoder = new TextDecoder(encoding)
9
+ return decoder.decode(buffer)
10
+ }
11
+
12
+ /**
13
+ * Create an `ArrayBuffer` from the given `Uint8Array`.
14
+ * Takes the byte offset into account to produce the right buffer
15
+ * in the case when the buffer is bigger than the data view.
16
+ */
17
+ export function toArrayBuffer(array: Uint8Array<ArrayBuffer>): ArrayBuffer {
18
+ return array.buffer.slice(
19
+ array.byteOffset,
20
+ array.byteOffset + array.byteLength
21
+ )
22
+ }
23
+
24
+ export function toBuffer(
25
+ data: string | Buffer | Uint8Array<ArrayBufferLike>,
26
+ encoding?: BufferEncoding
27
+ ): Buffer {
28
+ if (Buffer.isBuffer(data)) {
29
+ return data
30
+ }
31
+
32
+ if (data instanceof Uint8Array) {
33
+ return Buffer.from(data.buffer)
34
+ }
35
+
36
+ return Buffer.from(data, encoding)
37
+ }
@@ -1,5 +1,4 @@
1
- import { it, expect } from 'vitest'
2
- import { cloneObject } from './cloneObject'
1
+ import { cloneObject } from './clone-object'
3
2
 
4
3
  it('clones a shallow object', () => {
5
4
  const original = { a: 1, b: 2, c: [1, 2, 3] }
@@ -1,27 +1,27 @@
1
- import { Logger } from '@open-draft/logger'
1
+ import { createLogger } from './logger'
2
2
 
3
- const logger = new Logger('cloneObject')
3
+ const logger = createLogger('clone-object')
4
4
 
5
5
  function isPlainObject(obj?: Record<string, any>): boolean {
6
- logger.info('is plain object?', obj)
6
+ logger.verbose('is plain object? %o', obj)
7
7
 
8
8
  if (obj == null || !obj.constructor?.name) {
9
- logger.info('given object is undefined, not a plain object...')
9
+ logger.verbose('given object is undefined, not a plain object')
10
10
  return false
11
11
  }
12
12
 
13
- logger.info('checking the object constructor:', obj.constructor.name)
13
+ logger.verbose('checking object constructor: %s', obj.constructor.name)
14
14
  return obj.constructor.name === 'Object'
15
15
  }
16
16
 
17
17
  export function cloneObject<ObjectType extends Record<string, any>>(
18
18
  obj: ObjectType
19
19
  ): ObjectType {
20
- logger.info('cloning object:', obj)
20
+ logger.verbose('cloning object %o', obj)
21
21
 
22
22
  const enumerableProperties = Object.entries(obj).reduce<Record<string, any>>(
23
23
  (acc, [key, value]) => {
24
- logger.info('analyzing key-value pair:', key, value)
24
+ logger.verbose('analyzing key-value pair: %s %o', key, value)
25
25
 
26
26
  // Recursively clone only plain objects, omitting class instances.
27
27
  acc[key] = isPlainObject(value) ? cloneObject(value) : value
@@ -31,6 +31,6 @@ export function cloneObject<ObjectType extends Record<string, any>>(
31
31
  )
32
32
 
33
33
  return isPlainObject(obj)
34
- ? enumerableProperties
34
+ ? (enumerableProperties as ObjectType)
35
35
  : Object.assign(Object.getPrototypeOf(obj), enumerableProperties)
36
36
  }
@@ -1,5 +1,4 @@
1
- import { vi, it, expect } from 'vitest'
2
- import { createProxy } from './createProxy'
1
+ import { createProxy } from './create-proxy'
3
2
 
4
3
  it('does not interfere with default constructors', () => {
5
4
  const ProxyClass = createProxy(
@@ -59,7 +58,7 @@ it('does not interfere with existing descriptors', () => {
59
58
 
60
59
  it('infer prototype descriptors', () => {
61
60
  class Child {
62
- ok: boolean
61
+ ok!: boolean
63
62
 
64
63
  set status(nextStatus: number) {
65
64
  this.ok = nextStatus >= 200 && nextStatus < 300
@@ -86,7 +85,10 @@ it('infer prototype descriptors', () => {
86
85
 
87
86
  it('spies on the constructor', () => {
88
87
  const OriginalClass = class {
89
- constructor(public name: string, public age: number) {}
88
+ constructor(
89
+ public name: string,
90
+ public age: number
91
+ ) {}
90
92
  }
91
93
 
92
94
  const constructorCall = vi.fn<
@@ -1,4 +1,4 @@
1
- import { findPropertySource } from './findPropertySource'
1
+ import { findPropertySource } from './find-property-source'
2
2
 
3
3
  export interface ProxyOptions<Target extends Record<string, any>> {
4
4
  constructorCall?(args: Array<unknown>, next: NextFunction<Target>): Target
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from 'vitest'
2
- import { FetchRequest, FetchResponse } from './fetchUtils'
2
+ import { FetchRequest, FetchResponse } from './fetch-utils'
3
3
 
4
4
  describe('FetchRequest', () => {
5
5
  const URL = 'https://example.com/'
@@ -1,5 +1,6 @@
1
- import { canParseUrl } from './canParseUrl'
2
- import { getValueBySymbol } from './getValueBySymbol'
1
+ import { copyRawHeaders } from '../interceptors/ClientRequest/utils/record-raw-headers'
2
+ import { getValueBySymbol } from './get-value-by-symbol'
3
+ import { isResponseError } from './response-utils'
3
4
 
4
5
  interface UndiciRequestState extends RequestInit {}
5
6
 
@@ -164,6 +165,27 @@ const kStatus = Symbol('kStatus')
164
165
  const kUrl = Symbol('kUrl')
165
166
 
166
167
  export class FetchResponse extends Response {
168
+ static from(response: Response, init?: FetchResponseInit): FetchResponse {
169
+ if (response instanceof FetchResponse) {
170
+ return response
171
+ }
172
+
173
+ if (isResponseError(response)) {
174
+ return response
175
+ }
176
+
177
+ const fetchResponse = new FetchResponse(response.body, {
178
+ url: init?.url ?? response.url,
179
+ status: init?.status || response.status,
180
+ statusText: init?.statusText ?? response.statusText,
181
+ headers: init?.headers ?? response.headers,
182
+ })
183
+
184
+ copyRawHeaders(response.headers, fetchResponse.headers)
185
+
186
+ return fetchResponse
187
+ }
188
+
167
189
  /**
168
190
  * Response status codes for responses that cannot have body.
169
191
  * @see https://fetch.spec.whatwg.org/#statuses
@@ -216,7 +238,7 @@ export class FetchResponse extends Response {
216
238
  }
217
239
 
218
240
  static setUrl(url: string | undefined, response: Response): void {
219
- if (!url || url === 'about:' || !canParseUrl(url)) {
241
+ if (!url || url === 'about:' || !URL.canParse(url)) {
220
242
  return
221
243
  }
222
244
 
@@ -283,6 +305,9 @@ export class FetchResponse extends Response {
283
305
  }
284
306
  }
285
307
 
308
+ #status?: number
309
+ #url?: string
310
+
286
311
  constructor(body?: BodyInit | null, init: FetchResponseInit = {}) {
287
312
  const status = init.status ?? 200
288
313
  const safeStatus = FetchResponse.isConfigurableStatusCode(status)
@@ -1,5 +1,4 @@
1
- import { it, expect } from 'vitest'
2
- import { findPropertySource } from './findPropertySource'
1
+ import { findPropertySource } from './find-property-source'
3
2
 
4
3
  it('returns the source for objects without prototypes', () => {
5
4
  const obj = Object.create(null)
@@ -1,5 +1,4 @@
1
- import { describe, it, expect } from 'vitest'
2
- import { getCleanUrl } from './getCleanUrl'
1
+ import { getCleanUrl } from './get-clean-url'
3
2
 
4
3
  describe('getCleanUrl', () => {
5
4
  describe('given a URL without query parameters', () => {
@@ -1,7 +1,6 @@
1
- import { it, expect } from 'vitest'
2
- import { Agent as HttpAgent } from 'http'
3
- import { RequestOptions, Agent as HttpsAgent } from 'https'
4
- import { getUrlByRequestOptions } from './getUrlByRequestOptions'
1
+ import { Agent as HttpAgent } from 'node:http'
2
+ import { RequestOptions, Agent as HttpsAgent } from 'node:https'
3
+ import { getUrlByRequestOptions } from './get-url-by-request-options'
5
4
 
6
5
  it('returns a URL based on the basic RequestOptions', () => {
7
6
  expect(
@@ -130,9 +129,7 @@ it('use "hostname" if both "hostname" and "host" are specified', () => {
130
129
  path: '/resource',
131
130
  }
132
131
 
133
- expect(getUrlByRequestOptions(options).href).toBe(
134
- 'https://hostname/resource'
135
- )
132
+ expect(getUrlByRequestOptions(options).href).toBe('https://hostname/resource')
136
133
  })
137
134
 
138
135
  it('parses "host" in IPv6', () => {
@@ -149,7 +146,6 @@ it('parses "host" in IPv6', () => {
149
146
  path: '/resource',
150
147
  }).href
151
148
  ).toBe('http://[::1]/resource')
152
-
153
149
  })
154
150
 
155
151
  it('parses "host" and "port" in IPv6', () => {