msw 2.0.12 → 2.0.13

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 (404) hide show
  1. package/lib/browser/index.d.mts +104 -0
  2. package/lib/browser/index.d.ts +1 -1
  3. package/lib/browser/index.js +1 -0
  4. package/lib/browser/index.js.map +1 -0
  5. package/lib/browser/index.mjs +1 -0
  6. package/lib/browser/index.mjs.map +1 -0
  7. package/lib/core/{GraphQLHandler-da09c680.d.ts → GraphQLHandler-SHlRCcy4.d.ts} +2 -2
  8. package/lib/core/GraphQLHandler-zlmUDnN6.d.mts +97 -0
  9. package/lib/core/HttpResponse.d.mts +2 -0
  10. package/lib/core/HttpResponse.d.ts +1 -1
  11. package/lib/core/HttpResponse.js +1 -0
  12. package/lib/core/HttpResponse.js.map +1 -0
  13. package/lib/core/HttpResponse.mjs +1 -0
  14. package/lib/core/HttpResponse.mjs.map +1 -0
  15. package/lib/core/{RequestHandler-25f9cfd1.d.ts → RequestHandler-rBDJQrEf.d.ts} +1 -1
  16. package/lib/core/RequestHandler-vxZdj6Tw.d.mts +179 -0
  17. package/lib/core/SetupApi.d.mts +26 -0
  18. package/lib/core/SetupApi.d.ts +1 -1
  19. package/lib/core/SetupApi.js +1 -0
  20. package/lib/core/SetupApi.js.map +1 -0
  21. package/lib/core/SetupApi.mjs +1 -0
  22. package/lib/core/SetupApi.mjs.map +1 -0
  23. package/lib/core/bypass.d.mts +16 -0
  24. package/lib/core/bypass.d.ts +1 -1
  25. package/lib/core/bypass.js +1 -0
  26. package/lib/core/bypass.js.map +1 -0
  27. package/lib/core/bypass.mjs +1 -0
  28. package/lib/core/bypass.mjs.map +1 -0
  29. package/lib/core/delay.d.mts +18 -0
  30. package/lib/core/delay.d.ts +1 -1
  31. package/lib/core/delay.js +1 -0
  32. package/lib/core/delay.js.map +1 -0
  33. package/lib/core/delay.mjs +1 -0
  34. package/lib/core/delay.mjs.map +1 -0
  35. package/lib/core/graphql.d.mts +109 -0
  36. package/lib/core/graphql.d.ts +3 -3
  37. package/lib/core/graphql.js +1 -0
  38. package/lib/core/graphql.js.map +1 -0
  39. package/lib/core/graphql.mjs +1 -0
  40. package/lib/core/graphql.mjs.map +1 -0
  41. package/lib/core/handlers/GraphQLHandler.d.mts +5 -0
  42. package/lib/core/handlers/GraphQLHandler.d.ts +2 -2
  43. package/lib/core/handlers/GraphQLHandler.js +3 -2
  44. package/lib/core/handlers/GraphQLHandler.js.map +1 -0
  45. package/lib/core/handlers/GraphQLHandler.mjs +3 -2
  46. package/lib/core/handlers/GraphQLHandler.mjs.map +1 -0
  47. package/lib/core/handlers/HttpHandler.d.mts +62 -0
  48. package/lib/core/handlers/HttpHandler.d.ts +2 -2
  49. package/lib/core/handlers/HttpHandler.js +1 -0
  50. package/lib/core/handlers/HttpHandler.js.map +1 -0
  51. package/lib/core/handlers/HttpHandler.mjs +1 -0
  52. package/lib/core/handlers/HttpHandler.mjs.map +1 -0
  53. package/lib/core/handlers/RequestHandler.d.mts +2 -0
  54. package/lib/core/handlers/RequestHandler.d.ts +1 -1
  55. package/lib/core/handlers/RequestHandler.js +3 -2
  56. package/lib/core/handlers/RequestHandler.js.map +1 -0
  57. package/lib/core/handlers/RequestHandler.mjs +3 -2
  58. package/lib/core/handlers/RequestHandler.mjs.map +1 -0
  59. package/lib/core/http.d.mts +26 -0
  60. package/lib/core/http.d.ts +1 -1
  61. package/lib/core/http.js +1 -0
  62. package/lib/core/http.js.map +1 -0
  63. package/lib/core/http.mjs +1 -0
  64. package/lib/core/http.mjs.map +1 -0
  65. package/lib/core/index.d.mts +18 -0
  66. package/lib/core/index.d.ts +2 -2
  67. package/lib/core/index.js +1 -0
  68. package/lib/core/index.js.map +1 -0
  69. package/lib/core/index.mjs +1 -0
  70. package/lib/core/index.mjs.map +1 -0
  71. package/lib/core/passthrough.d.mts +17 -0
  72. package/lib/core/passthrough.js +1 -0
  73. package/lib/core/passthrough.js.map +1 -0
  74. package/lib/core/passthrough.mjs +1 -0
  75. package/lib/core/passthrough.mjs.map +1 -0
  76. package/lib/core/sharedOptions.d.mts +66 -0
  77. package/lib/core/sharedOptions.d.ts +2 -2
  78. package/lib/core/sharedOptions.js +1 -0
  79. package/lib/core/sharedOptions.js.map +1 -0
  80. package/lib/core/sharedOptions.mjs +1 -0
  81. package/lib/core/sharedOptions.mjs.map +1 -0
  82. package/lib/core/typeUtils.d.mts +7 -0
  83. package/lib/core/typeUtils.d.ts +1 -1
  84. package/lib/core/typeUtils.js +1 -0
  85. package/lib/core/typeUtils.js.map +1 -0
  86. package/lib/core/typeUtils.mjs +1 -0
  87. package/lib/core/typeUtils.mjs.map +1 -0
  88. package/lib/core/utils/HttpResponse/decorators.d.mts +12 -0
  89. package/lib/core/utils/HttpResponse/decorators.d.ts +2 -2
  90. package/lib/core/utils/HttpResponse/decorators.js +1 -0
  91. package/lib/core/utils/HttpResponse/decorators.js.map +1 -0
  92. package/lib/core/utils/HttpResponse/decorators.mjs +1 -0
  93. package/lib/core/utils/HttpResponse/decorators.mjs.map +1 -0
  94. package/lib/core/utils/getResponse.d.mts +2 -0
  95. package/lib/core/utils/getResponse.d.ts +1 -1
  96. package/lib/core/utils/getResponse.js +1 -0
  97. package/lib/core/utils/getResponse.js.map +1 -0
  98. package/lib/core/utils/getResponse.mjs +1 -0
  99. package/lib/core/utils/getResponse.mjs.map +1 -0
  100. package/lib/core/utils/handleRequest.d.mts +37 -0
  101. package/lib/core/utils/handleRequest.d.ts +2 -2
  102. package/lib/core/utils/handleRequest.js +1 -0
  103. package/lib/core/utils/handleRequest.js.map +1 -0
  104. package/lib/core/utils/handleRequest.mjs +1 -0
  105. package/lib/core/utils/handleRequest.mjs.map +1 -0
  106. package/lib/core/utils/internal/Disposable.d.mts +7 -0
  107. package/lib/core/utils/internal/Disposable.d.ts +1 -1
  108. package/lib/core/utils/internal/Disposable.js +1 -0
  109. package/lib/core/utils/internal/Disposable.js.map +1 -0
  110. package/lib/core/utils/internal/Disposable.mjs +1 -0
  111. package/lib/core/utils/internal/Disposable.mjs.map +1 -0
  112. package/lib/core/utils/internal/checkGlobals.d.mts +3 -0
  113. package/lib/core/utils/internal/checkGlobals.js +1 -0
  114. package/lib/core/utils/internal/checkGlobals.js.map +1 -0
  115. package/lib/core/utils/internal/checkGlobals.mjs +1 -0
  116. package/lib/core/utils/internal/checkGlobals.mjs.map +1 -0
  117. package/lib/core/utils/internal/devUtils.d.mts +19 -0
  118. package/lib/core/utils/internal/devUtils.js +1 -0
  119. package/lib/core/utils/internal/devUtils.js.map +1 -0
  120. package/lib/core/utils/internal/devUtils.mjs +1 -0
  121. package/lib/core/utils/internal/devUtils.mjs.map +1 -0
  122. package/lib/core/utils/internal/getCallFrame.d.mts +6 -0
  123. package/lib/core/utils/internal/getCallFrame.js +1 -0
  124. package/lib/core/utils/internal/getCallFrame.js.map +1 -0
  125. package/lib/core/utils/internal/getCallFrame.mjs +1 -0
  126. package/lib/core/utils/internal/getCallFrame.mjs.map +1 -0
  127. package/lib/core/utils/internal/isIterable.d.mts +6 -0
  128. package/lib/core/utils/internal/isIterable.js +1 -0
  129. package/lib/core/utils/internal/isIterable.js.map +1 -0
  130. package/lib/core/utils/internal/isIterable.mjs +1 -0
  131. package/lib/core/utils/internal/isIterable.mjs.map +1 -0
  132. package/lib/core/utils/internal/isObject.d.mts +6 -0
  133. package/lib/core/utils/internal/isObject.js +1 -0
  134. package/lib/core/utils/internal/isObject.js.map +1 -0
  135. package/lib/core/utils/internal/isObject.mjs +1 -0
  136. package/lib/core/utils/internal/isObject.mjs.map +1 -0
  137. package/lib/core/utils/internal/isStringEqual.d.mts +6 -0
  138. package/lib/core/utils/internal/isStringEqual.js +1 -0
  139. package/lib/core/utils/internal/isStringEqual.js.map +1 -0
  140. package/lib/core/utils/internal/isStringEqual.mjs +1 -0
  141. package/lib/core/utils/internal/isStringEqual.mjs.map +1 -0
  142. package/lib/core/utils/internal/jsonParse.d.mts +7 -0
  143. package/lib/core/utils/internal/jsonParse.js +1 -0
  144. package/lib/core/utils/internal/jsonParse.js.map +1 -0
  145. package/lib/core/utils/internal/jsonParse.mjs +1 -0
  146. package/lib/core/utils/internal/jsonParse.mjs.map +1 -0
  147. package/lib/core/utils/internal/mergeRight.d.mts +7 -0
  148. package/lib/core/utils/internal/mergeRight.js +1 -0
  149. package/lib/core/utils/internal/mergeRight.js.map +1 -0
  150. package/lib/core/utils/internal/mergeRight.mjs +1 -0
  151. package/lib/core/utils/internal/mergeRight.mjs.map +1 -0
  152. package/lib/core/utils/internal/parseGraphQLRequest.d.mts +5 -0
  153. package/lib/core/utils/internal/parseGraphQLRequest.d.ts +2 -2
  154. package/lib/core/utils/internal/parseGraphQLRequest.js +1 -0
  155. package/lib/core/utils/internal/parseGraphQLRequest.js.map +1 -0
  156. package/lib/core/utils/internal/parseGraphQLRequest.mjs +1 -0
  157. package/lib/core/utils/internal/parseGraphQLRequest.mjs.map +1 -0
  158. package/lib/core/utils/internal/parseMultipartData.d.mts +10 -0
  159. package/lib/core/utils/internal/parseMultipartData.d.ts +1 -1
  160. package/lib/core/utils/internal/parseMultipartData.js +1 -0
  161. package/lib/core/utils/internal/parseMultipartData.js.map +1 -0
  162. package/lib/core/utils/internal/parseMultipartData.mjs +1 -0
  163. package/lib/core/utils/internal/parseMultipartData.mjs.map +1 -0
  164. package/lib/core/utils/internal/pipeEvents.d.mts +8 -0
  165. package/lib/core/utils/internal/pipeEvents.js +1 -0
  166. package/lib/core/utils/internal/pipeEvents.js.map +1 -0
  167. package/lib/core/utils/internal/pipeEvents.mjs +1 -0
  168. package/lib/core/utils/internal/pipeEvents.mjs.map +1 -0
  169. package/lib/core/utils/internal/requestHandlerUtils.d.mts +8 -0
  170. package/lib/core/utils/internal/requestHandlerUtils.d.ts +1 -1
  171. package/lib/core/utils/internal/requestHandlerUtils.js +1 -0
  172. package/lib/core/utils/internal/requestHandlerUtils.js.map +1 -0
  173. package/lib/core/utils/internal/requestHandlerUtils.mjs +1 -0
  174. package/lib/core/utils/internal/requestHandlerUtils.mjs.map +1 -0
  175. package/lib/core/utils/internal/toReadonlyArray.d.mts +6 -0
  176. package/lib/core/utils/internal/toReadonlyArray.js +1 -0
  177. package/lib/core/utils/internal/toReadonlyArray.js.map +1 -0
  178. package/lib/core/utils/internal/toReadonlyArray.mjs +1 -0
  179. package/lib/core/utils/internal/toReadonlyArray.mjs.map +1 -0
  180. package/lib/core/utils/internal/tryCatch.d.mts +3 -0
  181. package/lib/core/utils/internal/tryCatch.js +1 -0
  182. package/lib/core/utils/internal/tryCatch.js.map +1 -0
  183. package/lib/core/utils/internal/tryCatch.mjs +1 -0
  184. package/lib/core/utils/internal/tryCatch.mjs.map +1 -0
  185. package/lib/core/utils/internal/uuidv4.d.mts +3 -0
  186. package/lib/core/utils/internal/uuidv4.js +1 -0
  187. package/lib/core/utils/internal/uuidv4.js.map +1 -0
  188. package/lib/core/utils/internal/uuidv4.mjs +1 -0
  189. package/lib/core/utils/internal/uuidv4.mjs.map +1 -0
  190. package/lib/core/utils/logging/getStatusCodeColor.d.mts +11 -0
  191. package/lib/core/utils/logging/getStatusCodeColor.js +1 -0
  192. package/lib/core/utils/logging/getStatusCodeColor.js.map +1 -0
  193. package/lib/core/utils/logging/getStatusCodeColor.mjs +1 -0
  194. package/lib/core/utils/logging/getStatusCodeColor.mjs.map +1 -0
  195. package/lib/core/utils/logging/getTimestamp.d.mts +6 -0
  196. package/lib/core/utils/logging/getTimestamp.js +1 -0
  197. package/lib/core/utils/logging/getTimestamp.js.map +1 -0
  198. package/lib/core/utils/logging/getTimestamp.mjs +1 -0
  199. package/lib/core/utils/logging/getTimestamp.mjs.map +1 -0
  200. package/lib/core/utils/logging/serializeRequest.d.mts +12 -0
  201. package/lib/core/utils/logging/serializeRequest.d.ts +1 -1
  202. package/lib/core/utils/logging/serializeRequest.js +1 -0
  203. package/lib/core/utils/logging/serializeRequest.js.map +1 -0
  204. package/lib/core/utils/logging/serializeRequest.mjs +1 -0
  205. package/lib/core/utils/logging/serializeRequest.mjs.map +1 -0
  206. package/lib/core/utils/logging/serializeResponse.d.mts +9 -0
  207. package/lib/core/utils/logging/serializeResponse.d.ts +1 -1
  208. package/lib/core/utils/logging/serializeResponse.js +1 -0
  209. package/lib/core/utils/logging/serializeResponse.js.map +1 -0
  210. package/lib/core/utils/logging/serializeResponse.mjs +1 -0
  211. package/lib/core/utils/logging/serializeResponse.mjs.map +1 -0
  212. package/lib/core/utils/matching/matchRequestUrl.d.mts +19 -0
  213. package/lib/core/utils/matching/matchRequestUrl.d.ts +1 -1
  214. package/lib/core/utils/matching/matchRequestUrl.js +1 -0
  215. package/lib/core/utils/matching/matchRequestUrl.js.map +1 -0
  216. package/lib/core/utils/matching/matchRequestUrl.mjs +1 -0
  217. package/lib/core/utils/matching/matchRequestUrl.mjs.map +1 -0
  218. package/lib/core/utils/matching/normalizePath.d.mts +12 -0
  219. package/lib/core/utils/matching/normalizePath.js +1 -0
  220. package/lib/core/utils/matching/normalizePath.js.map +1 -0
  221. package/lib/core/utils/matching/normalizePath.mjs +1 -0
  222. package/lib/core/utils/matching/normalizePath.mjs.map +1 -0
  223. package/lib/core/utils/request/getPublicUrlFromRequest.d.mts +7 -0
  224. package/lib/core/utils/request/getPublicUrlFromRequest.js +1 -0
  225. package/lib/core/utils/request/getPublicUrlFromRequest.js.map +1 -0
  226. package/lib/core/utils/request/getPublicUrlFromRequest.mjs +1 -0
  227. package/lib/core/utils/request/getPublicUrlFromRequest.mjs.map +1 -0
  228. package/lib/core/utils/request/getRequestCookies.d.mts +8 -0
  229. package/lib/core/utils/request/getRequestCookies.js +1 -0
  230. package/lib/core/utils/request/getRequestCookies.js.map +1 -0
  231. package/lib/core/utils/request/getRequestCookies.mjs +1 -0
  232. package/lib/core/utils/request/getRequestCookies.mjs.map +1 -0
  233. package/lib/core/utils/request/onUnhandledRequest.d.mts +12 -0
  234. package/lib/core/utils/request/onUnhandledRequest.d.ts +2 -2
  235. package/lib/core/utils/request/onUnhandledRequest.js +1 -0
  236. package/lib/core/utils/request/onUnhandledRequest.js.map +1 -0
  237. package/lib/core/utils/request/onUnhandledRequest.mjs +1 -0
  238. package/lib/core/utils/request/onUnhandledRequest.mjs.map +1 -0
  239. package/lib/core/utils/request/readResponseCookies.d.mts +3 -0
  240. package/lib/core/utils/request/readResponseCookies.js +1 -0
  241. package/lib/core/utils/request/readResponseCookies.js.map +1 -0
  242. package/lib/core/utils/request/readResponseCookies.mjs +1 -0
  243. package/lib/core/utils/request/readResponseCookies.mjs.map +1 -0
  244. package/lib/core/utils/toResponseInit.d.mts +3 -0
  245. package/lib/core/utils/toResponseInit.js +1 -0
  246. package/lib/core/utils/toResponseInit.js.map +1 -0
  247. package/lib/core/utils/toResponseInit.mjs +1 -0
  248. package/lib/core/utils/toResponseInit.mjs.map +1 -0
  249. package/lib/core/utils/url/cleanUrl.d.mts +7 -0
  250. package/lib/core/utils/url/cleanUrl.js +1 -0
  251. package/lib/core/utils/url/cleanUrl.js.map +1 -0
  252. package/lib/core/utils/url/cleanUrl.mjs +1 -0
  253. package/lib/core/utils/url/cleanUrl.mjs.map +1 -0
  254. package/lib/core/utils/url/getAbsoluteUrl.d.mts +6 -0
  255. package/lib/core/utils/url/getAbsoluteUrl.js +1 -0
  256. package/lib/core/utils/url/getAbsoluteUrl.js.map +1 -0
  257. package/lib/core/utils/url/getAbsoluteUrl.mjs +1 -0
  258. package/lib/core/utils/url/getAbsoluteUrl.mjs.map +1 -0
  259. package/lib/core/utils/url/isAbsoluteUrl.d.mts +6 -0
  260. package/lib/core/utils/url/isAbsoluteUrl.js +1 -0
  261. package/lib/core/utils/url/isAbsoluteUrl.js.map +1 -0
  262. package/lib/core/utils/url/isAbsoluteUrl.mjs +1 -0
  263. package/lib/core/utils/url/isAbsoluteUrl.mjs.map +1 -0
  264. package/lib/iife/index.js +20 -19
  265. package/lib/iife/index.js.map +1 -0
  266. package/lib/mockServiceWorker.js +1 -1
  267. package/lib/native/index.d.mts +75 -0
  268. package/lib/native/index.js +1 -0
  269. package/lib/native/index.js.map +1 -0
  270. package/lib/native/index.mjs +1 -0
  271. package/lib/native/index.mjs.map +1 -0
  272. package/lib/node/index.d.mts +75 -0
  273. package/lib/node/index.d.ts +1 -1
  274. package/lib/node/index.js +1 -0
  275. package/lib/node/index.js.map +1 -0
  276. package/lib/node/index.mjs +1 -0
  277. package/lib/node/index.mjs.map +1 -0
  278. package/package.json +5 -4
  279. package/src/browser/global.browser.d.ts +1 -0
  280. package/src/browser/index.ts +3 -0
  281. package/src/browser/setupWorker/glossary.ts +259 -0
  282. package/src/browser/setupWorker/setupWorker.node.test.ts +10 -0
  283. package/src/browser/setupWorker/setupWorker.ts +199 -0
  284. package/src/browser/setupWorker/start/createFallbackRequestListener.ts +67 -0
  285. package/src/browser/setupWorker/start/createFallbackStart.ts +21 -0
  286. package/src/browser/setupWorker/start/createRequestListener.ts +127 -0
  287. package/src/browser/setupWorker/start/createResponseListener.ts +58 -0
  288. package/src/browser/setupWorker/start/createStartHandler.ts +143 -0
  289. package/src/browser/setupWorker/start/utils/createMessageChannel.ts +32 -0
  290. package/src/browser/setupWorker/start/utils/enableMocking.ts +32 -0
  291. package/src/browser/setupWorker/start/utils/getWorkerByRegistration.ts +25 -0
  292. package/src/browser/setupWorker/start/utils/getWorkerInstance.ts +94 -0
  293. package/src/browser/setupWorker/start/utils/prepareStartHandler.test.ts +59 -0
  294. package/src/browser/setupWorker/start/utils/prepareStartHandler.ts +44 -0
  295. package/src/browser/setupWorker/start/utils/printStartMessage.test.ts +84 -0
  296. package/src/browser/setupWorker/start/utils/printStartMessage.ts +40 -0
  297. package/src/browser/setupWorker/start/utils/validateWorkerScope.ts +18 -0
  298. package/src/browser/setupWorker/stop/createFallbackStop.ts +11 -0
  299. package/src/browser/setupWorker/stop/createStop.ts +29 -0
  300. package/src/browser/setupWorker/stop/utils/printStopMessage.test.ts +26 -0
  301. package/src/browser/setupWorker/stop/utils/printStopMessage.ts +12 -0
  302. package/src/browser/tsconfig.browser.build.json +6 -0
  303. package/src/browser/tsconfig.browser.json +9 -0
  304. package/src/browser/utils/deferNetworkRequestsUntil.test.ts +48 -0
  305. package/src/browser/utils/deferNetworkRequestsUntil.ts +29 -0
  306. package/src/browser/utils/getAbsoluteWorkerUrl.test.ts +31 -0
  307. package/src/browser/utils/getAbsoluteWorkerUrl.ts +7 -0
  308. package/src/browser/utils/parseWorkerRequest.ts +15 -0
  309. package/src/browser/utils/pruneGetRequestBody.test.ts +53 -0
  310. package/src/browser/utils/pruneGetRequestBody.ts +21 -0
  311. package/src/browser/utils/requestIntegrityCheck.ts +23 -0
  312. package/src/browser/utils/supportsReadableStreamTransfer.ts +17 -0
  313. package/src/core/HttpResponse.test.ts +200 -0
  314. package/src/core/HttpResponse.ts +134 -0
  315. package/src/core/SetupApi.ts +95 -0
  316. package/src/core/bypass.test.ts +47 -0
  317. package/src/core/bypass.ts +36 -0
  318. package/src/core/delay.ts +70 -0
  319. package/src/core/graphql.test.ts +11 -0
  320. package/src/core/graphql.ts +138 -0
  321. package/src/core/handlers/GraphQLHandler.test.ts +820 -0
  322. package/src/core/handlers/GraphQLHandler.ts +263 -0
  323. package/src/core/handlers/HttpHandler.test.ts +218 -0
  324. package/src/core/handlers/HttpHandler.ts +169 -0
  325. package/src/core/handlers/RequestHandler.ts +338 -0
  326. package/src/core/http.test.ts +15 -0
  327. package/src/core/http.ts +51 -0
  328. package/src/core/index.ts +56 -0
  329. package/src/core/passthrough.test.ts +13 -0
  330. package/src/core/passthrough.ts +23 -0
  331. package/src/core/sharedOptions.ts +66 -0
  332. package/src/core/typeUtils.ts +20 -0
  333. package/src/core/utils/HttpResponse/decorators.ts +56 -0
  334. package/src/core/utils/getResponse.ts +55 -0
  335. package/src/core/utils/handleRequest.test.ts +554 -0
  336. package/src/core/utils/handleRequest.ts +132 -0
  337. package/src/core/utils/internal/Disposable.ts +9 -0
  338. package/src/core/utils/internal/checkGlobals.ts +17 -0
  339. package/src/core/utils/internal/devUtils.ts +31 -0
  340. package/src/core/utils/internal/getCallFrame.test.ts +154 -0
  341. package/src/core/utils/internal/getCallFrame.ts +35 -0
  342. package/src/core/utils/internal/isIterable.test.ts +23 -0
  343. package/src/core/utils/internal/isIterable.ts +12 -0
  344. package/src/core/utils/internal/isObject.test.ts +20 -0
  345. package/src/core/utils/internal/isObject.ts +6 -0
  346. package/src/core/utils/internal/isStringEqual.test.ts +45 -0
  347. package/src/core/utils/internal/isStringEqual.ts +6 -0
  348. package/src/core/utils/internal/jsonParse.test.ts +13 -0
  349. package/src/core/utils/internal/jsonParse.ts +13 -0
  350. package/src/core/utils/internal/mergeRight.test.ts +43 -0
  351. package/src/core/utils/internal/mergeRight.ts +27 -0
  352. package/src/core/utils/internal/parseGraphQLRequest.test.ts +99 -0
  353. package/src/core/utils/internal/parseGraphQLRequest.ts +205 -0
  354. package/src/core/utils/internal/parseMultipartData.test.ts +76 -0
  355. package/src/core/utils/internal/parseMultipartData.ts +104 -0
  356. package/src/core/utils/internal/pipeEvents.test.ts +14 -0
  357. package/src/core/utils/internal/pipeEvents.ts +25 -0
  358. package/src/core/utils/internal/requestHandlerUtils.ts +21 -0
  359. package/src/core/utils/internal/toReadonlyArray.test.ts +30 -0
  360. package/src/core/utils/internal/toReadonlyArray.ts +8 -0
  361. package/src/core/utils/internal/tryCatch.test.ts +29 -0
  362. package/src/core/utils/internal/tryCatch.ts +11 -0
  363. package/src/core/utils/internal/uuidv4.ts +3 -0
  364. package/src/core/utils/logging/getStatusCodeColor.test.ts +22 -0
  365. package/src/core/utils/logging/getStatusCodeColor.ts +20 -0
  366. package/src/core/utils/logging/getTimestamp.test.ts +18 -0
  367. package/src/core/utils/logging/getTimestamp.ts +12 -0
  368. package/src/core/utils/logging/serializeRequest.test.ts +23 -0
  369. package/src/core/utils/logging/serializeRequest.ts +23 -0
  370. package/src/core/utils/logging/serializeResponse.test.ts +77 -0
  371. package/src/core/utils/logging/serializeResponse.ts +31 -0
  372. package/src/core/utils/matching/matchRequestUrl.test.ts +114 -0
  373. package/src/core/utils/matching/matchRequestUrl.ts +73 -0
  374. package/src/core/utils/matching/normalizePath.node.test.ts +44 -0
  375. package/src/core/utils/matching/normalizePath.test.ts +50 -0
  376. package/src/core/utils/matching/normalizePath.ts +21 -0
  377. package/src/core/utils/request/getPublicUrlFromRequest.test.ts +26 -0
  378. package/src/core/utils/request/getPublicUrlFromRequest.ts +15 -0
  379. package/src/core/utils/request/getRequestCookies.node.test.ts +29 -0
  380. package/src/core/utils/request/getRequestCookies.test.ts +64 -0
  381. package/src/core/utils/request/getRequestCookies.ts +75 -0
  382. package/src/core/utils/request/onUnhandledRequest.test.ts +215 -0
  383. package/src/core/utils/request/onUnhandledRequest.ts +247 -0
  384. package/src/core/utils/request/readResponseCookies.ts +9 -0
  385. package/src/core/utils/toResponseInit.ts +7 -0
  386. package/src/core/utils/url/cleanUrl.test.ts +17 -0
  387. package/src/core/utils/url/cleanUrl.ts +12 -0
  388. package/src/core/utils/url/getAbsoluteUrl.node.test.ts +19 -0
  389. package/src/core/utils/url/getAbsoluteUrl.test.ts +29 -0
  390. package/src/core/utils/url/getAbsoluteUrl.ts +26 -0
  391. package/src/core/utils/url/isAbsoluteUrl.test.ts +32 -0
  392. package/src/core/utils/url/isAbsoluteUrl.ts +6 -0
  393. package/src/iife/index.ts +2 -0
  394. package/src/mockServiceWorker.js +287 -0
  395. package/src/native/index.ts +17 -0
  396. package/src/node/SetupServerApi.ts +113 -0
  397. package/src/node/glossary.ts +62 -0
  398. package/src/node/index.ts +3 -0
  399. package/src/node/setupServer.ts +21 -0
  400. package/src/node/utils/isNodeExceptionLike.ts +14 -0
  401. package/src/tsconfig.core.build.json +6 -0
  402. package/src/tsconfig.node.build.json +6 -0
  403. package/src/tsconfig.node.json +8 -0
  404. package/src/tsconfig.src.json +15 -0
