msw 2.0.11 → 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 (405) 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-907fc607.d.ts → GraphQLHandler-SHlRCcy4.d.ts} +9 -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-50ddea0c.d.ts → RequestHandler-rBDJQrEf.d.ts} +3 -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 +28 -8
  44. package/lib/core/handlers/GraphQLHandler.js.map +1 -0
  45. package/lib/core/handlers/GraphQLHandler.mjs +28 -8
  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 +19 -4
  56. package/lib/core/handlers/RequestHandler.js.map +1 -0
  57. package/lib/core/handlers/RequestHandler.mjs +19 -4
  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 +59 -25
  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.d.ts +0 -1
  269. package/lib/native/index.js +1 -3
  270. package/lib/native/index.js.map +1 -0
  271. package/lib/native/index.mjs +1 -3
  272. package/lib/native/index.mjs.map +1 -0
  273. package/lib/node/index.d.mts +75 -0
  274. package/lib/node/index.d.ts +1 -2
  275. package/lib/node/index.js +2 -35
  276. package/lib/node/index.js.map +1 -0
  277. package/lib/node/index.mjs +2 -35
  278. package/lib/node/index.mjs.map +1 -0
  279. package/package.json +6 -5
  280. package/src/browser/global.browser.d.ts +1 -0
  281. package/src/browser/index.ts +3 -0
  282. package/src/browser/setupWorker/glossary.ts +259 -0
  283. package/src/browser/setupWorker/setupWorker.node.test.ts +10 -0
  284. package/src/browser/setupWorker/setupWorker.ts +199 -0
  285. package/src/browser/setupWorker/start/createFallbackRequestListener.ts +67 -0
  286. package/src/browser/setupWorker/start/createFallbackStart.ts +21 -0
  287. package/src/browser/setupWorker/start/createRequestListener.ts +127 -0
  288. package/src/browser/setupWorker/start/createResponseListener.ts +58 -0
  289. package/src/browser/setupWorker/start/createStartHandler.ts +143 -0
  290. package/src/browser/setupWorker/start/utils/createMessageChannel.ts +32 -0
  291. package/src/browser/setupWorker/start/utils/enableMocking.ts +32 -0
  292. package/src/browser/setupWorker/start/utils/getWorkerByRegistration.ts +25 -0
  293. package/src/browser/setupWorker/start/utils/getWorkerInstance.ts +94 -0
  294. package/src/browser/setupWorker/start/utils/prepareStartHandler.test.ts +59 -0
  295. package/src/browser/setupWorker/start/utils/prepareStartHandler.ts +44 -0
  296. package/src/browser/setupWorker/start/utils/printStartMessage.test.ts +84 -0
  297. package/src/browser/setupWorker/start/utils/printStartMessage.ts +40 -0
  298. package/src/browser/setupWorker/start/utils/validateWorkerScope.ts +18 -0
  299. package/src/browser/setupWorker/stop/createFallbackStop.ts +11 -0
  300. package/src/browser/setupWorker/stop/createStop.ts +29 -0
  301. package/src/browser/setupWorker/stop/utils/printStopMessage.test.ts +26 -0
  302. package/src/browser/setupWorker/stop/utils/printStopMessage.ts +12 -0
  303. package/src/browser/tsconfig.browser.build.json +6 -0
  304. package/src/browser/tsconfig.browser.json +9 -0
  305. package/src/browser/utils/deferNetworkRequestsUntil.test.ts +48 -0
  306. package/src/browser/utils/deferNetworkRequestsUntil.ts +29 -0
  307. package/src/browser/utils/getAbsoluteWorkerUrl.test.ts +31 -0
  308. package/src/browser/utils/getAbsoluteWorkerUrl.ts +7 -0
  309. package/src/browser/utils/parseWorkerRequest.ts +15 -0
  310. package/src/browser/utils/pruneGetRequestBody.test.ts +53 -0
  311. package/src/browser/utils/pruneGetRequestBody.ts +21 -0
  312. package/src/browser/utils/requestIntegrityCheck.ts +23 -0
  313. package/src/browser/utils/supportsReadableStreamTransfer.ts +17 -0
  314. package/src/core/HttpResponse.test.ts +200 -0
  315. package/src/core/HttpResponse.ts +134 -0
  316. package/src/core/SetupApi.ts +95 -0
  317. package/src/core/bypass.test.ts +47 -0
  318. package/src/core/bypass.ts +36 -0
  319. package/src/core/delay.ts +70 -0
  320. package/src/core/graphql.test.ts +11 -0
  321. package/src/core/graphql.ts +138 -0
  322. package/src/core/handlers/GraphQLHandler.test.ts +820 -0
  323. package/src/core/handlers/GraphQLHandler.ts +263 -0
  324. package/src/core/handlers/HttpHandler.test.ts +218 -0
  325. package/src/core/handlers/HttpHandler.ts +169 -0
  326. package/src/core/handlers/RequestHandler.ts +338 -0
  327. package/src/core/http.test.ts +15 -0
  328. package/src/core/http.ts +51 -0
  329. package/src/core/index.ts +56 -0
  330. package/src/core/passthrough.test.ts +13 -0
  331. package/src/core/passthrough.ts +23 -0
  332. package/src/core/sharedOptions.ts +66 -0
  333. package/src/core/typeUtils.ts +20 -0
  334. package/src/core/utils/HttpResponse/decorators.ts +56 -0
  335. package/src/core/utils/getResponse.ts +55 -0
  336. package/src/core/utils/handleRequest.test.ts +554 -0
  337. package/src/core/utils/handleRequest.ts +132 -0
  338. package/src/core/utils/internal/Disposable.ts +9 -0
  339. package/src/core/utils/internal/checkGlobals.ts +17 -0
  340. package/src/core/utils/internal/devUtils.ts +31 -0
  341. package/src/core/utils/internal/getCallFrame.test.ts +154 -0
  342. package/src/core/utils/internal/getCallFrame.ts +35 -0
  343. package/src/core/utils/internal/isIterable.test.ts +23 -0
  344. package/src/core/utils/internal/isIterable.ts +12 -0
  345. package/src/core/utils/internal/isObject.test.ts +20 -0
  346. package/src/core/utils/internal/isObject.ts +6 -0
  347. package/src/core/utils/internal/isStringEqual.test.ts +45 -0
  348. package/src/core/utils/internal/isStringEqual.ts +6 -0
  349. package/src/core/utils/internal/jsonParse.test.ts +13 -0
  350. package/src/core/utils/internal/jsonParse.ts +13 -0
  351. package/src/core/utils/internal/mergeRight.test.ts +43 -0
  352. package/src/core/utils/internal/mergeRight.ts +27 -0
  353. package/src/core/utils/internal/parseGraphQLRequest.test.ts +99 -0
  354. package/src/core/utils/internal/parseGraphQLRequest.ts +205 -0
  355. package/src/core/utils/internal/parseMultipartData.test.ts +76 -0
  356. package/src/core/utils/internal/parseMultipartData.ts +104 -0
  357. package/src/core/utils/internal/pipeEvents.test.ts +14 -0
  358. package/src/core/utils/internal/pipeEvents.ts +25 -0
  359. package/src/core/utils/internal/requestHandlerUtils.ts +21 -0
  360. package/src/core/utils/internal/toReadonlyArray.test.ts +30 -0
  361. package/src/core/utils/internal/toReadonlyArray.ts +8 -0
  362. package/src/core/utils/internal/tryCatch.test.ts +29 -0
  363. package/src/core/utils/internal/tryCatch.ts +11 -0
  364. package/src/core/utils/internal/uuidv4.ts +3 -0
  365. package/src/core/utils/logging/getStatusCodeColor.test.ts +22 -0
  366. package/src/core/utils/logging/getStatusCodeColor.ts +20 -0
  367. package/src/core/utils/logging/getTimestamp.test.ts +18 -0
  368. package/src/core/utils/logging/getTimestamp.ts +12 -0
  369. package/src/core/utils/logging/serializeRequest.test.ts +23 -0
  370. package/src/core/utils/logging/serializeRequest.ts +23 -0
  371. package/src/core/utils/logging/serializeResponse.test.ts +77 -0
  372. package/src/core/utils/logging/serializeResponse.ts +31 -0
  373. package/src/core/utils/matching/matchRequestUrl.test.ts +114 -0
  374. package/src/core/utils/matching/matchRequestUrl.ts +73 -0
  375. package/src/core/utils/matching/normalizePath.node.test.ts +44 -0
  376. package/src/core/utils/matching/normalizePath.test.ts +50 -0
  377. package/src/core/utils/matching/normalizePath.ts +21 -0
  378. package/src/core/utils/request/getPublicUrlFromRequest.test.ts +26 -0
  379. package/src/core/utils/request/getPublicUrlFromRequest.ts +15 -0
  380. package/src/core/utils/request/getRequestCookies.node.test.ts +29 -0
  381. package/src/core/utils/request/getRequestCookies.test.ts +64 -0
  382. package/src/core/utils/request/getRequestCookies.ts +75 -0
  383. package/src/core/utils/request/onUnhandledRequest.test.ts +215 -0
  384. package/src/core/utils/request/onUnhandledRequest.ts +247 -0
  385. package/src/core/utils/request/readResponseCookies.ts +9 -0
  386. package/src/core/utils/toResponseInit.ts +7 -0
  387. package/src/core/utils/url/cleanUrl.test.ts +17 -0
  388. package/src/core/utils/url/cleanUrl.ts +12 -0
  389. package/src/core/utils/url/getAbsoluteUrl.node.test.ts +19 -0
  390. package/src/core/utils/url/getAbsoluteUrl.test.ts +29 -0
  391. package/src/core/utils/url/getAbsoluteUrl.ts +26 -0
  392. package/src/core/utils/url/isAbsoluteUrl.test.ts +32 -0
  393. package/src/core/utils/url/isAbsoluteUrl.ts +6 -0
  394. package/src/iife/index.ts +2 -0
  395. package/src/mockServiceWorker.js +287 -0
  396. package/src/native/index.ts +17 -0
  397. package/src/node/SetupServerApi.ts +113 -0
  398. package/src/node/glossary.ts +62 -0
  399. package/src/node/index.ts +3 -0
  400. package/src/node/setupServer.ts +21 -0
  401. package/src/node/utils/isNodeExceptionLike.ts +14 -0
  402. package/src/tsconfig.core.build.json +6 -0
  403. package/src/tsconfig.node.build.json +6 -0
  404. package/src/tsconfig.node.json +8 -0
  405. package/src/tsconfig.src.json +15 -0
