msw 2.0.12 → 2.0.14

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-JB4bsrLF.d.ts} +4 -2
  8. package/lib/core/GraphQLHandler-mT-MmgeB.d.mts +99 -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-YiqamK0M.d.mts +179 -0
  16. package/lib/core/{RequestHandler-25f9cfd1.d.ts → RequestHandler-rmY-HeFN.d.ts} +4 -4
  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 +111 -0
  36. package/lib/core/graphql.d.ts +11 -9
  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 +8 -6
  44. package/lib/core/handlers/GraphQLHandler.js.map +1 -0
  45. package/lib/core/handlers/GraphQLHandler.mjs +8 -6
  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 +28 -0
  60. package/lib/core/http.d.ts +13 -11
  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 +4 -4
  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 +25 -23
  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 +146 -0
  321. package/src/core/handlers/GraphQLHandler.test.ts +835 -0
  322. package/src/core/handlers/GraphQLHandler.ts +266 -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 +343 -0
  326. package/src/core/http.test.ts +15 -0
  327. package/src/core/http.ts +64 -0
  328. package/src/core/index.ts +59 -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,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
+ }
@@ -0,0 +1,95 @@
1
+ import { invariant } from 'outvariant'
2
+ import { EventMap, Emitter } from 'strict-event-emitter'
3
+ import {
4
+ RequestHandler,
5
+ RequestHandlerDefaultInfo,
6
+ } from './handlers/RequestHandler'
7
+ import { LifeCycleEventEmitter } from './sharedOptions'
8
+ import { devUtils } from './utils/internal/devUtils'
9
+ import { pipeEvents } from './utils/internal/pipeEvents'
10
+ import { toReadonlyArray } from './utils/internal/toReadonlyArray'
11
+ import { Disposable } from './utils/internal/Disposable'
12
+
13
+ /**
14
+ * Generic class for the mock API setup.
15
+ */
16
+ export abstract class SetupApi<EventsMap extends EventMap> extends Disposable {
17
+ protected initialHandlers: ReadonlyArray<RequestHandler>
18
+ protected currentHandlers: Array<RequestHandler>
19
+ protected readonly emitter: Emitter<EventsMap>
20
+ protected readonly publicEmitter: Emitter<EventsMap>
21
+
22
+ public readonly events: LifeCycleEventEmitter<EventsMap>
23
+
24
+ constructor(...initialHandlers: Array<RequestHandler>) {
25
+ super()
26
+
27
+ invariant(
28
+ this.validateHandlers(initialHandlers),
29
+ devUtils.formatMessage(
30
+ `Failed to apply given request handlers: invalid input. Did you forget to spread the request handlers Array?`,
31
+ ),
32
+ )
33
+
34
+ this.initialHandlers = toReadonlyArray(initialHandlers)
35
+ this.currentHandlers = [...initialHandlers]
36
+
37
+ this.emitter = new Emitter<EventsMap>()
38
+ this.publicEmitter = new Emitter<EventsMap>()
39
+ pipeEvents(this.emitter, this.publicEmitter)
40
+
41
+ this.events = this.createLifeCycleEvents()
42
+
43
+ this.subscriptions.push(() => {
44
+ this.emitter.removeAllListeners()
45
+ this.publicEmitter.removeAllListeners()
46
+ })
47
+ }
48
+
49
+ private validateHandlers(handlers: ReadonlyArray<RequestHandler>): boolean {
50
+ // Guard against incorrect call signature of the setup API.
51
+ return handlers.every((handler) => !Array.isArray(handler))
52
+ }
53
+
54
+ public use(...runtimeHandlers: Array<RequestHandler>): void {
55
+ invariant(
56
+ this.validateHandlers(runtimeHandlers),
57
+ devUtils.formatMessage(
58
+ `Failed to call "use()" with the given request handlers: invalid input. Did you forget to spread the array of request handlers?`,
59
+ ),
60
+ )
61
+
62
+ this.currentHandlers.unshift(...runtimeHandlers)
63
+ }
64
+
65
+ public restoreHandlers(): void {
66
+ this.currentHandlers.forEach((handler) => {
67
+ handler.isUsed = false
68
+ })
69
+ }
70
+
71
+ public resetHandlers(...nextHandlers: Array<RequestHandler>): void {
72
+ this.currentHandlers =
73
+ nextHandlers.length > 0 ? [...nextHandlers] : [...this.initialHandlers]
74
+ }
75
+
76
+ public listHandlers(): ReadonlyArray<
77
+ RequestHandler<RequestHandlerDefaultInfo, any, any>
78
+ > {
79
+ return toReadonlyArray(this.currentHandlers)
80
+ }
81
+
82
+ private createLifeCycleEvents(): LifeCycleEventEmitter<EventsMap> {
83
+ return {
84
+ on: (...args: any[]) => {
85
+ return (this.publicEmitter.on as any)(...args)
86
+ },
87
+ removeListener: (...args: any[]) => {
88
+ return (this.publicEmitter.removeListener as any)(...args)
89
+ },
90
+ removeAllListeners: (...args: any[]) => {
91
+ return this.publicEmitter.removeAllListeners(...args)
92
+ },
93
+ }
94
+ }
95
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @vitest-environment jsdom
3
+ */
4
+ import { bypass } from './bypass'
5
+
6
+ it('returns bypassed request given a request url string', async () => {
7
+ const request = bypass('https://api.example.com/resource')
8
+
9
+ // Relative URLs are rebased against the current location.
10
+ expect(request.method).toBe('GET')
11
+ expect(request.url).toBe('https://api.example.com/resource')
12
+ expect(Object.fromEntries(request.headers.entries())).toEqual({
13
+ 'x-msw-intention': 'bypass',
14
+ })
15
+ })
16
+
17
+ it('returns bypassed request given a request url', async () => {
18
+ const request = bypass(new URL('/resource', 'https://api.example.com'))
19
+
20
+ expect(request.url).toBe('https://api.example.com/resource')
21
+ expect(Object.fromEntries(request.headers)).toEqual({
22
+ 'x-msw-intention': 'bypass',
23
+ })
24
+ })
25
+
26
+ it('returns bypassed request given request instance', async () => {
27
+ const original = new Request('http://localhost/resource', {
28
+ method: 'POST',
29
+ headers: {
30
+ 'X-My-Header': 'value',
31
+ },
32
+ body: 'hello world',
33
+ })
34
+ const request = bypass(original)
35
+
36
+ expect(request.method).toBe('POST')
37
+ expect(request.url).toBe('http://localhost/resource')
38
+
39
+ const bypassedRequestBody = await request.text()
40
+ expect(original.bodyUsed).toBe(false)
41
+
42
+ expect(bypassedRequestBody).toEqual(await original.text())
43
+ expect(Object.fromEntries(request.headers.entries())).toEqual({
44
+ ...Object.fromEntries(original.headers.entries()),
45
+ 'x-msw-intention': 'bypass',
46
+ })
47
+ })
@@ -0,0 +1,36 @@
1
+ import { invariant } from 'outvariant'
2
+
3
+ export type BypassRequestInput = string | URL | Request
4
+
5
+ /**
6
+ * Creates a `Request` instance that will always be ignored by MSW.
7
+ *
8
+ * @example
9
+ * import { bypass } from 'msw'
10
+ *
11
+ * fetch(bypass('/resource'))
12
+ * fetch(bypass(new URL('/resource', 'https://example.com)))
13
+ * fetch(bypass(new Request('https://example.com/resource')))
14
+ *
15
+ * @see {@link https://mswjs.io/docs/api/bypass `bypass()` API reference}
16
+ */
17
+ export function bypass(input: BypassRequestInput, init?: RequestInit): Request {
18
+ const request = input instanceof Request ? input : new Request(input, init)
19
+
20
+ invariant(
21
+ !request.bodyUsed,
22
+ 'Failed to create a bypassed request to "%s %s": given request instance already has its body read. Make sure to clone the intercepted request if you wish to read its body before bypassing it.',
23
+ request.method,
24
+ request.url,
25
+ )
26
+
27
+ const requestClone = request.clone()
28
+
29
+ // Set the internal header that would instruct MSW
30
+ // to bypass this request from any further request matching.
31
+ // Unlike "passthrough()", bypass is meant for performing
32
+ // additional requests within pending request resolution.
33
+ requestClone.headers.set('x-msw-intention', 'bypass')
34
+
35
+ return requestClone
36
+ }
@@ -0,0 +1,70 @@
1
+ import { isNodeProcess } from 'is-node-process'
2
+
3
+ export const SET_TIMEOUT_MAX_ALLOWED_INT = 2147483647
4
+ export const MIN_SERVER_RESPONSE_TIME = 100
5
+ export const MAX_SERVER_RESPONSE_TIME = 400
6
+ export const NODE_SERVER_RESPONSE_TIME = 5
7
+
8
+ function getRealisticResponseTime(): number {
9
+ if (isNodeProcess()) {
10
+ return NODE_SERVER_RESPONSE_TIME
11
+ }
12
+
13
+ return Math.floor(
14
+ Math.random() * (MAX_SERVER_RESPONSE_TIME - MIN_SERVER_RESPONSE_TIME) +
15
+ MIN_SERVER_RESPONSE_TIME,
16
+ )
17
+ }
18
+
19
+ export type DelayMode = 'real' | 'infinite'
20
+
21
+ /**
22
+ * Delays the response by the given duration (ms).
23
+ *
24
+ * @example
25
+ * await delay() // emulate realistic server response time
26
+ * await delay(1200) // delay response by 1200ms
27
+ * await delay('infinite') // delay response infinitely
28
+ *
29
+ * @see {@link https://mswjs.io/docs/api/delay `delay()` API reference}
30
+ */
31
+ export async function delay(
32
+ durationOrMode?: DelayMode | number,
33
+ ): Promise<void> {
34
+ let delayTime: number
35
+
36
+ if (typeof durationOrMode === 'string') {
37
+ switch (durationOrMode) {
38
+ case 'infinite': {
39
+ // Using `Infinity` as a delay value executes the response timeout immediately.
40
+ // Instead, use the maximum allowed integer for `setTimeout`.
41
+ delayTime = SET_TIMEOUT_MAX_ALLOWED_INT
42
+ break
43
+ }
44
+ case 'real': {
45
+ delayTime = getRealisticResponseTime()
46
+ break
47
+ }
48
+ default: {
49
+ throw new Error(
50
+ `Failed to delay a response: unknown delay mode "${durationOrMode}". Please make sure you provide one of the supported modes ("real", "infinite") or a number.`,
51
+ )
52
+ }
53
+ }
54
+ } else if (typeof durationOrMode === 'undefined') {
55
+ // Use random realistic server response time when no explicit delay duration was provided.
56
+ delayTime = getRealisticResponseTime()
57
+ } else {
58
+ // Guard against passing values like `Infinity` or `Number.MAX_VALUE`
59
+ // as the response delay duration. They don't produce the result you may expect.
60
+ if (durationOrMode > SET_TIMEOUT_MAX_ALLOWED_INT) {
61
+ throw new Error(
62
+ `Failed to delay a response: provided delay duration (${durationOrMode}) exceeds the maximum allowed duration for "setTimeout" (${SET_TIMEOUT_MAX_ALLOWED_INT}). This will cause the response to be returned immediately. Please use a number within the allowed range to delay the response by exact duration, or consider the "infinite" delay mode to delay the response indefinitely.`,
63
+ )
64
+ }
65
+
66
+ delayTime = durationOrMode
67
+ }
68
+
69
+ return new Promise((resolve) => setTimeout(resolve, delayTime))
70
+ }
@@ -0,0 +1,11 @@
1
+ import { graphql } from './graphql'
2
+
3
+ test('exports supported GraphQL operation types', () => {
4
+ expect(graphql).toBeDefined()
5
+ expect(Object.keys(graphql)).toEqual([
6
+ 'query',
7
+ 'mutation',
8
+ 'operation',
9
+ 'link',
10
+ ])
11
+ })