@@ -0,0 +1,554 @@
1
+ /**
2
+ * @vitest-environment jsdom
3
+ */
4
+ import { Emitter } from 'strict-event-emitter'
5
+ import { LifeCycleEventsMap, SharedOptions } from '../sharedOptions'
6
+ import { RequestHandler } from '../handlers/RequestHandler'
7
+ import { http } from '../http'
8
+ import { handleRequest, HandleRequestOptions } from './handleRequest'
9
+ import { RequiredDeep } from '../typeUtils'
10
+ import { uuidv4 } from './internal/uuidv4'
11
+ import { HttpResponse } from '../HttpResponse'
12
+ import { passthrough } from '../passthrough'
13
+
14
+ const options: RequiredDeep<SharedOptions> = {
15
+ onUnhandledRequest: vi.fn(),
16
+ }
17
+ const handleRequestOptions: Partial<Record<keyof HandleRequestOptions, any>> = {
18
+ onPassthroughResponse: vi.fn(),
19
+ onMockedResponse: vi.fn(),
20
+ }
21
+
22
+ function setup() {
23
+ const emitter = new Emitter<LifeCycleEventsMap>()
24
+ const listener = vi.fn()
25
+
26
+ const createMockListener = (name: string) => {
27
+ return (...args: any) => {
28
+ listener(name, ...args)
29
+ }
30
+ }
31
+
32
+ emitter.on('request:start', createMockListener('request:start'))
33
+ emitter.on('request:match', createMockListener('request:match'))
34
+ emitter.on('request:unhandled', createMockListener('request:unhandled'))
35
+ emitter.on('request:end', createMockListener('request:end'))
36
+ emitter.on('response:mocked', createMockListener('response:mocked'))
37
+ emitter.on('response:bypass', createMockListener('response:bypass'))
38
+
39
+ const events = listener.mock.calls
40
+ return { emitter, events }
41
+ }
42
+
43
+ beforeEach(() => {
44
+ vi.spyOn(global.console, 'warn').mockImplementation(() => void 0)
45
+ })
46
+
47
+ afterEach(() => {
48
+ vi.resetAllMocks()
49
+ })
50
+
51
+ test('returns undefined for a request with the "x-msw-intention" header equal to "bypass"', async () => {
52
+ const { emitter, events } = setup()
53
+
54
+ const requestId = uuidv4()
55
+ const request = new Request(new URL('http://localhost/user'), {
56
+ headers: new Headers({
57
+ 'x-msw-intention': 'bypass',
58
+ }),
59
+ })
60
+ const handlers: Array<RequestHandler> = []
61
+
62
+ const result = await handleRequest(
63
+ request,
64
+ requestId,
65
+ handlers,
66
+ options,
67
+ emitter,
68
+ handleRequestOptions,
69
+ )
70
+
71
+ expect(result).toBeUndefined()
72
+ expect(events).toEqual([
73
+ ['request:start', { request, requestId }],
74
+ ['request:end', { request, requestId }],
75
+ ])
76
+ expect(options.onUnhandledRequest).not.toHaveBeenCalled()
77
+ expect(handleRequestOptions.onPassthroughResponse).toHaveBeenNthCalledWith(
78
+ 1,
79
+ request,
80
+ )
81
+ expect(handleRequestOptions.onMockedResponse).not.toHaveBeenCalled()
82
+ })
83
+
84
+ test('does not bypass a request with "x-msw-intention" header set to arbitrary value', async () => {
85
+ const { emitter } = setup()
86
+
87
+ const request = new Request(new URL('http://localhost/user'), {
88
+ headers: new Headers({
89
+ 'x-msw-intention': 'invalid',
90
+ }),
91
+ })
92
+ const handlers: Array<RequestHandler> = [
93
+ http.get('/user', () => {
94
+ return HttpResponse.text('hello world')
95
+ }),
96
+ ]
97
+
98
+ const result = await handleRequest(
99
+ request,
100
+ uuidv4(),
101
+ handlers,
102
+ options,
103
+ emitter,
104
+ handleRequestOptions,
105
+ )
106
+
107
+ expect(result).not.toBeUndefined()
108
+ expect(options.onUnhandledRequest).not.toHaveBeenCalled()
109
+ expect(handleRequestOptions.onMockedResponse).toHaveBeenCalledTimes(1)
110
+ })
111
+
112
+ test('reports request as unhandled when it has no matching request handlers', async () => {
113
+ const { emitter, events } = setup()
114
+
115
+ const requestId = uuidv4()
116
+ const request = new Request(new URL('http://localhost/user'))
117
+ const handlers: Array<RequestHandler> = []
118
+
119
+ const result = await handleRequest(
120
+ request,
121
+ requestId,
122
+ handlers,
123
+ options,
124
+ emitter,
125
+ handleRequestOptions,
126
+ )
127
+
128
+ expect(result).toBeUndefined()
129
+ expect(events).toEqual([
130
+ ['request:start', { request, requestId }],
131
+ ['request:unhandled', { request, requestId }],
132
+ ['request:end', { request, requestId }],
133
+ ])
134
+ expect(options.onUnhandledRequest).toHaveBeenNthCalledWith(1, request, {
135
+ warning: expect.any(Function),
136
+ error: expect.any(Function),
137
+ })
138
+ expect(handleRequestOptions.onPassthroughResponse).toHaveBeenNthCalledWith(
139
+ 1,
140
+ request,
141
+ )
142
+ expect(handleRequestOptions.onMockedResponse).not.toHaveBeenCalled()
143
+ })
144
+
145
+ test('returns undefined on a request handler that returns no response', async () => {
146
+ const { emitter, events } = setup()
147
+
148
+ const requestId = uuidv4()
149
+ const request = new Request(new URL('http://localhost/user'))
150
+ const handlers: Array<RequestHandler> = [
151
+ http.get('/user', () => {
152
+ // Intentionally blank response resolver.
153
+ return
154
+ }),
155
+ ]
156
+
157
+ const result = await handleRequest(
158
+ request,
159
+ requestId,
160
+ handlers,
161
+ options,
162
+ emitter,
163
+ handleRequestOptions,
164
+ )
165
+
166
+ expect(result).toBeUndefined()
167
+ expect(events).toEqual([
168
+ ['request:start', { request, requestId }],
169
+ ['request:end', { request, requestId }],
170
+ ])
171
+ expect(options.onUnhandledRequest).not.toHaveBeenCalled()
172
+ expect(handleRequestOptions.onPassthroughResponse).toHaveBeenNthCalledWith(
173
+ 1,
174
+ request,
175
+ )
176
+ expect(handleRequestOptions.onMockedResponse).not.toHaveBeenCalled()
177
+
178
+ /**
179
+ * @note Returning undefined from a resolver no longer prints a warning.
180
+ */
181
+ expect(console.warn).toHaveBeenCalledTimes(0)
182
+ })
183
+
184
+ test('returns the mocked response for a request with a matching request handler', async () => {
185
+ const { emitter, events } = setup()
186
+
187
+ const requestId = uuidv4()
188
+ const request = new Request(new URL('http://localhost/user'))
189
+ const mockedResponse = HttpResponse.json({ firstName: 'John' })
190
+ const handlers: Array<RequestHandler> = [
191
+ http.get('/user', () => {
192
+ return mockedResponse
193
+ }),
194
+ ]
195
+ const lookupResult = {
196
+ handler: handlers[0],
197
+ response: mockedResponse,
198
+ request,
199
+ parsedResult: {
200
+ match: { matches: true, params: {} },
201
+ cookies: {},
202
+ },
203
+ }
204
+
205
+ const result = await handleRequest(
206
+ request,
207
+ requestId,
208
+ handlers,
209
+ options,
210
+ emitter,
211
+ handleRequestOptions,
212
+ )
213
+
214
+ expect(result).toEqual(mockedResponse)
215
+ expect(events).toEqual([
216
+ ['request:start', { request, requestId }],
217
+ ['request:match', { request, requestId }],
218
+ ['request:end', { request, requestId }],
219
+ ])
220
+ expect(handleRequestOptions.onPassthroughResponse).not.toHaveBeenCalled()
221
+
222
+ expect(handleRequestOptions.onMockedResponse).toHaveBeenCalledTimes(1)
223
+ const [mockedResponseParam, lookupResultParam] =
224
+ handleRequestOptions.onMockedResponse.mock.calls[0]
225
+
226
+ expect(mockedResponseParam.status).toBe(mockedResponse.status)
227
+ expect(mockedResponseParam.statusText).toBe(mockedResponse.statusText)
228
+ expect(Object.fromEntries(mockedResponseParam.headers.entries())).toEqual(
229
+ Object.fromEntries(mockedResponse.headers.entries()),
230
+ )
231
+
232
+ expect(lookupResultParam).toEqual({
233
+ handler: lookupResult.handler,
234
+ parsedResult: lookupResult.parsedResult,
235
+ response: expect.objectContaining({
236
+ status: lookupResult.response.status,
237
+ statusText: lookupResult.response.statusText,
238
+ }),
239
+ })
240
+ })
241
+
242
+ test('returns a transformed response if the "transformResponse" option is provided', async () => {
243
+ const { emitter, events } = setup()
244
+
245
+ const requestId = uuidv4()
246
+ const request = new Request(new URL('http://localhost/user'))
247
+ const mockedResponse = HttpResponse.json({ firstName: 'John' })
248
+ const handlers: Array<RequestHandler> = [
249
+ http.get('/user', () => {
250
+ return mockedResponse
251
+ }),
252
+ ]
253
+ const transformResponseImpelemntation = (response: Response): Response => {
254
+ return new Response('transformed', response)
255
+ }
256
+ const transformResponse = vi
257
+ .fn<[Response], Response>()
258
+ .mockImplementation(transformResponseImpelemntation)
259
+ const finalResponse = transformResponseImpelemntation(mockedResponse)
260
+ const lookupResult = {
261
+ handler: handlers[0],
262
+ response: mockedResponse,
263
+ request,
264
+ parsedResult: {
265
+ match: { matches: true, params: {} },
266
+ cookies: {},
267
+ },
268
+ }
269
+
270
+ const result = await handleRequest(
271
+ request,
272
+ requestId,
273
+ handlers,
274
+ options,
275
+ emitter,
276
+ {
277
+ ...handleRequestOptions,
278
+ transformResponse,
279
+ },
280
+ )
281
+
282
+ expect(result?.status).toEqual(finalResponse.status)
283
+ expect(result?.statusText).toEqual(finalResponse.statusText)
284
+ expect(Object.fromEntries(result!.headers.entries())).toEqual(
285
+ Object.fromEntries(mockedResponse.headers.entries()),
286
+ )
287
+
288
+ expect(events).toEqual([
289
+ ['request:start', { request, requestId }],
290
+ ['request:match', { request, requestId }],
291
+ ['request:end', { request, requestId }],
292
+ ])
293
+ expect(handleRequestOptions.onPassthroughResponse).not.toHaveBeenCalled()
294
+
295
+ expect(transformResponse).toHaveBeenCalledTimes(1)
296
+ const [responseParam] = transformResponse.mock.calls[0]
297
+
298
+ expect(responseParam.status).toBe(mockedResponse.status)
299
+ expect(responseParam.statusText).toBe(mockedResponse.statusText)
300
+ expect(Object.fromEntries(responseParam.headers.entries())).toEqual(
301
+ Object.fromEntries(mockedResponse.headers.entries()),
302
+ )
303
+
304
+ expect(handleRequestOptions.onMockedResponse).toHaveBeenCalledTimes(1)
305
+ const [mockedResponseParam, lookupResultParam] =
306
+ handleRequestOptions.onMockedResponse.mock.calls[0]
307
+
308
+ expect(mockedResponseParam.status).toBe(finalResponse.status)
309
+ expect(mockedResponseParam.statusText).toBe(finalResponse.statusText)
310
+ expect(Object.fromEntries(mockedResponseParam.headers.entries())).toEqual(
311
+ Object.fromEntries(mockedResponse.headers.entries()),
312
+ )
313
+ expect(await mockedResponseParam.text()).toBe('transformed')
314
+
315
+ expect(lookupResultParam).toEqual({
316
+ handler: lookupResult.handler,
317
+ parsedResult: lookupResult.parsedResult,
318
+ response: expect.objectContaining({
319
+ status: lookupResult.response.status,
320
+ statusText: lookupResult.response.statusText,
321
+ }),
322
+ })
323
+ })
324
+
325
+ it('returns undefined without warning on a passthrough request', async () => {
326
+ const { emitter, events } = setup()
327
+
328
+ const requestId = uuidv4()
329
+ const request = new Request(new URL('http://localhost/user'))
330
+ const handlers: Array<RequestHandler> = [
331
+ http.get('/user', () => {
332
+ return passthrough()
333
+ }),
334
+ ]
335
+
336
+ const result = await handleRequest(
337
+ request,
338
+ requestId,
339
+ handlers,
340
+ options,
341
+ emitter,
342
+ handleRequestOptions,
343
+ )
344
+
345
+ expect(result).toBeUndefined()
346
+ expect(events).toEqual([
347
+ ['request:start', { request, requestId }],
348
+ ['request:end', { request, requestId }],
349
+ ])
350
+ expect(options.onUnhandledRequest).not.toHaveBeenCalled()
351
+ expect(handleRequestOptions.onPassthroughResponse).toHaveBeenNthCalledWith(
352
+ 1,
353
+ request,
354
+ )
355
+ expect(handleRequestOptions.onMockedResponse).not.toHaveBeenCalled()
356
+ })
357
+
358
+ it('marks the first matching one-time handler as used', async () => {
359
+ const { emitter } = setup()
360
+
361
+ const oneTimeHandler = http.get(
362
+ '/resource',
363
+ () => {
364
+ return HttpResponse.text('One-time')
365
+ },
366
+ { once: true },
367
+ )
368
+ const anotherHandler = http.get('/resource', () => {
369
+ return HttpResponse.text('Another')
370
+ })
371
+ const handlers: Array<RequestHandler> = [oneTimeHandler, anotherHandler]
372
+
373
+ const requestId = uuidv4()
374
+ const request = new Request('http://localhost/resource')
375
+ const firstResult = await handleRequest(
376
+ request,
377
+ requestId,
378
+ handlers,
379
+ options,
380
+ emitter,
381
+ handleRequestOptions,
382
+ )
383
+
384
+ expect(await firstResult?.text()).toBe('One-time')
385
+ expect(oneTimeHandler.isUsed).toBe(true)
386
+ expect(anotherHandler.isUsed).toBe(false)
387
+
388
+ const secondResult = await handleRequest(
389
+ request,
390
+ requestId,
391
+ handlers,
392
+ options,
393
+ emitter,
394
+ handleRequestOptions,
395
+ )
396
+
397
+ expect(await secondResult?.text()).toBe('Another')
398
+ expect(anotherHandler.isUsed).toBe(true)
399
+ expect(oneTimeHandler.isUsed).toBe(true)
400
+ })
401
+
402
+ it('does not mark non-matching one-time handlers as used', async () => {
403
+ const { emitter } = setup()
404
+
405
+ const oneTimeHandler = http.get(
406
+ '/resource',
407
+ () => {
408
+ return HttpResponse.text('One-time')
409
+ },
410
+ { once: true },
411
+ )
412
+ const anotherHandler = http.get(
413
+ '/another',
414
+ () => {
415
+ return HttpResponse.text('Another')
416
+ },
417
+ { once: true },
418
+ )
419
+ const handlers: Array<RequestHandler> = [oneTimeHandler, anotherHandler]
420
+
421
+ const requestId = uuidv4()
422
+ const firstResult = await handleRequest(
423
+ new Request('http://localhost/another'),
424
+ requestId,
425
+ handlers,
426
+ options,
427
+ emitter,
428
+ handleRequestOptions,
429
+ )
430
+
431
+ expect(await firstResult?.text()).toBe('Another')
432
+ expect(oneTimeHandler.isUsed).toBe(false)
433
+ expect(anotherHandler.isUsed).toBe(true)
434
+
435
+ const secondResult = await handleRequest(
436
+ new Request('http://localhost/resource'),
437
+ requestId,
438
+ handlers,
439
+ options,
440
+ emitter,
441
+ handleRequestOptions,
442
+ )
443
+
444
+ expect(await secondResult?.text()).toBe('One-time')
445
+ expect(anotherHandler.isUsed).toBe(true)
446
+ expect(oneTimeHandler.isUsed).toBe(true)
447
+ })
448
+
449
+ it('handles parallel requests with one-time handlers', async () => {
450
+ const { emitter } = setup()
451
+
452
+ const oneTimeHandler = http.get(
453
+ '/resource',
454
+ () => {
455
+ return HttpResponse.text('One-time')
456
+ },
457
+ { once: true },
458
+ )
459
+ const anotherHandler = http.get('/resource', () => {
460
+ return HttpResponse.text('Another')
461
+ })
462
+ const handlers: Array<RequestHandler> = [oneTimeHandler, anotherHandler]
463
+
464
+ const requestId = uuidv4()
465
+ const request = new Request('http://localhost/resource')
466
+ const firstResultPromise = handleRequest(
467
+ request,
468
+ requestId,
469
+ handlers,
470
+ options,
471
+ emitter,
472
+ handleRequestOptions,
473
+ )
474
+ const secondResultPromise = handleRequest(
475
+ request,
476
+ requestId,
477
+ handlers,
478
+ options,
479
+ emitter,
480
+ handleRequestOptions,
481
+ )
482
+
483
+ const firstResult = await firstResultPromise
484
+ const secondResult = await secondResultPromise
485
+
486
+ expect(await firstResult?.text()).toBe('One-time')
487
+ expect(await secondResult?.text()).toBe('Another')
488
+ expect(oneTimeHandler.isUsed).toBe(true)
489
+ expect(anotherHandler.isUsed).toBe(true)
490
+ })
491
+
492
+ describe('[Private] - resolutionContext - used for extensions', () => {
493
+ describe('#baseUrl', () => {
494
+ test('when defined, handle requests to that base url only defining pathnames in the handler', async () => {
495
+ const { emitter } = setup()
496
+
497
+ const baseUrl = 'http://this-base-url-works.com'
498
+ const handleRequestOptionsWithBaseUrl: HandleRequestOptions = {
499
+ ...handleRequestOptions,
500
+ resolutionContext: { baseUrl },
501
+ }
502
+
503
+ const handler = http.get('/resource', () => {
504
+ return HttpResponse.text('Mocked response')
505
+ })
506
+
507
+ const handlers: Array<RequestHandler> = [handler]
508
+
509
+ const requestId = uuidv4()
510
+ const request = new Request(new URL('/resource', baseUrl))
511
+ const response = await handleRequest(
512
+ request,
513
+ requestId,
514
+ handlers,
515
+ options,
516
+ emitter,
517
+ handleRequestOptionsWithBaseUrl,
518
+ )
519
+
520
+ expect(await response?.text()).toBe('Mocked response')
521
+ })
522
+
523
+ test('when defined, do not handle requests to different base urls when defining pathnames in the handler', async () => {
524
+ const { emitter } = setup()
525
+
526
+ const baseUrl = 'http://this-base-url-works.com'
527
+ const handleRequestOptionsWithBaseUrl: HandleRequestOptions = {
528
+ ...handleRequestOptions,
529
+ resolutionContext: { baseUrl },
530
+ }
531
+
532
+ const handler = http.get('/resource', () => {
533
+ return HttpResponse.text('Mocked response')
534
+ })
535
+
536
+ const handlers: Array<RequestHandler> = [handler]
537
+
538
+ const requestId = uuidv4()
539
+ const request = new Request(
540
+ new URL('/resource', `http://not-the-base-url.com`),
541
+ )
542
+ const response = await handleRequest(
543
+ request,
544
+ requestId,
545
+ handlers,
546
+ options,
547
+ emitter,
548
+ handleRequestOptionsWithBaseUrl,
549
+ )
550
+
551
+ expect(response).toBeUndefined()
552
+ })
553
+ })
554
+ })
@@ -0,0 +1,132 @@
1
+ import { until } from '@open-draft/until'
2
+ import { Emitter } from 'strict-event-emitter'
3
+ import { RequestHandler } from '../handlers/RequestHandler'
4
+ import { LifeCycleEventsMap, SharedOptions } from '../sharedOptions'
5
+ import { RequiredDeep } from '../typeUtils'
6
+ import { ResponseLookupResult, getResponse } from './getResponse'
7
+ import { onUnhandledRequest } from './request/onUnhandledRequest'
8
+ import { readResponseCookies } from './request/readResponseCookies'
9
+
10
+ export interface HandleRequestOptions {
11
+ /**
12
+ * `resolutionContext` is not part of the general public api
13
+ * but is exposed to aid in creating extensions like
14
+ * `@mswjs/http-middleware`.
15
+ */
16
+ resolutionContext?: {
17
+ /**
18
+ * A base url to use when resolving relative urls.
19
+ * @note This is primarily used by the `@mswjs/http-middleware`
20
+ * to resolve relative urls in the context of the running server
21
+ */
22
+ baseUrl?: string
23
+ }
24
+
25
+ /**
26
+ * Transforms a `MockedResponse` instance returned from a handler
27
+ * to a response instance supported by the lower tooling (i.e. interceptors).
28
+ */
29
+ transformResponse?(response: Response): Response
30
+
31
+ /**
32
+ * Invoked whenever a request is performed as-is.
33
+ */
34
+ onPassthroughResponse?(request: Request): void
35
+
36
+ /**
37
+ * Invoked when the mocked response is ready to be sent.
38
+ */
39
+ onMockedResponse?(
40
+ response: Response,
41
+ handler: RequiredDeep<ResponseLookupResult>,
42
+ ): void
43
+ }
44
+
45
+ export async function handleRequest(
46
+ request: Request,
47
+ requestId: string,
48
+ handlers: Array<RequestHandler>,
49
+ options: RequiredDeep<SharedOptions>,
50
+ emitter: Emitter<LifeCycleEventsMap>,
51
+ handleRequestOptions?: HandleRequestOptions,
52
+ ): Promise<Response | undefined> {
53
+ emitter.emit('request:start', { request, requestId })
54
+
55
+ // Perform bypassed requests (i.e. issued via "ctx.fetch") as-is.
56
+ if (request.headers.get('x-msw-intention') === 'bypass') {
57
+ emitter.emit('request:end', { request, requestId })
58
+ handleRequestOptions?.onPassthroughResponse?.(request)
59
+ return
60
+ }
61
+
62
+ // Resolve a mocked response from the list of request handlers.
63
+ const lookupResult = await until(() => {
64
+ return getResponse(
65
+ request,
66
+ handlers,
67
+ handleRequestOptions?.resolutionContext,
68
+ )
69
+ })
70
+
71
+ if (lookupResult.error) {
72
+ // Allow developers to react to unhandled exceptions in request handlers.
73
+ emitter.emit('unhandledException', {
74
+ error: lookupResult.error,
75
+ request,
76
+ requestId,
77
+ })
78
+ throw lookupResult.error
79
+ }
80
+
81
+ // If the handler lookup returned nothing, no request handler was found
82
+ // matching this request. Report the request as unhandled.
83
+ if (!lookupResult.data) {
84
+ await onUnhandledRequest(request, handlers, options.onUnhandledRequest)
85
+ emitter.emit('request:unhandled', { request, requestId })
86
+ emitter.emit('request:end', { request, requestId })
87
+ handleRequestOptions?.onPassthroughResponse?.(request)
88
+ return
89
+ }
90
+
91
+ const { response } = lookupResult.data
92
+
93
+ // When the handled request returned no mocked response, warn the developer,
94
+ // as it may be an oversight on their part. Perform the request as-is.
95
+ if (!response) {
96
+ emitter.emit('request:end', { request, requestId })
97
+ handleRequestOptions?.onPassthroughResponse?.(request)
98
+ return
99
+ }
100
+
101
+ // Perform the request as-is when the developer explicitly returned "req.passthrough()".
102
+ // This produces no warning as the request was handled.
103
+ if (
104
+ response.status === 302 &&
105
+ response.headers.get('x-msw-intention') === 'passthrough'
106
+ ) {
107
+ emitter.emit('request:end', { request, requestId })
108
+ handleRequestOptions?.onPassthroughResponse?.(request)
109
+ return
110
+ }
111
+
112
+ // Store all the received response cookies in the virtual cookie store.
113
+ readResponseCookies(request, response)
114
+
115
+ emitter.emit('request:match', { request, requestId })
116
+
117
+ const requiredLookupResult =
118
+ lookupResult.data as RequiredDeep<ResponseLookupResult>
119
+
120
+ const transformedResponse =
121
+ handleRequestOptions?.transformResponse?.(response) ||
122
+ (response as any as Response)
123
+
124
+ handleRequestOptions?.onMockedResponse?.(
125
+ transformedResponse,
126
+ requiredLookupResult,
127
+ )
128
+
129
+ emitter.emit('request:end', { request, requestId })
130
+
131
+ return transformedResponse
132
+ }
@@ -0,0 +1,9 @@
1
+ export type DisposableSubscription = () => Promise<void> | void
2
+
3
+ export class Disposable {
4
+ protected subscriptions: Array<DisposableSubscription> = []
5
+
6
+ public async dispose() {
7
+ await Promise.all(this.subscriptions.map((subscription) => subscription()))
8
+ }
9
+ }
@@ -0,0 +1,17 @@
1
+ import { invariant } from 'outvariant'
2
+ import { devUtils } from './devUtils'
3
+
4
+ export function checkGlobals() {
5
+ /**
6
+ * MSW expects the "URL" constructor to be defined.
7
+ * It's not present in React Native so suggest a polyfill
8
+ * instead of failing silently.
9
+ * @see https://github.com/mswjs/msw/issues/1408
10
+ */
11
+ invariant(
12
+ typeof URL !== 'undefined',
13
+ devUtils.formatMessage(
14
+ `Global "URL" class is not defined. This likely means that you're running MSW in an environment that doesn't support all Node.js standard API (e.g. React Native). If that's the case, please use an appropriate polyfill for the "URL" class, like "react-native-url-polyfill".`,
15
+ ),
16
+ )
17
+ }