@@ -0,0 +1,26 @@
1
+ import { printStopMessage } from './printStopMessage'
2
+
3
+ beforeAll(() => {
4
+ vi.spyOn(global.console, 'log').mockImplementation(() => void 0)
5
+ })
6
+
7
+ afterEach(() => {
8
+ vi.resetAllMocks()
9
+ })
10
+
11
+ afterAll(() => {
12
+ vi.restoreAllMocks()
13
+ })
14
+
15
+ test('prints a stop message to the console', () => {
16
+ printStopMessage()
17
+ expect(console.log).toHaveBeenCalledWith(
18
+ '%c[MSW] Mocking disabled.',
19
+ 'color:orangered;font-weight:bold;',
20
+ )
21
+ })
22
+
23
+ test('does not print any message when log level is quiet', () => {
24
+ printStopMessage({ quiet: true })
25
+ expect(console.log).not.toHaveBeenCalled()
26
+ })
@@ -0,0 +1,12 @@
1
+ import { devUtils } from '~/core/utils/internal/devUtils'
2
+
3
+ export function printStopMessage(args: { quiet?: boolean } = {}): void {
4
+ if (args.quiet) {
5
+ return
6
+ }
7
+
8
+ console.log(
9
+ `%c${devUtils.formatMessage('Mocking disabled.')}`,
10
+ 'color:orangered;font-weight:bold;',
11
+ )
12
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "extends": "./tsconfig.browser.json",
3
+ "compilerOptions": {
4
+ "composite": false
5
+ }
6
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../tsconfig.src.json",
3
+ "compilerOptions": {
4
+ // Expose browser-specific libraries only for the
5
+ // source code under the "src/browser" directory.
6
+ "lib": ["DOM", "WebWorker"]
7
+ },
8
+ "include": ["../../global.d.ts", "./global.browser.d.ts", "./**/*.ts"]
9
+ }
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @vitest-environment jsdom
3
+ */
4
+ import { deferNetworkRequestsUntil } from './deferNetworkRequestsUntil'
5
+
6
+ beforeAll(() => {
7
+ // Stubs native `fetch` function to remove any external
8
+ // asynchronicity from this test suite.
9
+ window.fetch = vi.fn().mockImplementation(() => {
10
+ return Promise.resolve({
11
+ json: () => ({
12
+ response: 'body',
13
+ }),
14
+ })
15
+ })
16
+ })
17
+
18
+ afterAll(() => {
19
+ vi.restoreAllMocks()
20
+ })
21
+
22
+ test('defers any requests that happen while a given promise is pending', async () => {
23
+ const events: string[] = []
24
+
25
+ // Emulate a Service Worker registration Promise.
26
+ const workerPromise = new Promise<null>((resolve) => {
27
+ setTimeout(resolve, 1000)
28
+ })
29
+
30
+ workerPromise.then(() => {
31
+ events.push('promise resolved')
32
+ })
33
+
34
+ // Calling this functions intercepts all requests that happen while
35
+ // the given promise is pending, and defers their execution
36
+ // until the promise is resolved.
37
+ deferNetworkRequestsUntil(workerPromise)
38
+
39
+ // Perform a request.
40
+ const requestPromise = fetch('/user').then(() => {
41
+ events.push('response received')
42
+ })
43
+
44
+ await Promise.all([workerPromise, requestPromise])
45
+
46
+ // Assert the order of resolved events.
47
+ expect(events).toEqual(['promise resolved', 'response received'])
48
+ })
@@ -0,0 +1,29 @@
1
+ import { until } from '@open-draft/until'
2
+
3
+ /**
4
+ * Intercepts and defers any requests on the page
5
+ * until the Service Worker instance is ready.
6
+ * Must only be used in a browser.
7
+ */
8
+ export function deferNetworkRequestsUntil(predicatePromise: Promise<any>) {
9
+ // Defer any `XMLHttpRequest` requests until the Service Worker is ready.
10
+ const originalXhrSend = window.XMLHttpRequest.prototype.send
11
+ window.XMLHttpRequest.prototype.send = function (
12
+ ...args: Parameters<XMLHttpRequest['send']>
13
+ ) {
14
+ // Keep this function synchronous to comply with `XMLHttpRequest.prototype.send`,
15
+ // because that method is always synchronous.
16
+ until(() => predicatePromise).then(() => {
17
+ window.XMLHttpRequest.prototype.send = originalXhrSend
18
+ this.send(...args)
19
+ })
20
+ }
21
+
22
+ // Defer any `fetch` requests until the Service Worker is ready.
23
+ const originalFetch = window.fetch
24
+ window.fetch = async (...args) => {
25
+ await until(() => predicatePromise)
26
+ window.fetch = originalFetch
27
+ return window.fetch(...args)
28
+ }
29
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @vitest-environment jsdom
3
+ */
4
+ import { getAbsoluteWorkerUrl } from './getAbsoluteWorkerUrl'
5
+
6
+ const rawLocation = window.location
7
+
8
+ afterAll(() => {
9
+ Object.defineProperty(window, 'location', {
10
+ value: rawLocation,
11
+ })
12
+ })
13
+
14
+ it('returns absolute worker url relatively to the root', () => {
15
+ expect(getAbsoluteWorkerUrl('./worker.js')).toBe('http://localhost/worker.js')
16
+ })
17
+
18
+ it('returns an absolute worker url relatively to the current path', () => {
19
+ Object.defineProperty(window, 'location', {
20
+ value: {
21
+ href: 'http://localhost/path/to/page',
22
+ },
23
+ })
24
+
25
+ expect(getAbsoluteWorkerUrl('./worker.js')).toBe(
26
+ 'http://localhost/path/to/worker.js',
27
+ )
28
+
29
+ // Leading slash must still resolve to the root.
30
+ expect(getAbsoluteWorkerUrl('/worker.js')).toBe('http://localhost/worker.js')
31
+ })
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Returns an absolute Service Worker URL based on the given
3
+ * relative URL (known during the registration).
4
+ */
5
+ export function getAbsoluteWorkerUrl(workerUrl: string): string {
6
+ return new URL(workerUrl, location.href).href
7
+ }
@@ -0,0 +1,15 @@
1
+ import { pruneGetRequestBody } from './pruneGetRequestBody'
2
+ import type { ServiceWorkerIncomingRequest } from '../setupWorker/glossary'
3
+
4
+ /**
5
+ * Converts a given request received from the Service Worker
6
+ * into a Fetch `Request` instance.
7
+ */
8
+ export function parseWorkerRequest(
9
+ incomingRequest: ServiceWorkerIncomingRequest,
10
+ ): Request {
11
+ return new Request(incomingRequest.url, {
12
+ ...incomingRequest,
13
+ body: pruneGetRequestBody(incomingRequest),
14
+ })
15
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * @vitest-environment jsdom
3
+ */
4
+ import { TextEncoder } from 'util'
5
+ import { pruneGetRequestBody } from './pruneGetRequestBody'
6
+
7
+ test('sets empty GET request body to undefined', () => {
8
+ expect(
9
+ pruneGetRequestBody({
10
+ method: 'GET',
11
+ }),
12
+ ).toBeUndefined()
13
+
14
+ expect(
15
+ pruneGetRequestBody({
16
+ method: 'GET',
17
+ // There's no such thing as a GET request with a body.
18
+ body: new ArrayBuffer(5),
19
+ }),
20
+ ).toBeUndefined()
21
+ })
22
+
23
+ test('sets HEAD request body to undefined', () => {
24
+ expect(
25
+ pruneGetRequestBody({
26
+ method: 'HEAD',
27
+ }),
28
+ ).toBeUndefined()
29
+
30
+ expect(
31
+ pruneGetRequestBody({
32
+ method: 'HEAD',
33
+ body: new ArrayBuffer(5),
34
+ }),
35
+ ).toBeUndefined()
36
+ })
37
+
38
+ test('ignores requests of the other methods than GET', () => {
39
+ const body = new TextEncoder().encode('hello world')
40
+ expect(
41
+ pruneGetRequestBody({
42
+ method: 'POST',
43
+ body,
44
+ }),
45
+ ).toEqual(body)
46
+
47
+ expect(
48
+ pruneGetRequestBody({
49
+ method: 'PUT',
50
+ body,
51
+ }),
52
+ ).toEqual(body)
53
+ })
@@ -0,0 +1,21 @@
1
+ import type { ServiceWorkerIncomingRequest } from '../setupWorker/glossary'
2
+
3
+ type Input = Pick<ServiceWorkerIncomingRequest, 'method' | 'body'>
4
+
5
+ /**
6
+ * Ensures that an empty GET request body is always represented as `undefined`.
7
+ */
8
+ export function pruneGetRequestBody(
9
+ request: Input,
10
+ ): ServiceWorkerIncomingRequest['body'] {
11
+ // Force HEAD/GET request body to always be empty.
12
+ // The worker reads any request's body as ArrayBuffer,
13
+ // and you cannot re-construct a GET/HEAD Request
14
+ // with an ArrayBuffer, even if empty. Also note that
15
+ // "request.body" is always undefined in the worker.
16
+ if (['HEAD', 'GET'].includes(request.method)) {
17
+ return undefined
18
+ }
19
+
20
+ return request.body
21
+ }
@@ -0,0 +1,23 @@
1
+ import type { SetupWorkerInternalContext } from '../setupWorker/glossary'
2
+
3
+ export async function requestIntegrityCheck(
4
+ context: SetupWorkerInternalContext,
5
+ serviceWorker: ServiceWorker,
6
+ ): Promise<ServiceWorker> {
7
+ // Signal Service Worker to report back its integrity
8
+ context.workerChannel.send('INTEGRITY_CHECK_REQUEST')
9
+
10
+ const { payload: actualChecksum } = await context.events.once(
11
+ 'INTEGRITY_CHECK_RESPONSE',
12
+ )
13
+
14
+ // Compare the response from the Service Worker and the
15
+ // global variable set during the build.
16
+ if (actualChecksum !== SERVICE_WORKER_CHECKSUM) {
17
+ throw new Error(
18
+ `Currently active Service Worker (${actualChecksum}) is behind the latest published one (${SERVICE_WORKER_CHECKSUM}).`,
19
+ )
20
+ }
21
+
22
+ return serviceWorker
23
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Returns a boolean indicating whether the current browser
3
+ * supports `ReadableStream` as a `Transferable` when posting
4
+ * messages.
5
+ */
6
+ export function supportsReadableStreamTransfer() {
7
+ try {
8
+ const stream = new ReadableStream({
9
+ start: (controller) => controller.close(),
10
+ })
11
+ const message = new MessageChannel()
12
+ message.port1.postMessage(stream, [stream])
13
+ return true
14
+ } catch (error) {
15
+ return false
16
+ }
17
+ }
@@ -0,0 +1,200 @@
1
+ /**
2
+ * @vitest-environment node
3
+ */
4
+ import { TextEncoder } from 'util'
5
+ import { HttpResponse } from './HttpResponse'
6
+
7
+ it('creates a plain response', async () => {
8
+ const response = new HttpResponse(null, { status: 301 })
9
+ expect(response.status).toBe(301)
10
+ expect(response.statusText).toBe('Moved Permanently')
11
+ expect(response.body).toBe(null)
12
+ expect(await response.text()).toBe('')
13
+ expect(Object.fromEntries(response.headers.entries())).toEqual({})
14
+ })
15
+
16
+ describe('HttpResponse.text()', () => {
17
+ it('creates a text response', async () => {
18
+ const response = HttpResponse.text('hello world', { status: 201 })
19
+
20
+ expect(response.status).toBe(201)
21
+ expect(response.statusText).toBe('Created')
22
+ expect(response.body).toBeInstanceOf(ReadableStream)
23
+ expect(await response.text()).toBe('hello world')
24
+ expect(Object.fromEntries(response.headers.entries())).toEqual({
25
+ 'content-type': 'text/plain',
26
+ })
27
+ })
28
+
29
+ it('allows overriding the "Content-Type" response header', async () => {
30
+ const response = HttpResponse.text('hello world', {
31
+ headers: {
32
+ 'Content-Type': 'text/plain; charset=utf-8',
33
+ },
34
+ })
35
+
36
+ expect(response.status).toBe(200)
37
+ expect(response.statusText).toBe('OK')
38
+ expect(response.body).toBeInstanceOf(ReadableStream)
39
+ expect(await response.text()).toBe('hello world')
40
+ expect(Object.fromEntries(response.headers.entries())).toEqual({
41
+ 'content-type': 'text/plain; charset=utf-8',
42
+ })
43
+ })
44
+ })
45
+
46
+ describe('HttpResponse.json()', () => {
47
+ it('creates a json response given an object', async () => {
48
+ const response = HttpResponse.json({ firstName: 'John' })
49
+
50
+ expect(response.status).toBe(200)
51
+ expect(response.statusText).toBe('OK')
52
+ expect(response.body).toBeInstanceOf(ReadableStream)
53
+ expect(await response.json()).toEqual({ firstName: 'John' })
54
+ expect(Object.fromEntries(response.headers.entries())).toEqual({
55
+ 'content-type': 'application/json',
56
+ })
57
+ })
58
+
59
+ it('creates a json response given an array', async () => {
60
+ const response = HttpResponse.json([1, 2, 3])
61
+
62
+ expect(response.status).toBe(200)
63
+ expect(response.statusText).toBe('OK')
64
+ expect(response.body).toBeInstanceOf(ReadableStream)
65
+ expect(await response.json()).toEqual([1, 2, 3])
66
+ expect(Object.fromEntries(response.headers.entries())).toEqual({
67
+ 'content-type': 'application/json',
68
+ })
69
+ })
70
+
71
+ it('creates a json response given a plain string', async () => {
72
+ const response = HttpResponse.json(`"hello"`)
73
+
74
+ expect(response.status).toBe(200)
75
+ expect(response.statusText).toBe('OK')
76
+ expect(response.body).toBeInstanceOf(ReadableStream)
77
+ expect(await response.json()).toBe(`"hello"`)
78
+ expect(Object.fromEntries(response.headers.entries())).toEqual({
79
+ 'content-type': 'application/json',
80
+ })
81
+ })
82
+
83
+ it('creates a json response given a number', async () => {
84
+ const response = HttpResponse.json(123)
85
+
86
+ expect(response.status).toBe(200)
87
+ expect(response.statusText).toBe('OK')
88
+ expect(response.body).toBeInstanceOf(ReadableStream)
89
+ expect(await response.json()).toBe(123)
90
+ expect(Object.fromEntries(response.headers.entries())).toEqual({
91
+ 'content-type': 'application/json',
92
+ })
93
+ })
94
+
95
+ it('creates a json response given a json ReadableStream', async () => {
96
+ const encoder = new TextEncoder()
97
+ const stream = new ReadableStream({
98
+ start(controller) {
99
+ controller.enqueue(encoder.encode(`{"firstName`))
100
+ controller.enqueue(encoder.encode(`":"John`))
101
+ controller.enqueue(encoder.encode(`"}`))
102
+ controller.close()
103
+ },
104
+ })
105
+ const response = HttpResponse.json(stream)
106
+
107
+ expect(response.status).toBe(200)
108
+ expect(response.statusText).toBe('OK')
109
+ expect(response.body).toBeInstanceOf(ReadableStream)
110
+ // A ReadableStream instance is not a valid body init
111
+ // for the "Response.json()" static method. It gets serialized
112
+ // into a plain object.
113
+ expect(await response.json()).toEqual({})
114
+ expect(Object.fromEntries(response.headers.entries())).toEqual({
115
+ 'content-type': 'application/json',
116
+ })
117
+ })
118
+
119
+ it('allows overriding the "Content-Type" response header', async () => {
120
+ const response = HttpResponse.json(
121
+ { a: 1 },
122
+ {
123
+ headers: {
124
+ 'Content-Type': 'application/hal+json',
125
+ },
126
+ },
127
+ )
128
+
129
+ expect(response.status).toBe(200)
130
+ expect(response.statusText).toBe('OK')
131
+ expect(response.body).toBeInstanceOf(ReadableStream)
132
+ expect(await response.json()).toEqual({ a: 1 })
133
+ expect(Object.fromEntries(response.headers.entries())).toEqual({
134
+ 'content-type': 'application/hal+json',
135
+ })
136
+ })
137
+ })
138
+
139
+ describe('HttpResponse.xml()', () => {
140
+ it('creates an xml response', async () => {
141
+ const response = HttpResponse.xml('<user name="John" />')
142
+
143
+ expect(response.status).toBe(200)
144
+ expect(response.statusText).toBe('OK')
145
+ expect(response.body).toBeInstanceOf(ReadableStream)
146
+ expect(await response.text()).toBe('<user name="John" />')
147
+ expect(Object.fromEntries(response.headers.entries())).toEqual({
148
+ 'content-type': 'text/xml',
149
+ })
150
+ })
151
+
152
+ it('allows overriding the "Content-Type" response header', async () => {
153
+ const response = HttpResponse.xml('<user name="John" />', {
154
+ headers: {
155
+ 'Content-Type': 'text/xml; charset=utf-8',
156
+ },
157
+ })
158
+
159
+ expect(response.status).toBe(200)
160
+ expect(response.statusText).toBe('OK')
161
+ expect(response.body).toBeInstanceOf(ReadableStream)
162
+ expect(await response.text()).toBe('<user name="John" />')
163
+ expect(Object.fromEntries(response.headers.entries())).toEqual({
164
+ 'content-type': 'text/xml; charset=utf-8',
165
+ })
166
+ })
167
+ })
168
+
169
+ it('creates an array buffer response', async () => {
170
+ const buffer = new TextEncoder().encode('hello world')
171
+ const response = HttpResponse.arrayBuffer(buffer)
172
+
173
+ expect(response.status).toBe(200)
174
+ expect(response.statusText).toBe('OK')
175
+ expect(response.body).toBeInstanceOf(ReadableStream)
176
+
177
+ const responseData = await response.arrayBuffer()
178
+ expect(responseData).toEqual(buffer.buffer)
179
+ expect(Object.fromEntries(response.headers.entries())).toEqual({
180
+ 'content-length': '11',
181
+ })
182
+ })
183
+
184
+ it('creates a form data response', async () => {
185
+ const formData = new FormData()
186
+ formData.append('firstName', 'John')
187
+ const response = HttpResponse.formData(formData)
188
+
189
+ expect(response.status).toBe(200)
190
+ expect(response.statusText).toBe('OK')
191
+ expect(response.body).toBeInstanceOf(ReadableStream)
192
+
193
+ const responseData = await response.formData()
194
+ expect(responseData.get('firstName')).toBe('John')
195
+ expect(Object.fromEntries(response.headers.entries())).toEqual({
196
+ 'content-type': expect.stringContaining(
197
+ 'multipart/form-data; boundary=----',
198
+ ),
199
+ })
200
+ })
@@ -0,0 +1,134 @@
1
+ import type { DefaultBodyType, JsonBodyType } from './handlers/RequestHandler'
2
+ import {
3
+ decorateResponse,
4
+ normalizeResponseInit,
5
+ } from './utils/HttpResponse/decorators'
6
+
7
+ export interface HttpResponseInit extends ResponseInit {
8
+ type?: ResponseType
9
+ }
10
+
11
+ declare const bodyType: unique symbol
12
+
13
+ export interface StrictRequest<BodyType extends DefaultBodyType>
14
+ extends Request {
15
+ json(): Promise<BodyType>
16
+ }
17
+
18
+ /**
19
+ * Opaque `Response` type that supports strict body type.
20
+ */
21
+ export interface StrictResponse<BodyType extends DefaultBodyType>
22
+ extends Response {
23
+ readonly [bodyType]: BodyType
24
+ }
25
+
26
+ /**
27
+ * A drop-in replacement for the standard `Response` class
28
+ * to allow additional features, like mocking the response `Set-Cookie` header.
29
+ *
30
+ * @example
31
+ * new HttpResponse('Hello world', { status: 201 })
32
+ * HttpResponse.json({ name: 'John' })
33
+ * HttpResponse.formData(form)
34
+ *
35
+ * @see {@link https://mswjs.io/docs/api/http-response `HttpResponse` API reference}
36
+ */
37
+ export class HttpResponse extends Response {
38
+ constructor(body?: BodyInit | null, init?: HttpResponseInit) {
39
+ const responseInit = normalizeResponseInit(init)
40
+ super(body, responseInit)
41
+ decorateResponse(this, responseInit)
42
+ }
43
+
44
+ /**
45
+ * Create a `Response` with a `Content-Type: "text/plain"` body.
46
+ * @example
47
+ * HttpResponse.text('hello world')
48
+ * HttpResponse.text('Error', { status: 500 })
49
+ */
50
+ static text<BodyType extends string>(
51
+ body?: BodyType | null,
52
+ init?: HttpResponseInit,
53
+ ): StrictResponse<BodyType> {
54
+ const responseInit = normalizeResponseInit(init)
55
+
56
+ if (!responseInit.headers.has('Content-Type')) {
57
+ responseInit.headers.set('Content-Type', 'text/plain')
58
+ }
59
+
60
+ return new HttpResponse(body, responseInit) as StrictResponse<BodyType>
61
+ }
62
+
63
+ /**
64
+ * Create a `Response` with a `Content-Type: "application/json"` body.
65
+ * @example
66
+ * HttpResponse.json({ firstName: 'John' })
67
+ * HttpResponse.json({ error: 'Not Authorized' }, { status: 401 })
68
+ */
69
+ static json<BodyType extends JsonBodyType>(
70
+ body?: BodyType | null,
71
+ init?: HttpResponseInit,
72
+ ): StrictResponse<BodyType> {
73
+ const responseInit = normalizeResponseInit(init)
74
+
75
+ if (!responseInit.headers.has('Content-Type')) {
76
+ responseInit.headers.set('Content-Type', 'application/json')
77
+ }
78
+
79
+ return new HttpResponse(
80
+ JSON.stringify(body),
81
+ responseInit,
82
+ ) as StrictResponse<BodyType>
83
+ }
84
+
85
+ /**
86
+ * Create a `Response` with a `Content-Type: "application/xml"` body.
87
+ * @example
88
+ * HttpResponse.xml(`<user name="John" />`)
89
+ * HttpResponse.xml(`<article id="abc-123" />`, { status: 201 })
90
+ */
91
+ static xml<BodyType extends string>(
92
+ body?: BodyType | null,
93
+ init?: HttpResponseInit,
94
+ ): Response {
95
+ const responseInit = normalizeResponseInit(init)
96
+
97
+ if (!responseInit.headers.has('Content-Type')) {
98
+ responseInit.headers.set('Content-Type', 'text/xml')
99
+ }
100
+
101
+ return new HttpResponse(body, responseInit)
102
+ }
103
+
104
+ /**
105
+ * Create a `Response` with an `ArrayBuffer` body.
106
+ * @example
107
+ * const buffer = new ArrayBuffer(3)
108
+ * const view = new Uint8Array(buffer)
109
+ * view.set([1, 2, 3])
110
+ *
111
+ * HttpResponse.arrayBuffer(buffer)
112
+ */
113
+ static arrayBuffer(body?: ArrayBuffer, init?: HttpResponseInit): Response {
114
+ const responseInit = normalizeResponseInit(init)
115
+
116
+ if (body) {
117
+ responseInit.headers.set('Content-Length', body.byteLength.toString())
118
+ }
119
+
120
+ return new HttpResponse(body, responseInit)
121
+ }
122
+
123
+ /**
124
+ * Create a `Response` with a `FormData` body.
125
+ * @example
126
+ * const data = new FormData()
127
+ * data.set('name', 'Alice')
128
+ *
129
+ * HttpResponse.formData(data)
130
+ */
131
+ static formData(body?: FormData, init?: HttpResponseInit): Response {
132
+ return new HttpResponse(body, normalizeResponseInit(init))
133
+ }
134
+ }