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,104 @@
1
+ import { SharedOptions, LifeCycleEventEmitter, LifeCycleEventsMap } from '~/core/sharedOptions';
2
+ import { RequestHandler, RequestHandlerDefaultInfo } from '~/core/handlers/RequestHandler';
3
+ import { SetupApi } from '~/core/SetupApi';
4
+
5
+ type FindWorker = (scriptUrl: string, mockServiceWorkerUrl: string) => boolean;
6
+ interface StartOptions extends SharedOptions {
7
+ /**
8
+ * Service Worker registration options.
9
+ */
10
+ serviceWorker?: {
11
+ /**
12
+ * Custom url to the worker script.
13
+ * @default "/mockServiceWorker.js"
14
+ */
15
+ url?: string;
16
+ options?: RegistrationOptions;
17
+ };
18
+ /**
19
+ * Disables the logging of the intercepted requests
20
+ * into browser's console.
21
+ * @default false
22
+ */
23
+ quiet?: boolean;
24
+ /**
25
+ * Defers any network requests until the Service Worker
26
+ * instance is activated.
27
+ * @default true
28
+ */
29
+ waitUntilReady?: boolean;
30
+ /**
31
+ * A custom lookup function to find a Mock Service Worker in the list
32
+ * of all registered Service Workers on the page.
33
+ */
34
+ findWorker?: FindWorker;
35
+ }
36
+ type StartReturnType = Promise<ServiceWorkerRegistration | undefined>;
37
+ type StopHandler = () => void;
38
+ interface SetupWorker {
39
+ /**
40
+ * Registers and activates the mock Service Worker.
41
+ *
42
+ * @see {@link https://mswjs.io/docs/api/setup-worker/start `worker.start()` API reference}
43
+ */
44
+ start: (options?: StartOptions) => StartReturnType;
45
+ /**
46
+ * Stops requests interception for the current client.
47
+ *
48
+ * @see {@link https://mswjs.io/docs/api/setup-worker/stop `worker.stop()` API reference}
49
+ */
50
+ stop: StopHandler;
51
+ /**
52
+ * Prepends given request handlers to the list of existing handlers.
53
+ * @param {RequestHandler[]} handlers List of runtime request handlers.
54
+ *
55
+ * @see {@link https://mswjs.io/docs/api/setup-worker/use `worker.use()` API reference}
56
+ */
57
+ use: (...handlers: RequestHandler[]) => void;
58
+ /**
59
+ * Marks all request handlers that respond using `res.once()` as unused.
60
+ *
61
+ * @see {@link https://mswjs.io/docs/api/setup-worker/restore-handlers `worker.restoreHandlers()` API reference}
62
+ */
63
+ restoreHandlers: () => void;
64
+ /**
65
+ * Resets request handlers to the initial list given to the `setupWorker` call, or to the explicit next request handlers list, if given.
66
+ * @param {RequestHandler[]} nextHandlers List of the new initial request handlers.
67
+ *
68
+ * @see {@link https://mswjs.io/docs/api/setup-worker/reset-handlers `worker.resetHandlers()` API reference}
69
+ */
70
+ resetHandlers: (...nextHandlers: RequestHandler[]) => void;
71
+ /**
72
+ * Returns a readonly list of currently active request handlers.
73
+ *
74
+ * @see {@link https://mswjs.io/docs/api/setup-worker/list-handlers `worker.listHandlers()` API reference}
75
+ */
76
+ listHandlers(): ReadonlyArray<RequestHandler<RequestHandlerDefaultInfo, any>>;
77
+ /**
78
+ * Life-cycle events.
79
+ * Life-cycle events allow you to subscribe to the internal library events occurring during the request/response handling.
80
+ *
81
+ * @see {@link https://mswjs.io/docs/api/life-cycle-events Life-cycle Events API reference}
82
+ */
83
+ events: LifeCycleEventEmitter<LifeCycleEventsMap>;
84
+ }
85
+
86
+ declare class SetupWorkerApi extends SetupApi<LifeCycleEventsMap> implements SetupWorker {
87
+ private context;
88
+ private startHandler;
89
+ private stopHandler;
90
+ private listeners;
91
+ constructor(...handlers: Array<RequestHandler>);
92
+ private createWorkerContext;
93
+ start(options?: StartOptions): StartReturnType;
94
+ stop(): void;
95
+ }
96
+ /**
97
+ * Sets up a requests interception in the browser with the given request handlers.
98
+ * @param {RequestHandler[]} handlers List of request handlers.
99
+ *
100
+ * @see {@link https://mswjs.io/docs/api/setup-worker `setupWorker()` API reference}
101
+ */
102
+ declare function setupWorker(...handlers: Array<RequestHandler>): SetupWorker;
103
+
104
+ export { type SetupWorker, SetupWorkerApi, type StartOptions, setupWorker };
@@ -101,4 +101,4 @@ declare class SetupWorkerApi extends SetupApi<LifeCycleEventsMap> implements Set
101
101
  */
102
102
  declare function setupWorker(...handlers: Array<RequestHandler>): SetupWorker;
103
103
 
104
- export { SetupWorker, SetupWorkerApi, StartOptions, setupWorker };
104
+ export { type SetupWorker, SetupWorkerApi, type StartOptions, setupWorker };
@@ -753,3 +753,4 @@ var SetupWorkerApi = class extends import_SetupApi.SetupApi {
753
753
  function setupWorker(...handlers) {
754
754
  return new SetupWorkerApi(...handlers);
755
755
  }
756
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/browser/index.ts","../../src/browser/setupWorker/setupWorker.ts","../../src/browser/setupWorker/start/createStartHandler.ts","../../src/browser/setupWorker/start/utils/getWorkerInstance.ts","../../src/browser/utils/getAbsoluteWorkerUrl.ts","../../src/browser/setupWorker/start/utils/getWorkerByRegistration.ts","../../src/browser/setupWorker/start/utils/enableMocking.ts","../../src/browser/setupWorker/start/utils/printStartMessage.ts","../../src/browser/setupWorker/start/utils/createMessageChannel.ts","../../src/browser/utils/pruneGetRequestBody.ts","../../src/browser/utils/parseWorkerRequest.ts","../../src/browser/setupWorker/start/createRequestListener.ts","../../src/browser/utils/requestIntegrityCheck.ts","../../src/browser/utils/deferNetworkRequestsUntil.ts","../../src/browser/setupWorker/start/createResponseListener.ts","../../src/browser/setupWorker/start/utils/validateWorkerScope.ts","../../src/browser/setupWorker/stop/createStop.ts","../../src/browser/setupWorker/stop/utils/printStopMessage.ts","../../src/browser/setupWorker/start/utils/prepareStartHandler.ts","../../src/browser/setupWorker/start/createFallbackRequestListener.ts","../../src/browser/setupWorker/start/createFallbackStart.ts","../../src/browser/setupWorker/stop/createFallbackStop.ts","../../src/browser/utils/supportsReadableStreamTransfer.ts"],"sourcesContent":["export { setupWorker } from './setupWorker/setupWorker'\nexport type { SetupWorker, StartOptions } from './setupWorker/glossary'\nexport { SetupWorkerApi } from './setupWorker/setupWorker'\n","import { invariant } from 'outvariant'\nimport { isNodeProcess } from 'is-node-process'\nimport {\n SetupWorkerInternalContext,\n ServiceWorkerIncomingEventsMap,\n StartReturnType,\n StopHandler,\n StartHandler,\n StartOptions,\n} from './glossary'\nimport { createStartHandler } from './start/createStartHandler'\nimport { createStop } from './stop/createStop'\nimport { ServiceWorkerMessage } from './start/utils/createMessageChannel'\nimport { RequestHandler } from '~/core/handlers/RequestHandler'\nimport { DEFAULT_START_OPTIONS } from './start/utils/prepareStartHandler'\nimport { createFallbackStart } from './start/createFallbackStart'\nimport { createFallbackStop } from './stop/createFallbackStop'\nimport { devUtils } from '~/core/utils/internal/devUtils'\nimport { SetupApi } from '~/core/SetupApi'\nimport { mergeRight } from '~/core/utils/internal/mergeRight'\nimport { LifeCycleEventsMap } from '~/core/sharedOptions'\nimport { SetupWorker } from './glossary'\nimport { supportsReadableStreamTransfer } from '../utils/supportsReadableStreamTransfer'\n\ninterface Listener {\n target: EventTarget\n eventType: string\n callback: EventListenerOrEventListenerObject\n}\n\nexport class SetupWorkerApi\n extends SetupApi<LifeCycleEventsMap>\n implements SetupWorker\n{\n private context: SetupWorkerInternalContext\n private startHandler: StartHandler = null as any\n private stopHandler: StopHandler = null as any\n private listeners: Array<Listener>\n\n constructor(...handlers: Array<RequestHandler>) {\n super(...handlers)\n\n invariant(\n !isNodeProcess(),\n devUtils.formatMessage(\n 'Failed to execute `setupWorker` in a non-browser environment. Consider using `setupServer` for Node.js environment instead.',\n ),\n )\n\n this.listeners = []\n this.context = this.createWorkerContext()\n }\n\n private createWorkerContext(): SetupWorkerInternalContext {\n const context: SetupWorkerInternalContext = {\n // Mocking is not considered enabled until the worker\n // signals back the successful activation event.\n isMockingEnabled: false,\n startOptions: null as any,\n worker: null,\n registration: null,\n requestHandlers: this.currentHandlers,\n emitter: this.emitter,\n workerChannel: {\n on: (eventType, callback) => {\n this.context.events.addListener<\n MessageEvent<ServiceWorkerMessage<typeof eventType, any>>\n >(navigator.serviceWorker, 'message', (event) => {\n // Avoid messages broadcasted from unrelated workers.\n if (event.source !== this.context.worker) {\n return\n }\n\n const message = event.data\n\n if (!message) {\n return\n }\n\n if (message.type === eventType) {\n callback(event, message)\n }\n })\n },\n send: (type) => {\n this.context.worker?.postMessage(type)\n },\n },\n events: {\n addListener: (target, eventType, callback) => {\n target.addEventListener(eventType, callback as EventListener)\n this.listeners.push({\n eventType,\n target,\n callback: callback as EventListener,\n })\n\n return () => {\n target.removeEventListener(eventType, callback as EventListener)\n }\n },\n removeAllListeners: () => {\n for (const { target, eventType, callback } of this.listeners) {\n target.removeEventListener(eventType, callback)\n }\n this.listeners = []\n },\n once: (eventType) => {\n const bindings: Array<() => void> = []\n\n return new Promise<\n ServiceWorkerMessage<\n typeof eventType,\n ServiceWorkerIncomingEventsMap[typeof eventType]\n >\n >((resolve, reject) => {\n const handleIncomingMessage = (event: MessageEvent) => {\n try {\n const message = event.data\n\n if (message.type === eventType) {\n resolve(message)\n }\n } catch (error) {\n reject(error)\n }\n }\n\n bindings.push(\n this.context.events.addListener(\n navigator.serviceWorker,\n 'message',\n handleIncomingMessage,\n ),\n this.context.events.addListener(\n navigator.serviceWorker,\n 'messageerror',\n reject,\n ),\n )\n }).finally(() => {\n bindings.forEach((unbind) => unbind())\n })\n },\n },\n supports: {\n serviceWorkerApi:\n !('serviceWorker' in navigator) || location.protocol === 'file:',\n readableStreamTransfer: supportsReadableStreamTransfer(),\n },\n }\n\n /**\n * @todo Not sure I like this but \"this.currentHandlers\"\n * updates never bubble to \"this.context.requestHandlers\".\n */\n Object.defineProperties(context, {\n requestHandlers: {\n get: () => this.currentHandlers,\n },\n })\n\n this.startHandler = context.supports.serviceWorkerApi\n ? createFallbackStart(context)\n : createStartHandler(context)\n\n this.stopHandler = context.supports.serviceWorkerApi\n ? createFallbackStop(context)\n : createStop(context)\n\n return context\n }\n\n public async start(options: StartOptions = {}): StartReturnType {\n this.context.startOptions = mergeRight(\n DEFAULT_START_OPTIONS,\n options,\n ) as SetupWorkerInternalContext['startOptions']\n\n return await this.startHandler(this.context.startOptions, options)\n }\n\n public stop(): void {\n super.dispose()\n this.context.events.removeAllListeners()\n this.context.emitter.removeAllListeners()\n this.stopHandler()\n }\n}\n\n/**\n * Sets up a requests interception in the browser with the given request handlers.\n * @param {RequestHandler[]} handlers List of request handlers.\n *\n * @see {@link https://mswjs.io/docs/api/setup-worker `setupWorker()` API reference}\n */\nexport function setupWorker(...handlers: Array<RequestHandler>): SetupWorker {\n return new SetupWorkerApi(...handlers)\n}\n","import { until } from '@open-draft/until'\nimport { devUtils } from '~/core/utils/internal/devUtils'\nimport { getWorkerInstance } from './utils/getWorkerInstance'\nimport { enableMocking } from './utils/enableMocking'\nimport { SetupWorkerInternalContext, StartHandler } from '../glossary'\nimport { createRequestListener } from './createRequestListener'\nimport { requestIntegrityCheck } from '../../utils/requestIntegrityCheck'\nimport { deferNetworkRequestsUntil } from '../../utils/deferNetworkRequestsUntil'\nimport { createResponseListener } from './createResponseListener'\nimport { validateWorkerScope } from './utils/validateWorkerScope'\n\nexport const createStartHandler = (\n context: SetupWorkerInternalContext,\n): StartHandler => {\n return function start(options, customOptions) {\n const startWorkerInstance = async () => {\n // Remove all previously existing event listeners.\n // This way none of the listeners persists between Fast refresh\n // of the application's code.\n context.events.removeAllListeners()\n\n // Handle requests signaled by the worker.\n context.workerChannel.on(\n 'REQUEST',\n createRequestListener(context, options),\n )\n\n // Handle responses signaled by the worker.\n context.workerChannel.on('RESPONSE', createResponseListener(context))\n\n const instance = await getWorkerInstance(\n options.serviceWorker.url,\n options.serviceWorker.options,\n options.findWorker,\n )\n\n const [worker, registration] = instance\n\n if (!worker) {\n const missingWorkerMessage = customOptions?.findWorker\n ? devUtils.formatMessage(\n `Failed to locate the Service Worker registration using a custom \"findWorker\" predicate.\n\nPlease ensure that the custom predicate properly locates the Service Worker registration at \"%s\".\nMore details: https://mswjs.io/docs/api/setup-worker/start#findworker\n`,\n options.serviceWorker.url,\n )\n : devUtils.formatMessage(\n `Failed to locate the Service Worker registration.\n\nThis most likely means that the worker script URL \"%s\" cannot resolve against the actual public hostname (%s). This may happen if your application runs behind a proxy, or has a dynamic hostname.\n\nPlease consider using a custom \"serviceWorker.url\" option to point to the actual worker script location, or a custom \"findWorker\" option to resolve the Service Worker registration manually. More details: https://mswjs.io/docs/api/setup-worker/start`,\n options.serviceWorker.url,\n location.host,\n )\n\n throw new Error(missingWorkerMessage)\n }\n\n context.worker = worker\n context.registration = registration\n\n context.events.addListener(window, 'beforeunload', () => {\n if (worker.state !== 'redundant') {\n // Notify the Service Worker that this client has closed.\n // Internally, it's similar to disabling the mocking, only\n // client close event has a handler that self-terminates\n // the Service Worker when there are no open clients.\n context.workerChannel.send('CLIENT_CLOSED')\n }\n // Make sure we're always clearing the interval - there are reports that not doing this can\n // cause memory leaks in headless browser environments.\n window.clearInterval(context.keepAliveInterval)\n })\n\n // Check if the active Service Worker is the latest published one\n const integrityCheckResult = await until(() =>\n requestIntegrityCheck(context, worker),\n )\n\n if (integrityCheckResult.error) {\n devUtils.error(`\\\nDetected outdated Service Worker: ${integrityCheckResult.error.message}\n\nThe mocking is still enabled, but it's highly recommended that you update your Service Worker by running:\n\n$ npx msw init <PUBLIC_DIR>\n\nThis is necessary to ensure that the Service Worker is in sync with the library to guarantee its stability.\nIf this message still persists after updating, please report an issue: https://github.com/open-draft/msw/issues\\\n `)\n }\n\n context.keepAliveInterval = window.setInterval(\n () => context.workerChannel.send('KEEPALIVE_REQUEST'),\n 5000,\n )\n\n // Warn the user when loading the page that lies outside\n // of the worker's scope.\n validateWorkerScope(registration, context.startOptions)\n\n return registration\n }\n\n const workerRegistration = startWorkerInstance().then(\n async (registration) => {\n const pendingInstance = registration.installing || registration.waiting\n\n // Wait until the worker is activated.\n // Assume the worker is already activated if there's no pending registration\n // (i.e. when reloading the page after a successful activation).\n if (pendingInstance) {\n await new Promise<void>((resolve) => {\n pendingInstance.addEventListener('statechange', () => {\n if (pendingInstance.state === 'activated') {\n return resolve()\n }\n })\n })\n }\n\n // Print the activation message only after the worker has been activated.\n await enableMocking(context, options).catch((error) => {\n throw new Error(`Failed to enable mocking: ${error?.message}`)\n })\n\n return registration\n },\n )\n\n // Defer any network requests until the Service Worker instance is ready.\n // This prevents a race condition between the Service Worker registration\n // and application's runtime requests (i.e. requests on mount).\n if (options.waitUntilReady) {\n deferNetworkRequestsUntil(workerRegistration)\n }\n\n return workerRegistration\n }\n}\n","import { until } from '@open-draft/until'\nimport { devUtils } from '~/core/utils/internal/devUtils'\nimport { getAbsoluteWorkerUrl } from '../../../utils/getAbsoluteWorkerUrl'\nimport { getWorkerByRegistration } from './getWorkerByRegistration'\nimport { ServiceWorkerInstanceTuple, FindWorker } from '../../glossary'\n\n/**\n * Returns an active Service Worker instance.\n * When not found, registers a new Service Worker.\n */\nexport const getWorkerInstance = async (\n url: string,\n options: RegistrationOptions = {},\n findWorker: FindWorker,\n): Promise<ServiceWorkerInstanceTuple> => {\n // Resolve the absolute Service Worker URL.\n const absoluteWorkerUrl = getAbsoluteWorkerUrl(url)\n\n const mockRegistrations = await navigator.serviceWorker\n .getRegistrations()\n .then((registrations) =>\n registrations.filter((registration) =>\n getWorkerByRegistration(registration, absoluteWorkerUrl, findWorker),\n ),\n )\n if (!navigator.serviceWorker.controller && mockRegistrations.length > 0) {\n // Reload the page when it has associated workers, but no active controller.\n // The absence of a controller can mean either:\n // - page has no Service Worker associated with it\n // - page has been hard-reloaded and its workers won't be used until the next reload.\n // Since we've checked that there are registrations associated with this page,\n // at this point we are sure it's hard reload that falls into this clause.\n location.reload()\n }\n\n const [existingRegistration] = mockRegistrations\n\n if (existingRegistration) {\n // When the Service Worker is registered, update it and return the reference.\n return existingRegistration.update().then(() => {\n return [\n getWorkerByRegistration(\n existingRegistration,\n absoluteWorkerUrl,\n findWorker,\n ),\n existingRegistration,\n ]\n })\n }\n\n // When the Service Worker wasn't found, register it anew and return the reference.\n const registrationResult = await until<Error, ServiceWorkerInstanceTuple>(\n async () => {\n const registration = await navigator.serviceWorker.register(url, options)\n return [\n // Compare existing worker registration by its worker URL,\n // to prevent irrelevant workers to resolve here (such as Codesandbox worker).\n getWorkerByRegistration(registration, absoluteWorkerUrl, findWorker),\n registration,\n ]\n },\n )\n\n // Handle Service Worker registration errors.\n if (registrationResult.error) {\n const isWorkerMissing = registrationResult.error.message.includes('(404)')\n\n // Produce a custom error message when given a non-existing Service Worker url.\n // Suggest developers to check their setup.\n if (isWorkerMissing) {\n const scopeUrl = new URL(options?.scope || '/', location.href)\n\n throw new Error(\n devUtils.formatMessage(`\\\nFailed to register a Service Worker for scope ('${scopeUrl.href}') with script ('${absoluteWorkerUrl}'): Service Worker script does not exist at the given path.\n\nDid you forget to run \"npx msw init <PUBLIC_DIR>\"?\n\nLearn more about creating the Service Worker script: https://mswjs.io/docs/cli/init`),\n )\n }\n\n // Fallback error message for any other registration errors.\n throw new Error(\n devUtils.formatMessage(\n 'Failed to register the Service Worker:\\n\\n%s',\n registrationResult.error.message,\n ),\n )\n }\n\n return registrationResult.data\n}\n","/**\n * Returns an absolute Service Worker URL based on the given\n * relative URL (known during the registration).\n */\nexport function getAbsoluteWorkerUrl(workerUrl: string): string {\n return new URL(workerUrl, location.href).href\n}\n","import { FindWorker } from '../../glossary'\n\n/**\n * Attempts to resolve a Service Worker instance from a given registration,\n * regardless of its state (active, installing, waiting).\n */\nexport function getWorkerByRegistration(\n registration: ServiceWorkerRegistration,\n absoluteWorkerUrl: string,\n findWorker: FindWorker,\n): ServiceWorker | null {\n const allStates = [\n registration.active,\n registration.installing,\n registration.waiting,\n ]\n const relevantStates = allStates.filter((state): state is ServiceWorker => {\n return state != null\n })\n const worker = relevantStates.find((worker) => {\n return findWorker(worker.scriptURL, absoluteWorkerUrl)\n })\n\n return worker || null\n}\n","import { devUtils } from '~/core/utils/internal/devUtils'\nimport { StartOptions, SetupWorkerInternalContext } from '../../glossary'\nimport { printStartMessage } from './printStartMessage'\n\n/**\n * Signals the worker to enable the interception of requests.\n */\nexport async function enableMocking(\n context: SetupWorkerInternalContext,\n options: StartOptions,\n) {\n context.workerChannel.send('MOCK_ACTIVATE')\n await context.events.once('MOCKING_ENABLED')\n\n // Warn the developer on multiple \"worker.start()\" calls.\n // While this will not affect the worker in any way,\n // it likely indicates an issue with the developer's code.\n if (context.isMockingEnabled) {\n devUtils.warn(\n `Found a redundant \"worker.start()\" call. Note that starting the worker while mocking is already enabled will have no effect. Consider removing this \"worker.start()\" call.`,\n )\n return\n }\n\n context.isMockingEnabled = true\n\n printStartMessage({\n quiet: options.quiet,\n workerScope: context.registration?.scope,\n workerUrl: context.worker?.scriptURL,\n })\n}\n","import { devUtils } from '~/core/utils/internal/devUtils'\n\nexport interface PrintStartMessageArgs {\n quiet?: boolean\n message?: string\n workerUrl?: string\n workerScope?: string\n}\n\n/**\n * Prints a worker activation message in the browser's console.\n */\nexport function printStartMessage(args: PrintStartMessageArgs = {}) {\n if (args.quiet) {\n return\n }\n\n const message = args.message || 'Mocking enabled.'\n\n console.groupCollapsed(\n `%c${devUtils.formatMessage(message)}`,\n 'color:orangered;font-weight:bold;',\n )\n console.log(\n '%cDocumentation: %chttps://mswjs.io/docs',\n 'font-weight:bold',\n 'font-weight:normal',\n )\n console.log('Found an issue? https://github.com/mswjs/msw/issues')\n\n if (args.workerUrl) {\n console.log('Worker script URL:', args.workerUrl)\n }\n\n if (args.workerScope) {\n console.log('Worker scope:', args.workerScope)\n }\n\n console.groupEnd()\n}\n","import {\n StringifiedResponse,\n ServiceWorkerIncomingEventsMap,\n} from '../../glossary'\n\nexport interface ServiceWorkerMessage<\n EventType extends keyof ServiceWorkerIncomingEventsMap,\n EventPayload,\n> {\n type: EventType\n payload: EventPayload\n}\n\ninterface WorkerChannelEventsMap {\n MOCK_RESPONSE: [\n data: StringifiedResponse,\n transfer?: [ReadableStream<Uint8Array>],\n ]\n NOT_FOUND: []\n}\n\nexport class WorkerChannel {\n constructor(private readonly port: MessagePort) {}\n\n public postMessage<Event extends keyof WorkerChannelEventsMap>(\n event: Event,\n ...rest: WorkerChannelEventsMap[Event]\n ): void {\n const [data, transfer] = rest\n this.port.postMessage({ type: event, data }, { transfer })\n }\n}\n","import type { ServiceWorkerIncomingRequest } from '../setupWorker/glossary'\n\ntype Input = Pick<ServiceWorkerIncomingRequest, 'method' | 'body'>\n\n/**\n * Ensures that an empty GET request body is always represented as `undefined`.\n */\nexport function pruneGetRequestBody(\n request: Input,\n): ServiceWorkerIncomingRequest['body'] {\n // Force HEAD/GET request body to always be empty.\n // The worker reads any request's body as ArrayBuffer,\n // and you cannot re-construct a GET/HEAD Request\n // with an ArrayBuffer, even if empty. Also note that\n // \"request.body\" is always undefined in the worker.\n if (['HEAD', 'GET'].includes(request.method)) {\n return undefined\n }\n\n return request.body\n}\n","import { pruneGetRequestBody } from './pruneGetRequestBody'\nimport type { ServiceWorkerIncomingRequest } from '../setupWorker/glossary'\n\n/**\n * Converts a given request received from the Service Worker\n * into a Fetch `Request` instance.\n */\nexport function parseWorkerRequest(\n incomingRequest: ServiceWorkerIncomingRequest,\n): Request {\n return new Request(incomingRequest.url, {\n ...incomingRequest,\n body: pruneGetRequestBody(incomingRequest),\n })\n}\n","import {\n StartOptions,\n SetupWorkerInternalContext,\n ServiceWorkerIncomingEventsMap,\n} from '../glossary'\nimport {\n ServiceWorkerMessage,\n WorkerChannel,\n} from './utils/createMessageChannel'\nimport { parseWorkerRequest } from '../../utils/parseWorkerRequest'\nimport { handleRequest } from '~/core/utils/handleRequest'\nimport { RequiredDeep } from '~/core/typeUtils'\nimport { devUtils } from '~/core/utils/internal/devUtils'\nimport { toResponseInit } from '~/core/utils/toResponseInit'\n\nexport const createRequestListener = (\n context: SetupWorkerInternalContext,\n options: RequiredDeep<StartOptions>,\n) => {\n return async (\n event: MessageEvent,\n message: ServiceWorkerMessage<\n 'REQUEST',\n ServiceWorkerIncomingEventsMap['REQUEST']\n >,\n ) => {\n const messageChannel = new WorkerChannel(event.ports[0])\n\n const requestId = message.payload.id\n const request = parseWorkerRequest(message.payload)\n const requestCloneForLogs = request.clone()\n\n try {\n await handleRequest(\n request,\n requestId,\n context.requestHandlers,\n options,\n context.emitter,\n {\n onPassthroughResponse() {\n messageChannel.postMessage('NOT_FOUND')\n },\n async onMockedResponse(response, { handler, parsedResult }) {\n // Clone the mocked response so its body could be read\n // to buffer to be sent to the worker and also in the\n // \".log()\" method of the request handler.\n const responseClone = response.clone()\n const responseCloneForLogs = response.clone()\n const responseInit = toResponseInit(response)\n\n /**\n * @note Safari doesn't support transferring a \"ReadableStream\".\n * Check that the browser supports that before sending it to the worker.\n */\n if (context.supports.readableStreamTransfer) {\n const responseStreamOrNull = response.body\n\n messageChannel.postMessage(\n 'MOCK_RESPONSE',\n {\n ...responseInit,\n body: responseStreamOrNull,\n },\n responseStreamOrNull ? [responseStreamOrNull] : undefined,\n )\n } else {\n /**\n * @note If we are here, this means the current environment doesn't\n * support \"ReadableStream\" as transferable. In that case,\n * attempt to read the non-empty response body as ArrayBuffer, if it's not empty.\n * @see https://github.com/mswjs/msw/issues/1827\n */\n const responseBufferOrNull =\n response.body === null\n ? null\n : await responseClone.arrayBuffer()\n\n messageChannel.postMessage('MOCK_RESPONSE', {\n ...responseInit,\n body: responseBufferOrNull,\n })\n }\n\n if (!options.quiet) {\n context.emitter.once('response:mocked', () => {\n handler.log({\n request: requestCloneForLogs,\n response: responseCloneForLogs,\n parsedResult,\n })\n })\n }\n },\n },\n )\n } catch (error) {\n if (error instanceof Error) {\n devUtils.error(\n `Uncaught exception in the request handler for \"%s %s\":\n\n%s\n\nThis exception has been gracefully handled as a 500 response, however, it's strongly recommended to resolve this error, as it indicates a mistake in your code. If you wish to mock an error response, please see this guide: https://mswjs.io/docs/recipes/mocking-error-responses`,\n request.method,\n request.url,\n error.stack ?? error,\n )\n\n // Treat all other exceptions in a request handler as unintended,\n // alerting that there is a problem that needs fixing.\n messageChannel.postMessage('MOCK_RESPONSE', {\n status: 500,\n statusText: 'Request Handler Error',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n name: error.name,\n message: error.message,\n stack: error.stack,\n }),\n })\n }\n }\n }\n}\n","import type { SetupWorkerInternalContext } from '../setupWorker/glossary'\n\nexport async function requestIntegrityCheck(\n context: SetupWorkerInternalContext,\n serviceWorker: ServiceWorker,\n): Promise<ServiceWorker> {\n // Signal Service Worker to report back its integrity\n context.workerChannel.send('INTEGRITY_CHECK_REQUEST')\n\n const { payload: actualChecksum } = await context.events.once(\n 'INTEGRITY_CHECK_RESPONSE',\n )\n\n // Compare the response from the Service Worker and the\n // global variable set during the build.\n if (actualChecksum !== SERVICE_WORKER_CHECKSUM) {\n throw new Error(\n `Currently active Service Worker (${actualChecksum}) is behind the latest published one (${SERVICE_WORKER_CHECKSUM}).`,\n )\n }\n\n return serviceWorker\n}\n","import { until } from '@open-draft/until'\n\n/**\n * Intercepts and defers any requests on the page\n * until the Service Worker instance is ready.\n * Must only be used in a browser.\n */\nexport function deferNetworkRequestsUntil(predicatePromise: Promise<any>) {\n // Defer any `XMLHttpRequest` requests until the Service Worker is ready.\n const originalXhrSend = window.XMLHttpRequest.prototype.send\n window.XMLHttpRequest.prototype.send = function (\n ...args: Parameters<XMLHttpRequest['send']>\n ) {\n // Keep this function synchronous to comply with `XMLHttpRequest.prototype.send`,\n // because that method is always synchronous.\n until(() => predicatePromise).then(() => {\n window.XMLHttpRequest.prototype.send = originalXhrSend\n this.send(...args)\n })\n }\n\n // Defer any `fetch` requests until the Service Worker is ready.\n const originalFetch = window.fetch\n window.fetch = async (...args) => {\n await until(() => predicatePromise)\n window.fetch = originalFetch\n return window.fetch(...args)\n }\n}\n","import {\n ServiceWorkerIncomingEventsMap,\n SetupWorkerInternalContext,\n} from '../glossary'\nimport { ServiceWorkerMessage } from './utils/createMessageChannel'\nimport { isResponseWithoutBody } from '@mswjs/interceptors'\n\nexport function createResponseListener(context: SetupWorkerInternalContext) {\n return (\n _: MessageEvent,\n message: ServiceWorkerMessage<\n 'RESPONSE',\n ServiceWorkerIncomingEventsMap['RESPONSE']\n >,\n ) => {\n const { payload: responseJson } = message\n\n /**\n * CORS requests with `mode: \"no-cors\"` result in \"opaque\" responses.\n * That kind of responses cannot be manipulated in JavaScript due\n * to the security considerations.\n * @see https://fetch.spec.whatwg.org/#concept-filtered-response-opaque\n * @see https://github.com/mswjs/msw/issues/529\n */\n if (responseJson.type?.includes('opaque')) {\n return\n }\n\n const response =\n responseJson.status === 0\n ? Response.error()\n : new Response(\n /**\n * Responses may be streams here, but when we create a response object\n * with null-body status codes, like 204, 205, 304 Response will\n * throw when passed a non-null body, so ensure it's null here\n * for those codes\n */\n isResponseWithoutBody(responseJson.status)\n ? null\n : responseJson.body,\n responseJson,\n )\n\n context.emitter.emit(\n responseJson.isMockedResponse ? 'response:mocked' : 'response:bypass',\n {\n response,\n /**\n * @todo @fixme In this context, we don't know anything about\n * the request.\n */\n request: null as any,\n requestId: responseJson.requestId,\n },\n )\n }\n}\n","import { devUtils } from '~/core/utils/internal/devUtils'\nimport { StartOptions } from '../../glossary'\n\nexport function validateWorkerScope(\n registration: ServiceWorkerRegistration,\n options?: StartOptions,\n): void {\n if (!options?.quiet && !location.href.startsWith(registration.scope)) {\n devUtils.warn(\n `\\\nCannot intercept requests on this page because it's outside of the worker's scope (\"${registration.scope}\"). If you wish to mock API requests on this page, you must resolve this scope issue.\n\n- (Recommended) Register the worker at the root level (\"/\") of your application.\n- Set the \"Service-Worker-Allowed\" response header to allow out-of-scope workers.\\\n`,\n )\n }\n}\n","import { devUtils } from '~/core/utils/internal/devUtils'\nimport { SetupWorkerInternalContext, StopHandler } from '../glossary'\nimport { printStopMessage } from './utils/printStopMessage'\n\nexport const createStop = (\n context: SetupWorkerInternalContext,\n): StopHandler => {\n return function stop() {\n // Warn developers calling \"worker.stop()\" more times than necessary.\n // This likely indicates a mistake in their code.\n if (!context.isMockingEnabled) {\n devUtils.warn(\n 'Found a redundant \"worker.stop()\" call. Note that stopping the worker while mocking already stopped has no effect. Consider removing this \"worker.stop()\" call.',\n )\n return\n }\n\n /**\n * Signal the Service Worker to disable mocking for this client.\n * Use this an an explicit way to stop the mocking, while preserving\n * the worker-client relation. Does not affect the worker's lifecycle.\n */\n context.workerChannel.send('MOCK_DEACTIVATE')\n context.isMockingEnabled = false\n window.clearInterval(context.keepAliveInterval)\n\n printStopMessage({ quiet: context.startOptions?.quiet })\n }\n}\n","import { devUtils } from '~/core/utils/internal/devUtils'\n\nexport function printStopMessage(args: { quiet?: boolean } = {}): void {\n if (args.quiet) {\n return\n }\n\n console.log(\n `%c${devUtils.formatMessage('Mocking disabled.')}`,\n 'color:orangered;font-weight:bold;',\n )\n}\n","import { RequiredDeep } from '~/core/typeUtils'\nimport { mergeRight } from '~/core/utils/internal/mergeRight'\nimport {\n SetupWorker,\n SetupWorkerInternalContext,\n StartHandler,\n StartOptions,\n} from '../../glossary'\n\nexport const DEFAULT_START_OPTIONS: RequiredDeep<StartOptions> = {\n serviceWorker: {\n url: '/mockServiceWorker.js',\n options: null as any,\n },\n quiet: false,\n waitUntilReady: true,\n onUnhandledRequest: 'warn',\n findWorker(scriptURL, mockServiceWorkerUrl) {\n return scriptURL === mockServiceWorkerUrl\n },\n}\n\n/**\n * Returns resolved worker start options, merging the default options\n * with the given custom options.\n */\nexport function resolveStartOptions(\n initialOptions?: StartOptions,\n): RequiredDeep<StartOptions> {\n return mergeRight(\n DEFAULT_START_OPTIONS,\n initialOptions || {},\n ) as RequiredDeep<StartOptions>\n}\n\nexport function prepareStartHandler(\n handler: StartHandler,\n context: SetupWorkerInternalContext,\n): SetupWorker['start'] {\n return (initialOptions) => {\n context.startOptions = resolveStartOptions(initialOptions)\n return handler(context.startOptions, initialOptions || {})\n }\n}\n","import {\n Interceptor,\n BatchInterceptor,\n HttpRequestEventMap,\n} from '@mswjs/interceptors'\nimport { FetchInterceptor } from '@mswjs/interceptors/fetch'\nimport { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest'\nimport { SetupWorkerInternalContext, StartOptions } from '../glossary'\nimport type { RequiredDeep } from '~/core/typeUtils'\nimport { handleRequest } from '~/core/utils/handleRequest'\n\nexport function createFallbackRequestListener(\n context: SetupWorkerInternalContext,\n options: RequiredDeep<StartOptions>,\n): Interceptor<HttpRequestEventMap> {\n const interceptor = new BatchInterceptor({\n name: 'fallback',\n interceptors: [new FetchInterceptor(), new XMLHttpRequestInterceptor()],\n })\n\n interceptor.on('request', async ({ request, requestId }) => {\n const requestCloneForLogs = request.clone()\n\n const response = await handleRequest(\n request,\n requestId,\n context.requestHandlers,\n options,\n context.emitter,\n {\n onMockedResponse(_, { handler, parsedResult }) {\n if (!options.quiet) {\n context.emitter.once('response:mocked', ({ response }) => {\n handler.log({\n request: requestCloneForLogs,\n response,\n parsedResult,\n })\n })\n }\n },\n },\n )\n\n if (response) {\n request.respondWith(response)\n }\n })\n\n interceptor.on(\n 'response',\n ({ response, isMockedResponse, request, requestId }) => {\n context.emitter.emit(\n isMockedResponse ? 'response:mocked' : 'response:bypass',\n {\n response,\n request,\n requestId,\n },\n )\n },\n )\n\n interceptor.apply()\n\n return interceptor\n}\n","import { createFallbackRequestListener } from './createFallbackRequestListener'\nimport { SetupWorkerInternalContext, StartHandler } from '../glossary'\nimport { printStartMessage } from './utils/printStartMessage'\n\nexport function createFallbackStart(\n context: SetupWorkerInternalContext,\n): StartHandler {\n return async function start(options) {\n context.fallbackInterceptor = createFallbackRequestListener(\n context,\n options,\n )\n\n printStartMessage({\n message: 'Mocking enabled (fallback mode).',\n quiet: options.quiet,\n })\n\n return undefined\n }\n}\n","import { SetupWorkerInternalContext, StopHandler } from '../glossary'\nimport { printStopMessage } from './utils/printStopMessage'\n\nexport function createFallbackStop(\n context: SetupWorkerInternalContext,\n): StopHandler {\n return function stop() {\n context.fallbackInterceptor?.dispose()\n printStopMessage({ quiet: context.startOptions?.quiet })\n }\n}\n","/**\n * Returns a boolean indicating whether the current browser\n * supports `ReadableStream` as a `Transferable` when posting\n * messages.\n */\nexport function supportsReadableStreamTransfer() {\n try {\n const stream = new ReadableStream({\n start: (controller) => controller.close(),\n })\n const message = new MessageChannel()\n message.port1.postMessage(stream, [stream])\n return true\n } catch (error) {\n return false\n }\n}\n"],"mappings":"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","names":["import_until","import_devUtils","worker","import_devUtils","import_devUtils","import_devUtils","import_until","import_devUtils","import_devUtils","import_devUtils","import_interceptors","import_handleRequest","response","import_devUtils","import_mergeRight"]}
@@ -735,3 +735,4 @@ export {
735
735
  SetupWorkerApi,
736
736
  setupWorker
737
737
  };
738
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/browser/setupWorker/setupWorker.ts","../../src/browser/setupWorker/start/createStartHandler.ts","../../src/browser/setupWorker/start/utils/getWorkerInstance.ts","../../src/browser/utils/getAbsoluteWorkerUrl.ts","../../src/browser/setupWorker/start/utils/getWorkerByRegistration.ts","../../src/browser/setupWorker/start/utils/enableMocking.ts","../../src/browser/setupWorker/start/utils/printStartMessage.ts","../../src/browser/setupWorker/start/utils/createMessageChannel.ts","../../src/browser/utils/pruneGetRequestBody.ts","../../src/browser/utils/parseWorkerRequest.ts","../../src/browser/setupWorker/start/createRequestListener.ts","../../src/browser/utils/requestIntegrityCheck.ts","../../src/browser/utils/deferNetworkRequestsUntil.ts","../../src/browser/setupWorker/start/createResponseListener.ts","../../src/browser/setupWorker/start/utils/validateWorkerScope.ts","../../src/browser/setupWorker/stop/createStop.ts","../../src/browser/setupWorker/stop/utils/printStopMessage.ts","../../src/browser/setupWorker/start/utils/prepareStartHandler.ts","../../src/browser/setupWorker/start/createFallbackRequestListener.ts","../../src/browser/setupWorker/start/createFallbackStart.ts","../../src/browser/setupWorker/stop/createFallbackStop.ts","../../src/browser/utils/supportsReadableStreamTransfer.ts"],"sourcesContent":["import { invariant } from 'outvariant'\nimport { isNodeProcess } from 'is-node-process'\nimport {\n SetupWorkerInternalContext,\n ServiceWorkerIncomingEventsMap,\n StartReturnType,\n StopHandler,\n StartHandler,\n StartOptions,\n} from './glossary'\nimport { createStartHandler } from './start/createStartHandler'\nimport { createStop } from './stop/createStop'\nimport { ServiceWorkerMessage } from './start/utils/createMessageChannel'\nimport { RequestHandler } from '~/core/handlers/RequestHandler'\nimport { DEFAULT_START_OPTIONS } from './start/utils/prepareStartHandler'\nimport { createFallbackStart } from './start/createFallbackStart'\nimport { createFallbackStop } from './stop/createFallbackStop'\nimport { devUtils } from '~/core/utils/internal/devUtils'\nimport { SetupApi } from '~/core/SetupApi'\nimport { mergeRight } from '~/core/utils/internal/mergeRight'\nimport { LifeCycleEventsMap } from '~/core/sharedOptions'\nimport { SetupWorker } from './glossary'\nimport { supportsReadableStreamTransfer } from '../utils/supportsReadableStreamTransfer'\n\ninterface Listener {\n target: EventTarget\n eventType: string\n callback: EventListenerOrEventListenerObject\n}\n\nexport class SetupWorkerApi\n extends SetupApi<LifeCycleEventsMap>\n implements SetupWorker\n{\n private context: SetupWorkerInternalContext\n private startHandler: StartHandler = null as any\n private stopHandler: StopHandler = null as any\n private listeners: Array<Listener>\n\n constructor(...handlers: Array<RequestHandler>) {\n super(...handlers)\n\n invariant(\n !isNodeProcess(),\n devUtils.formatMessage(\n 'Failed to execute `setupWorker` in a non-browser environment. Consider using `setupServer` for Node.js environment instead.',\n ),\n )\n\n this.listeners = []\n this.context = this.createWorkerContext()\n }\n\n private createWorkerContext(): SetupWorkerInternalContext {\n const context: SetupWorkerInternalContext = {\n // Mocking is not considered enabled until the worker\n // signals back the successful activation event.\n isMockingEnabled: false,\n startOptions: null as any,\n worker: null,\n registration: null,\n requestHandlers: this.currentHandlers,\n emitter: this.emitter,\n workerChannel: {\n on: (eventType, callback) => {\n this.context.events.addListener<\n MessageEvent<ServiceWorkerMessage<typeof eventType, any>>\n >(navigator.serviceWorker, 'message', (event) => {\n // Avoid messages broadcasted from unrelated workers.\n if (event.source !== this.context.worker) {\n return\n }\n\n const message = event.data\n\n if (!message) {\n return\n }\n\n if (message.type === eventType) {\n callback(event, message)\n }\n })\n },\n send: (type) => {\n this.context.worker?.postMessage(type)\n },\n },\n events: {\n addListener: (target, eventType, callback) => {\n target.addEventListener(eventType, callback as EventListener)\n this.listeners.push({\n eventType,\n target,\n callback: callback as EventListener,\n })\n\n return () => {\n target.removeEventListener(eventType, callback as EventListener)\n }\n },\n removeAllListeners: () => {\n for (const { target, eventType, callback } of this.listeners) {\n target.removeEventListener(eventType, callback)\n }\n this.listeners = []\n },\n once: (eventType) => {\n const bindings: Array<() => void> = []\n\n return new Promise<\n ServiceWorkerMessage<\n typeof eventType,\n ServiceWorkerIncomingEventsMap[typeof eventType]\n >\n >((resolve, reject) => {\n const handleIncomingMessage = (event: MessageEvent) => {\n try {\n const message = event.data\n\n if (message.type === eventType) {\n resolve(message)\n }\n } catch (error) {\n reject(error)\n }\n }\n\n bindings.push(\n this.context.events.addListener(\n navigator.serviceWorker,\n 'message',\n handleIncomingMessage,\n ),\n this.context.events.addListener(\n navigator.serviceWorker,\n 'messageerror',\n reject,\n ),\n )\n }).finally(() => {\n bindings.forEach((unbind) => unbind())\n })\n },\n },\n supports: {\n serviceWorkerApi:\n !('serviceWorker' in navigator) || location.protocol === 'file:',\n readableStreamTransfer: supportsReadableStreamTransfer(),\n },\n }\n\n /**\n * @todo Not sure I like this but \"this.currentHandlers\"\n * updates never bubble to \"this.context.requestHandlers\".\n */\n Object.defineProperties(context, {\n requestHandlers: {\n get: () => this.currentHandlers,\n },\n })\n\n this.startHandler = context.supports.serviceWorkerApi\n ? createFallbackStart(context)\n : createStartHandler(context)\n\n this.stopHandler = context.supports.serviceWorkerApi\n ? createFallbackStop(context)\n : createStop(context)\n\n return context\n }\n\n public async start(options: StartOptions = {}): StartReturnType {\n this.context.startOptions = mergeRight(\n DEFAULT_START_OPTIONS,\n options,\n ) as SetupWorkerInternalContext['startOptions']\n\n return await this.startHandler(this.context.startOptions, options)\n }\n\n public stop(): void {\n super.dispose()\n this.context.events.removeAllListeners()\n this.context.emitter.removeAllListeners()\n this.stopHandler()\n }\n}\n\n/**\n * Sets up a requests interception in the browser with the given request handlers.\n * @param {RequestHandler[]} handlers List of request handlers.\n *\n * @see {@link https://mswjs.io/docs/api/setup-worker `setupWorker()` API reference}\n */\nexport function setupWorker(...handlers: Array<RequestHandler>): SetupWorker {\n return new SetupWorkerApi(...handlers)\n}\n","import { until } from '@open-draft/until'\nimport { devUtils } from '~/core/utils/internal/devUtils'\nimport { getWorkerInstance } from './utils/getWorkerInstance'\nimport { enableMocking } from './utils/enableMocking'\nimport { SetupWorkerInternalContext, StartHandler } from '../glossary'\nimport { createRequestListener } from './createRequestListener'\nimport { requestIntegrityCheck } from '../../utils/requestIntegrityCheck'\nimport { deferNetworkRequestsUntil } from '../../utils/deferNetworkRequestsUntil'\nimport { createResponseListener } from './createResponseListener'\nimport { validateWorkerScope } from './utils/validateWorkerScope'\n\nexport const createStartHandler = (\n context: SetupWorkerInternalContext,\n): StartHandler => {\n return function start(options, customOptions) {\n const startWorkerInstance = async () => {\n // Remove all previously existing event listeners.\n // This way none of the listeners persists between Fast refresh\n // of the application's code.\n context.events.removeAllListeners()\n\n // Handle requests signaled by the worker.\n context.workerChannel.on(\n 'REQUEST',\n createRequestListener(context, options),\n )\n\n // Handle responses signaled by the worker.\n context.workerChannel.on('RESPONSE', createResponseListener(context))\n\n const instance = await getWorkerInstance(\n options.serviceWorker.url,\n options.serviceWorker.options,\n options.findWorker,\n )\n\n const [worker, registration] = instance\n\n if (!worker) {\n const missingWorkerMessage = customOptions?.findWorker\n ? devUtils.formatMessage(\n `Failed to locate the Service Worker registration using a custom \"findWorker\" predicate.\n\nPlease ensure that the custom predicate properly locates the Service Worker registration at \"%s\".\nMore details: https://mswjs.io/docs/api/setup-worker/start#findworker\n`,\n options.serviceWorker.url,\n )\n : devUtils.formatMessage(\n `Failed to locate the Service Worker registration.\n\nThis most likely means that the worker script URL \"%s\" cannot resolve against the actual public hostname (%s). This may happen if your application runs behind a proxy, or has a dynamic hostname.\n\nPlease consider using a custom \"serviceWorker.url\" option to point to the actual worker script location, or a custom \"findWorker\" option to resolve the Service Worker registration manually. More details: https://mswjs.io/docs/api/setup-worker/start`,\n options.serviceWorker.url,\n location.host,\n )\n\n throw new Error(missingWorkerMessage)\n }\n\n context.worker = worker\n context.registration = registration\n\n context.events.addListener(window, 'beforeunload', () => {\n if (worker.state !== 'redundant') {\n // Notify the Service Worker that this client has closed.\n // Internally, it's similar to disabling the mocking, only\n // client close event has a handler that self-terminates\n // the Service Worker when there are no open clients.\n context.workerChannel.send('CLIENT_CLOSED')\n }\n // Make sure we're always clearing the interval - there are reports that not doing this can\n // cause memory leaks in headless browser environments.\n window.clearInterval(context.keepAliveInterval)\n })\n\n // Check if the active Service Worker is the latest published one\n const integrityCheckResult = await until(() =>\n requestIntegrityCheck(context, worker),\n )\n\n if (integrityCheckResult.error) {\n devUtils.error(`\\\nDetected outdated Service Worker: ${integrityCheckResult.error.message}\n\nThe mocking is still enabled, but it's highly recommended that you update your Service Worker by running:\n\n$ npx msw init <PUBLIC_DIR>\n\nThis is necessary to ensure that the Service Worker is in sync with the library to guarantee its stability.\nIf this message still persists after updating, please report an issue: https://github.com/open-draft/msw/issues\\\n `)\n }\n\n context.keepAliveInterval = window.setInterval(\n () => context.workerChannel.send('KEEPALIVE_REQUEST'),\n 5000,\n )\n\n // Warn the user when loading the page that lies outside\n // of the worker's scope.\n validateWorkerScope(registration, context.startOptions)\n\n return registration\n }\n\n const workerRegistration = startWorkerInstance().then(\n async (registration) => {\n const pendingInstance = registration.installing || registration.waiting\n\n // Wait until the worker is activated.\n // Assume the worker is already activated if there's no pending registration\n // (i.e. when reloading the page after a successful activation).\n if (pendingInstance) {\n await new Promise<void>((resolve) => {\n pendingInstance.addEventListener('statechange', () => {\n if (pendingInstance.state === 'activated') {\n return resolve()\n }\n })\n })\n }\n\n // Print the activation message only after the worker has been activated.\n await enableMocking(context, options).catch((error) => {\n throw new Error(`Failed to enable mocking: ${error?.message}`)\n })\n\n return registration\n },\n )\n\n // Defer any network requests until the Service Worker instance is ready.\n // This prevents a race condition between the Service Worker registration\n // and application's runtime requests (i.e. requests on mount).\n if (options.waitUntilReady) {\n deferNetworkRequestsUntil(workerRegistration)\n }\n\n return workerRegistration\n }\n}\n","import { until } from '@open-draft/until'\nimport { devUtils } from '~/core/utils/internal/devUtils'\nimport { getAbsoluteWorkerUrl } from '../../../utils/getAbsoluteWorkerUrl'\nimport { getWorkerByRegistration } from './getWorkerByRegistration'\nimport { ServiceWorkerInstanceTuple, FindWorker } from '../../glossary'\n\n/**\n * Returns an active Service Worker instance.\n * When not found, registers a new Service Worker.\n */\nexport const getWorkerInstance = async (\n url: string,\n options: RegistrationOptions = {},\n findWorker: FindWorker,\n): Promise<ServiceWorkerInstanceTuple> => {\n // Resolve the absolute Service Worker URL.\n const absoluteWorkerUrl = getAbsoluteWorkerUrl(url)\n\n const mockRegistrations = await navigator.serviceWorker\n .getRegistrations()\n .then((registrations) =>\n registrations.filter((registration) =>\n getWorkerByRegistration(registration, absoluteWorkerUrl, findWorker),\n ),\n )\n if (!navigator.serviceWorker.controller && mockRegistrations.length > 0) {\n // Reload the page when it has associated workers, but no active controller.\n // The absence of a controller can mean either:\n // - page has no Service Worker associated with it\n // - page has been hard-reloaded and its workers won't be used until the next reload.\n // Since we've checked that there are registrations associated with this page,\n // at this point we are sure it's hard reload that falls into this clause.\n location.reload()\n }\n\n const [existingRegistration] = mockRegistrations\n\n if (existingRegistration) {\n // When the Service Worker is registered, update it and return the reference.\n return existingRegistration.update().then(() => {\n return [\n getWorkerByRegistration(\n existingRegistration,\n absoluteWorkerUrl,\n findWorker,\n ),\n existingRegistration,\n ]\n })\n }\n\n // When the Service Worker wasn't found, register it anew and return the reference.\n const registrationResult = await until<Error, ServiceWorkerInstanceTuple>(\n async () => {\n const registration = await navigator.serviceWorker.register(url, options)\n return [\n // Compare existing worker registration by its worker URL,\n // to prevent irrelevant workers to resolve here (such as Codesandbox worker).\n getWorkerByRegistration(registration, absoluteWorkerUrl, findWorker),\n registration,\n ]\n },\n )\n\n // Handle Service Worker registration errors.\n if (registrationResult.error) {\n const isWorkerMissing = registrationResult.error.message.includes('(404)')\n\n // Produce a custom error message when given a non-existing Service Worker url.\n // Suggest developers to check their setup.\n if (isWorkerMissing) {\n const scopeUrl = new URL(options?.scope || '/', location.href)\n\n throw new Error(\n devUtils.formatMessage(`\\\nFailed to register a Service Worker for scope ('${scopeUrl.href}') with script ('${absoluteWorkerUrl}'): Service Worker script does not exist at the given path.\n\nDid you forget to run \"npx msw init <PUBLIC_DIR>\"?\n\nLearn more about creating the Service Worker script: https://mswjs.io/docs/cli/init`),\n )\n }\n\n // Fallback error message for any other registration errors.\n throw new Error(\n devUtils.formatMessage(\n 'Failed to register the Service Worker:\\n\\n%s',\n registrationResult.error.message,\n ),\n )\n }\n\n return registrationResult.data\n}\n","/**\n * Returns an absolute Service Worker URL based on the given\n * relative URL (known during the registration).\n */\nexport function getAbsoluteWorkerUrl(workerUrl: string): string {\n return new URL(workerUrl, location.href).href\n}\n","import { FindWorker } from '../../glossary'\n\n/**\n * Attempts to resolve a Service Worker instance from a given registration,\n * regardless of its state (active, installing, waiting).\n */\nexport function getWorkerByRegistration(\n registration: ServiceWorkerRegistration,\n absoluteWorkerUrl: string,\n findWorker: FindWorker,\n): ServiceWorker | null {\n const allStates = [\n registration.active,\n registration.installing,\n registration.waiting,\n ]\n const relevantStates = allStates.filter((state): state is ServiceWorker => {\n return state != null\n })\n const worker = relevantStates.find((worker) => {\n return findWorker(worker.scriptURL, absoluteWorkerUrl)\n })\n\n return worker || null\n}\n","import { devUtils } from '~/core/utils/internal/devUtils'\nimport { StartOptions, SetupWorkerInternalContext } from '../../glossary'\nimport { printStartMessage } from './printStartMessage'\n\n/**\n * Signals the worker to enable the interception of requests.\n */\nexport async function enableMocking(\n context: SetupWorkerInternalContext,\n options: StartOptions,\n) {\n context.workerChannel.send('MOCK_ACTIVATE')\n await context.events.once('MOCKING_ENABLED')\n\n // Warn the developer on multiple \"worker.start()\" calls.\n // While this will not affect the worker in any way,\n // it likely indicates an issue with the developer's code.\n if (context.isMockingEnabled) {\n devUtils.warn(\n `Found a redundant \"worker.start()\" call. Note that starting the worker while mocking is already enabled will have no effect. Consider removing this \"worker.start()\" call.`,\n )\n return\n }\n\n context.isMockingEnabled = true\n\n printStartMessage({\n quiet: options.quiet,\n workerScope: context.registration?.scope,\n workerUrl: context.worker?.scriptURL,\n })\n}\n","import { devUtils } from '~/core/utils/internal/devUtils'\n\nexport interface PrintStartMessageArgs {\n quiet?: boolean\n message?: string\n workerUrl?: string\n workerScope?: string\n}\n\n/**\n * Prints a worker activation message in the browser's console.\n */\nexport function printStartMessage(args: PrintStartMessageArgs = {}) {\n if (args.quiet) {\n return\n }\n\n const message = args.message || 'Mocking enabled.'\n\n console.groupCollapsed(\n `%c${devUtils.formatMessage(message)}`,\n 'color:orangered;font-weight:bold;',\n )\n console.log(\n '%cDocumentation: %chttps://mswjs.io/docs',\n 'font-weight:bold',\n 'font-weight:normal',\n )\n console.log('Found an issue? https://github.com/mswjs/msw/issues')\n\n if (args.workerUrl) {\n console.log('Worker script URL:', args.workerUrl)\n }\n\n if (args.workerScope) {\n console.log('Worker scope:', args.workerScope)\n }\n\n console.groupEnd()\n}\n","import {\n StringifiedResponse,\n ServiceWorkerIncomingEventsMap,\n} from '../../glossary'\n\nexport interface ServiceWorkerMessage<\n EventType extends keyof ServiceWorkerIncomingEventsMap,\n EventPayload,\n> {\n type: EventType\n payload: EventPayload\n}\n\ninterface WorkerChannelEventsMap {\n MOCK_RESPONSE: [\n data: StringifiedResponse,\n transfer?: [ReadableStream<Uint8Array>],\n ]\n NOT_FOUND: []\n}\n\nexport class WorkerChannel {\n constructor(private readonly port: MessagePort) {}\n\n public postMessage<Event extends keyof WorkerChannelEventsMap>(\n event: Event,\n ...rest: WorkerChannelEventsMap[Event]\n ): void {\n const [data, transfer] = rest\n this.port.postMessage({ type: event, data }, { transfer })\n }\n}\n","import type { ServiceWorkerIncomingRequest } from '../setupWorker/glossary'\n\ntype Input = Pick<ServiceWorkerIncomingRequest, 'method' | 'body'>\n\n/**\n * Ensures that an empty GET request body is always represented as `undefined`.\n */\nexport function pruneGetRequestBody(\n request: Input,\n): ServiceWorkerIncomingRequest['body'] {\n // Force HEAD/GET request body to always be empty.\n // The worker reads any request's body as ArrayBuffer,\n // and you cannot re-construct a GET/HEAD Request\n // with an ArrayBuffer, even if empty. Also note that\n // \"request.body\" is always undefined in the worker.\n if (['HEAD', 'GET'].includes(request.method)) {\n return undefined\n }\n\n return request.body\n}\n","import { pruneGetRequestBody } from './pruneGetRequestBody'\nimport type { ServiceWorkerIncomingRequest } from '../setupWorker/glossary'\n\n/**\n * Converts a given request received from the Service Worker\n * into a Fetch `Request` instance.\n */\nexport function parseWorkerRequest(\n incomingRequest: ServiceWorkerIncomingRequest,\n): Request {\n return new Request(incomingRequest.url, {\n ...incomingRequest,\n body: pruneGetRequestBody(incomingRequest),\n })\n}\n","import {\n StartOptions,\n SetupWorkerInternalContext,\n ServiceWorkerIncomingEventsMap,\n} from '../glossary'\nimport {\n ServiceWorkerMessage,\n WorkerChannel,\n} from './utils/createMessageChannel'\nimport { parseWorkerRequest } from '../../utils/parseWorkerRequest'\nimport { handleRequest } from '~/core/utils/handleRequest'\nimport { RequiredDeep } from '~/core/typeUtils'\nimport { devUtils } from '~/core/utils/internal/devUtils'\nimport { toResponseInit } from '~/core/utils/toResponseInit'\n\nexport const createRequestListener = (\n context: SetupWorkerInternalContext,\n options: RequiredDeep<StartOptions>,\n) => {\n return async (\n event: MessageEvent,\n message: ServiceWorkerMessage<\n 'REQUEST',\n ServiceWorkerIncomingEventsMap['REQUEST']\n >,\n ) => {\n const messageChannel = new WorkerChannel(event.ports[0])\n\n const requestId = message.payload.id\n const request = parseWorkerRequest(message.payload)\n const requestCloneForLogs = request.clone()\n\n try {\n await handleRequest(\n request,\n requestId,\n context.requestHandlers,\n options,\n context.emitter,\n {\n onPassthroughResponse() {\n messageChannel.postMessage('NOT_FOUND')\n },\n async onMockedResponse(response, { handler, parsedResult }) {\n // Clone the mocked response so its body could be read\n // to buffer to be sent to the worker and also in the\n // \".log()\" method of the request handler.\n const responseClone = response.clone()\n const responseCloneForLogs = response.clone()\n const responseInit = toResponseInit(response)\n\n /**\n * @note Safari doesn't support transferring a \"ReadableStream\".\n * Check that the browser supports that before sending it to the worker.\n */\n if (context.supports.readableStreamTransfer) {\n const responseStreamOrNull = response.body\n\n messageChannel.postMessage(\n 'MOCK_RESPONSE',\n {\n ...responseInit,\n body: responseStreamOrNull,\n },\n responseStreamOrNull ? [responseStreamOrNull] : undefined,\n )\n } else {\n /**\n * @note If we are here, this means the current environment doesn't\n * support \"ReadableStream\" as transferable. In that case,\n * attempt to read the non-empty response body as ArrayBuffer, if it's not empty.\n * @see https://github.com/mswjs/msw/issues/1827\n */\n const responseBufferOrNull =\n response.body === null\n ? null\n : await responseClone.arrayBuffer()\n\n messageChannel.postMessage('MOCK_RESPONSE', {\n ...responseInit,\n body: responseBufferOrNull,\n })\n }\n\n if (!options.quiet) {\n context.emitter.once('response:mocked', () => {\n handler.log({\n request: requestCloneForLogs,\n response: responseCloneForLogs,\n parsedResult,\n })\n })\n }\n },\n },\n )\n } catch (error) {\n if (error instanceof Error) {\n devUtils.error(\n `Uncaught exception in the request handler for \"%s %s\":\n\n%s\n\nThis exception has been gracefully handled as a 500 response, however, it's strongly recommended to resolve this error, as it indicates a mistake in your code. If you wish to mock an error response, please see this guide: https://mswjs.io/docs/recipes/mocking-error-responses`,\n request.method,\n request.url,\n error.stack ?? error,\n )\n\n // Treat all other exceptions in a request handler as unintended,\n // alerting that there is a problem that needs fixing.\n messageChannel.postMessage('MOCK_RESPONSE', {\n status: 500,\n statusText: 'Request Handler Error',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n name: error.name,\n message: error.message,\n stack: error.stack,\n }),\n })\n }\n }\n }\n}\n","import type { SetupWorkerInternalContext } from '../setupWorker/glossary'\n\nexport async function requestIntegrityCheck(\n context: SetupWorkerInternalContext,\n serviceWorker: ServiceWorker,\n): Promise<ServiceWorker> {\n // Signal Service Worker to report back its integrity\n context.workerChannel.send('INTEGRITY_CHECK_REQUEST')\n\n const { payload: actualChecksum } = await context.events.once(\n 'INTEGRITY_CHECK_RESPONSE',\n )\n\n // Compare the response from the Service Worker and the\n // global variable set during the build.\n if (actualChecksum !== SERVICE_WORKER_CHECKSUM) {\n throw new Error(\n `Currently active Service Worker (${actualChecksum}) is behind the latest published one (${SERVICE_WORKER_CHECKSUM}).`,\n )\n }\n\n return serviceWorker\n}\n","import { until } from '@open-draft/until'\n\n/**\n * Intercepts and defers any requests on the page\n * until the Service Worker instance is ready.\n * Must only be used in a browser.\n */\nexport function deferNetworkRequestsUntil(predicatePromise: Promise<any>) {\n // Defer any `XMLHttpRequest` requests until the Service Worker is ready.\n const originalXhrSend = window.XMLHttpRequest.prototype.send\n window.XMLHttpRequest.prototype.send = function (\n ...args: Parameters<XMLHttpRequest['send']>\n ) {\n // Keep this function synchronous to comply with `XMLHttpRequest.prototype.send`,\n // because that method is always synchronous.\n until(() => predicatePromise).then(() => {\n window.XMLHttpRequest.prototype.send = originalXhrSend\n this.send(...args)\n })\n }\n\n // Defer any `fetch` requests until the Service Worker is ready.\n const originalFetch = window.fetch\n window.fetch = async (...args) => {\n await until(() => predicatePromise)\n window.fetch = originalFetch\n return window.fetch(...args)\n }\n}\n","import {\n ServiceWorkerIncomingEventsMap,\n SetupWorkerInternalContext,\n} from '../glossary'\nimport { ServiceWorkerMessage } from './utils/createMessageChannel'\nimport { isResponseWithoutBody } from '@mswjs/interceptors'\n\nexport function createResponseListener(context: SetupWorkerInternalContext) {\n return (\n _: MessageEvent,\n message: ServiceWorkerMessage<\n 'RESPONSE',\n ServiceWorkerIncomingEventsMap['RESPONSE']\n >,\n ) => {\n const { payload: responseJson } = message\n\n /**\n * CORS requests with `mode: \"no-cors\"` result in \"opaque\" responses.\n * That kind of responses cannot be manipulated in JavaScript due\n * to the security considerations.\n * @see https://fetch.spec.whatwg.org/#concept-filtered-response-opaque\n * @see https://github.com/mswjs/msw/issues/529\n */\n if (responseJson.type?.includes('opaque')) {\n return\n }\n\n const response =\n responseJson.status === 0\n ? Response.error()\n : new Response(\n /**\n * Responses may be streams here, but when we create a response object\n * with null-body status codes, like 204, 205, 304 Response will\n * throw when passed a non-null body, so ensure it's null here\n * for those codes\n */\n isResponseWithoutBody(responseJson.status)\n ? null\n : responseJson.body,\n responseJson,\n )\n\n context.emitter.emit(\n responseJson.isMockedResponse ? 'response:mocked' : 'response:bypass',\n {\n response,\n /**\n * @todo @fixme In this context, we don't know anything about\n * the request.\n */\n request: null as any,\n requestId: responseJson.requestId,\n },\n )\n }\n}\n","import { devUtils } from '~/core/utils/internal/devUtils'\nimport { StartOptions } from '../../glossary'\n\nexport function validateWorkerScope(\n registration: ServiceWorkerRegistration,\n options?: StartOptions,\n): void {\n if (!options?.quiet && !location.href.startsWith(registration.scope)) {\n devUtils.warn(\n `\\\nCannot intercept requests on this page because it's outside of the worker's scope (\"${registration.scope}\"). If you wish to mock API requests on this page, you must resolve this scope issue.\n\n- (Recommended) Register the worker at the root level (\"/\") of your application.\n- Set the \"Service-Worker-Allowed\" response header to allow out-of-scope workers.\\\n`,\n )\n }\n}\n","import { devUtils } from '~/core/utils/internal/devUtils'\nimport { SetupWorkerInternalContext, StopHandler } from '../glossary'\nimport { printStopMessage } from './utils/printStopMessage'\n\nexport const createStop = (\n context: SetupWorkerInternalContext,\n): StopHandler => {\n return function stop() {\n // Warn developers calling \"worker.stop()\" more times than necessary.\n // This likely indicates a mistake in their code.\n if (!context.isMockingEnabled) {\n devUtils.warn(\n 'Found a redundant \"worker.stop()\" call. Note that stopping the worker while mocking already stopped has no effect. Consider removing this \"worker.stop()\" call.',\n )\n return\n }\n\n /**\n * Signal the Service Worker to disable mocking for this client.\n * Use this an an explicit way to stop the mocking, while preserving\n * the worker-client relation. Does not affect the worker's lifecycle.\n */\n context.workerChannel.send('MOCK_DEACTIVATE')\n context.isMockingEnabled = false\n window.clearInterval(context.keepAliveInterval)\n\n printStopMessage({ quiet: context.startOptions?.quiet })\n }\n}\n","import { devUtils } from '~/core/utils/internal/devUtils'\n\nexport function printStopMessage(args: { quiet?: boolean } = {}): void {\n if (args.quiet) {\n return\n }\n\n console.log(\n `%c${devUtils.formatMessage('Mocking disabled.')}`,\n 'color:orangered;font-weight:bold;',\n )\n}\n","import { RequiredDeep } from '~/core/typeUtils'\nimport { mergeRight } from '~/core/utils/internal/mergeRight'\nimport {\n SetupWorker,\n SetupWorkerInternalContext,\n StartHandler,\n StartOptions,\n} from '../../glossary'\n\nexport const DEFAULT_START_OPTIONS: RequiredDeep<StartOptions> = {\n serviceWorker: {\n url: '/mockServiceWorker.js',\n options: null as any,\n },\n quiet: false,\n waitUntilReady: true,\n onUnhandledRequest: 'warn',\n findWorker(scriptURL, mockServiceWorkerUrl) {\n return scriptURL === mockServiceWorkerUrl\n },\n}\n\n/**\n * Returns resolved worker start options, merging the default options\n * with the given custom options.\n */\nexport function resolveStartOptions(\n initialOptions?: StartOptions,\n): RequiredDeep<StartOptions> {\n return mergeRight(\n DEFAULT_START_OPTIONS,\n initialOptions || {},\n ) as RequiredDeep<StartOptions>\n}\n\nexport function prepareStartHandler(\n handler: StartHandler,\n context: SetupWorkerInternalContext,\n): SetupWorker['start'] {\n return (initialOptions) => {\n context.startOptions = resolveStartOptions(initialOptions)\n return handler(context.startOptions, initialOptions || {})\n }\n}\n","import {\n Interceptor,\n BatchInterceptor,\n HttpRequestEventMap,\n} from '@mswjs/interceptors'\nimport { FetchInterceptor } from '@mswjs/interceptors/fetch'\nimport { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest'\nimport { SetupWorkerInternalContext, StartOptions } from '../glossary'\nimport type { RequiredDeep } from '~/core/typeUtils'\nimport { handleRequest } from '~/core/utils/handleRequest'\n\nexport function createFallbackRequestListener(\n context: SetupWorkerInternalContext,\n options: RequiredDeep<StartOptions>,\n): Interceptor<HttpRequestEventMap> {\n const interceptor = new BatchInterceptor({\n name: 'fallback',\n interceptors: [new FetchInterceptor(), new XMLHttpRequestInterceptor()],\n })\n\n interceptor.on('request', async ({ request, requestId }) => {\n const requestCloneForLogs = request.clone()\n\n const response = await handleRequest(\n request,\n requestId,\n context.requestHandlers,\n options,\n context.emitter,\n {\n onMockedResponse(_, { handler, parsedResult }) {\n if (!options.quiet) {\n context.emitter.once('response:mocked', ({ response }) => {\n handler.log({\n request: requestCloneForLogs,\n response,\n parsedResult,\n })\n })\n }\n },\n },\n )\n\n if (response) {\n request.respondWith(response)\n }\n })\n\n interceptor.on(\n 'response',\n ({ response, isMockedResponse, request, requestId }) => {\n context.emitter.emit(\n isMockedResponse ? 'response:mocked' : 'response:bypass',\n {\n response,\n request,\n requestId,\n },\n )\n },\n )\n\n interceptor.apply()\n\n return interceptor\n}\n","import { createFallbackRequestListener } from './createFallbackRequestListener'\nimport { SetupWorkerInternalContext, StartHandler } from '../glossary'\nimport { printStartMessage } from './utils/printStartMessage'\n\nexport function createFallbackStart(\n context: SetupWorkerInternalContext,\n): StartHandler {\n return async function start(options) {\n context.fallbackInterceptor = createFallbackRequestListener(\n context,\n options,\n )\n\n printStartMessage({\n message: 'Mocking enabled (fallback mode).',\n quiet: options.quiet,\n })\n\n return undefined\n }\n}\n","import { SetupWorkerInternalContext, StopHandler } from '../glossary'\nimport { printStopMessage } from './utils/printStopMessage'\n\nexport function createFallbackStop(\n context: SetupWorkerInternalContext,\n): StopHandler {\n return function stop() {\n context.fallbackInterceptor?.dispose()\n printStopMessage({ quiet: context.startOptions?.quiet })\n }\n}\n","/**\n * Returns a boolean indicating whether the current browser\n * supports `ReadableStream` as a `Transferable` when posting\n * messages.\n */\nexport function supportsReadableStreamTransfer() {\n try {\n const stream = new ReadableStream({\n start: (controller) => controller.close(),\n })\n const message = new MessageChannel()\n message.port1.postMessage(stream, [stream])\n return true\n } catch (error) {\n return false\n }\n}\n"],"mappings":"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","names":["until","devUtils","worker","devUtils","devUtils","devUtils","devUtils","devUtils","until","until","devUtils","devUtils","until","devUtils","devUtils","devUtils","handleRequest","handleRequest","response","devUtils","mergeRight","devUtils","mergeRight"]}
@@ -1,5 +1,5 @@
1
1
  import { OperationTypeNode, DocumentNode, GraphQLError } from 'graphql';
2
- import { g as RequestHandlerDefaultInfo, D as DefaultBodyType, R as RequestHandler, a as ResponseResolver, c as RequestHandlerOptions } from './RequestHandler-50ddea0c.js';
2
+ import { g as RequestHandlerDefaultInfo, D as DefaultBodyType, R as RequestHandler, a as ResponseResolver, c as RequestHandlerOptions } from './RequestHandler-rBDJQrEf.js';
3
3
  import { Match, Path } from './utils/matching/matchRequestUrl.js';
4
4
 
5
5
  interface ParsedGraphQLQuery {
@@ -63,7 +63,14 @@ interface GraphQLResponseBody<BodyType extends DefaultBodyType> {
63
63
  declare function isDocumentNode(value: DocumentNode | any): value is DocumentNode;
64
64
  declare class GraphQLHandler extends RequestHandler<GraphQLHandlerInfo, GraphQLRequestParsedResult, GraphQLResolverExtras<any>> {
65
65
  private endpoint;
66
+ static parsedRequestCache: WeakMap<Request, ParsedGraphQLRequest<GraphQLVariables>>;
66
67
  constructor(operationType: ExpectedOperationTypeNode, operationName: GraphQLHandlerNameSelector, endpoint: Path, resolver: ResponseResolver<GraphQLResolverExtras<any>, any, any>, options?: RequestHandlerOptions);
68
+ /**
69
+ * Parses the request body, once per request, cached across all
70
+ * GraphQL handlers. This is done to avoid multiple parsing of the
71
+ * request body, which each requires a clone of the request.
72
+ */
73
+ parseGraphQLRequestOrGetFromCache(request: Request): Promise<ParsedGraphQLRequest<GraphQLVariables>>;
67
74
  parse(args: {
68
75
  request: Request;
69
76
  }): Promise<GraphQLRequestParsedResult>;
@@ -87,4 +94,4 @@ declare class GraphQLHandler extends RequestHandler<GraphQLHandlerInfo, GraphQLR
87
94
  }): Promise<void>;
88
95
  }
89
96
 
90
- export { ExpectedOperationTypeNode as E, GraphQLHandler as G, ParsedGraphQLRequest as P, GraphQLVariables as a, GraphQLRequestBody as b, GraphQLJsonRequestBody as c, GraphQLHandlerNameSelector as d, GraphQLResolverExtras as e, GraphQLResponseBody as f, ParsedGraphQLQuery as g, GraphQLParsedOperationsMap as h, GraphQLMultipartRequestBody as i, parseGraphQLRequest as j, GraphQLHandlerInfo as k, GraphQLRequestParsedResult as l, isDocumentNode as m, parseDocumentNode as p };
97
+ export { type ExpectedOperationTypeNode as E, GraphQLHandler as G, type ParsedGraphQLRequest as P, type GraphQLVariables as a, type GraphQLRequestBody as b, type GraphQLJsonRequestBody as c, type GraphQLHandlerNameSelector as d, type GraphQLResolverExtras as e, type GraphQLResponseBody as f, type ParsedGraphQLQuery as g, type GraphQLParsedOperationsMap as h, type GraphQLMultipartRequestBody as i, parseGraphQLRequest as j, type GraphQLHandlerInfo as k, type GraphQLRequestParsedResult as l, isDocumentNode as m, parseDocumentNode as p };
@@ -0,0 +1,97 @@
1
+ import { OperationTypeNode, DocumentNode, GraphQLError } from 'graphql';
2
+ import { g as RequestHandlerDefaultInfo, D as DefaultBodyType, R as RequestHandler, a as ResponseResolver, c as RequestHandlerOptions } from './RequestHandler-vxZdj6Tw.mjs';
3
+ import { Match, Path } from './utils/matching/matchRequestUrl.mjs';
4
+
5
+ interface ParsedGraphQLQuery {
6
+ operationType: OperationTypeNode;
7
+ operationName?: string;
8
+ }
9
+ type ParsedGraphQLRequest<VariablesType extends GraphQLVariables = GraphQLVariables> = (ParsedGraphQLQuery & {
10
+ query: string;
11
+ variables?: VariablesType;
12
+ }) | undefined;
13
+ declare function parseDocumentNode(node: DocumentNode): ParsedGraphQLQuery;
14
+ type GraphQLParsedOperationsMap = Record<string, string[]>;
15
+ type GraphQLMultipartRequestBody = {
16
+ operations: string;
17
+ map?: string;
18
+ } & {
19
+ [fileName: string]: File;
20
+ };
21
+ /**
22
+ * Determines if a given request can be considered a GraphQL request.
23
+ * Does not parse the query and does not guarantee its validity.
24
+ */
25
+ declare function parseGraphQLRequest(request: Request): Promise<ParsedGraphQLRequest>;
26
+
27
+ type ExpectedOperationTypeNode = OperationTypeNode | 'all';
28
+ type GraphQLHandlerNameSelector = DocumentNode | RegExp | string;
29
+ type GraphQLVariables = Record<string, any>;
30
+ interface GraphQLHandlerInfo extends RequestHandlerDefaultInfo {
31
+ operationType: ExpectedOperationTypeNode;
32
+ operationName: GraphQLHandlerNameSelector;
33
+ }
34
+ type GraphQLRequestParsedResult = {
35
+ match: Match;
36
+ } & (ParsedGraphQLRequest<GraphQLVariables>
37
+ /**
38
+ * An empty version of the ParsedGraphQLRequest
39
+ * which simplifies the return type of the resolver
40
+ * when the request is to a non-matching endpoint
41
+ */
42
+ | {
43
+ operationType?: undefined;
44
+ operationName?: undefined;
45
+ query?: undefined;
46
+ variables?: undefined;
47
+ });
48
+ type GraphQLResolverExtras<Variables extends GraphQLVariables> = {
49
+ query: string;
50
+ operationName: string;
51
+ variables: Variables;
52
+ cookies: Record<string, string>;
53
+ };
54
+ type GraphQLRequestBody<VariablesType extends GraphQLVariables> = GraphQLJsonRequestBody<VariablesType> | GraphQLMultipartRequestBody | Record<string, any> | undefined;
55
+ interface GraphQLJsonRequestBody<Variables extends GraphQLVariables> {
56
+ query: string;
57
+ variables?: Variables;
58
+ }
59
+ interface GraphQLResponseBody<BodyType extends DefaultBodyType> {
60
+ data?: BodyType | null;
61
+ errors?: readonly Partial<GraphQLError>[] | null;
62
+ }
63
+ declare function isDocumentNode(value: DocumentNode | any): value is DocumentNode;
64
+ declare class GraphQLHandler extends RequestHandler<GraphQLHandlerInfo, GraphQLRequestParsedResult, GraphQLResolverExtras<any>> {
65
+ private endpoint;
66
+ static parsedRequestCache: WeakMap<Request, ParsedGraphQLRequest<GraphQLVariables>>;
67
+ constructor(operationType: ExpectedOperationTypeNode, operationName: GraphQLHandlerNameSelector, endpoint: Path, resolver: ResponseResolver<GraphQLResolverExtras<any>, any, any>, options?: RequestHandlerOptions);
68
+ /**
69
+ * Parses the request body, once per request, cached across all
70
+ * GraphQL handlers. This is done to avoid multiple parsing of the
71
+ * request body, which each requires a clone of the request.
72
+ */
73
+ parseGraphQLRequestOrGetFromCache(request: Request): Promise<ParsedGraphQLRequest<GraphQLVariables>>;
74
+ parse(args: {
75
+ request: Request;
76
+ }): Promise<GraphQLRequestParsedResult>;
77
+ predicate(args: {
78
+ request: Request;
79
+ parsedResult: GraphQLRequestParsedResult;
80
+ }): boolean;
81
+ protected extendResolverArgs(args: {
82
+ request: Request;
83
+ parsedResult: GraphQLRequestParsedResult;
84
+ }): {
85
+ query: string;
86
+ operationName: string;
87
+ variables: GraphQLVariables;
88
+ cookies: Record<string, string>;
89
+ };
90
+ log(args: {
91
+ request: Request;
92
+ response: Response;
93
+ parsedResult: GraphQLRequestParsedResult;
94
+ }): Promise<void>;
95
+ }
96
+
97
+ export { type ExpectedOperationTypeNode as E, GraphQLHandler as G, type ParsedGraphQLRequest as P, type GraphQLVariables as a, type GraphQLRequestBody as b, type GraphQLJsonRequestBody as c, type GraphQLHandlerNameSelector as d, type GraphQLResolverExtras as e, type GraphQLResponseBody as f, type ParsedGraphQLQuery as g, type GraphQLParsedOperationsMap as h, type GraphQLMultipartRequestBody as i, parseGraphQLRequest as j, type GraphQLHandlerInfo as k, type GraphQLRequestParsedResult as l, isDocumentNode as m, parseDocumentNode as p };
@@ -0,0 +1,2 @@
1
+ export { f as HttpResponse, H as HttpResponseInit, S as StrictRequest, e as StrictResponse } from './RequestHandler-vxZdj6Tw.mjs';
2
+ import './typeUtils.mjs';
@@ -1,2 +1,2 @@
1
- export { f as HttpResponse, H as HttpResponseInit, S as StrictRequest, e as StrictResponse } from './RequestHandler-50ddea0c.js';
1
+ export { f as HttpResponse, H as HttpResponseInit, S as StrictRequest, e as StrictResponse } from './RequestHandler-rBDJQrEf.js';
2
2
  import './typeUtils.js';
@@ -98,3 +98,4 @@ class HttpResponse extends Response {
98
98
  return new HttpResponse(body, (0, import_decorators.normalizeResponseInit)(init));
99
99
  }
100
100
  }
101
+ //# sourceMappingURL=HttpResponse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/HttpResponse.ts"],"sourcesContent":["import type { DefaultBodyType, JsonBodyType } from './handlers/RequestHandler'\nimport {\n decorateResponse,\n normalizeResponseInit,\n} from './utils/HttpResponse/decorators'\n\nexport interface HttpResponseInit extends ResponseInit {\n type?: ResponseType\n}\n\ndeclare const bodyType: unique symbol\n\nexport interface StrictRequest<BodyType extends DefaultBodyType>\n extends Request {\n json(): Promise<BodyType>\n}\n\n/**\n * Opaque `Response` type that supports strict body type.\n */\nexport interface StrictResponse<BodyType extends DefaultBodyType>\n extends Response {\n readonly [bodyType]: BodyType\n}\n\n/**\n * A drop-in replacement for the standard `Response` class\n * to allow additional features, like mocking the response `Set-Cookie` header.\n *\n * @example\n * new HttpResponse('Hello world', { status: 201 })\n * HttpResponse.json({ name: 'John' })\n * HttpResponse.formData(form)\n *\n * @see {@link https://mswjs.io/docs/api/http-response `HttpResponse` API reference}\n */\nexport class HttpResponse extends Response {\n constructor(body?: BodyInit | null, init?: HttpResponseInit) {\n const responseInit = normalizeResponseInit(init)\n super(body, responseInit)\n decorateResponse(this, responseInit)\n }\n\n /**\n * Create a `Response` with a `Content-Type: \"text/plain\"` body.\n * @example\n * HttpResponse.text('hello world')\n * HttpResponse.text('Error', { status: 500 })\n */\n static text<BodyType extends string>(\n body?: BodyType | null,\n init?: HttpResponseInit,\n ): StrictResponse<BodyType> {\n const responseInit = normalizeResponseInit(init)\n\n if (!responseInit.headers.has('Content-Type')) {\n responseInit.headers.set('Content-Type', 'text/plain')\n }\n\n return new HttpResponse(body, responseInit) as StrictResponse<BodyType>\n }\n\n /**\n * Create a `Response` with a `Content-Type: \"application/json\"` body.\n * @example\n * HttpResponse.json({ firstName: 'John' })\n * HttpResponse.json({ error: 'Not Authorized' }, { status: 401 })\n */\n static json<BodyType extends JsonBodyType>(\n body?: BodyType | null,\n init?: HttpResponseInit,\n ): StrictResponse<BodyType> {\n const responseInit = normalizeResponseInit(init)\n\n if (!responseInit.headers.has('Content-Type')) {\n responseInit.headers.set('Content-Type', 'application/json')\n }\n\n return new HttpResponse(\n JSON.stringify(body),\n responseInit,\n ) as StrictResponse<BodyType>\n }\n\n /**\n * Create a `Response` with a `Content-Type: \"application/xml\"` body.\n * @example\n * HttpResponse.xml(`<user name=\"John\" />`)\n * HttpResponse.xml(`<article id=\"abc-123\" />`, { status: 201 })\n */\n static xml<BodyType extends string>(\n body?: BodyType | null,\n init?: HttpResponseInit,\n ): Response {\n const responseInit = normalizeResponseInit(init)\n\n if (!responseInit.headers.has('Content-Type')) {\n responseInit.headers.set('Content-Type', 'text/xml')\n }\n\n return new HttpResponse(body, responseInit)\n }\n\n /**\n * Create a `Response` with an `ArrayBuffer` body.\n * @example\n * const buffer = new ArrayBuffer(3)\n * const view = new Uint8Array(buffer)\n * view.set([1, 2, 3])\n *\n * HttpResponse.arrayBuffer(buffer)\n */\n static arrayBuffer(body?: ArrayBuffer, init?: HttpResponseInit): Response {\n const responseInit = normalizeResponseInit(init)\n\n if (body) {\n responseInit.headers.set('Content-Length', body.byteLength.toString())\n }\n\n return new HttpResponse(body, responseInit)\n }\n\n /**\n * Create a `Response` with a `FormData` body.\n * @example\n * const data = new FormData()\n * data.set('name', 'Alice')\n *\n * HttpResponse.formData(data)\n */\n static formData(body?: FormData, init?: HttpResponseInit): Response {\n return new HttpResponse(body, normalizeResponseInit(init))\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,wBAGO;AAgCA,MAAM,qBAAqB,SAAS;AAAA,EACzC,YAAY,MAAwB,MAAyB;AAC3D,UAAM,mBAAe,yCAAsB,IAAI;AAC/C,UAAM,MAAM,YAAY;AACxB,4CAAiB,MAAM,YAAY;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,KACL,MACA,MAC0B;AAC1B,UAAM,mBAAe,yCAAsB,IAAI;AAE/C,QAAI,CAAC,aAAa,QAAQ,IAAI,cAAc,GAAG;AAC7C,mBAAa,QAAQ,IAAI,gBAAgB,YAAY;AAAA,IACvD;AAEA,WAAO,IAAI,aAAa,MAAM,YAAY;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,KACL,MACA,MAC0B;AAC1B,UAAM,mBAAe,yCAAsB,IAAI;AAE/C,QAAI,CAAC,aAAa,QAAQ,IAAI,cAAc,GAAG;AAC7C,mBAAa,QAAQ,IAAI,gBAAgB,kBAAkB;AAAA,IAC7D;AAEA,WAAO,IAAI;AAAA,MACT,KAAK,UAAU,IAAI;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,IACL,MACA,MACU;AACV,UAAM,mBAAe,yCAAsB,IAAI;AAE/C,QAAI,CAAC,aAAa,QAAQ,IAAI,cAAc,GAAG;AAC7C,mBAAa,QAAQ,IAAI,gBAAgB,UAAU;AAAA,IACrD;AAEA,WAAO,IAAI,aAAa,MAAM,YAAY;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,YAAY,MAAoB,MAAmC;AACxE,UAAM,mBAAe,yCAAsB,IAAI;AAE/C,QAAI,MAAM;AACR,mBAAa,QAAQ,IAAI,kBAAkB,KAAK,WAAW,SAAS,CAAC;AAAA,IACvE;AAEA,WAAO,IAAI,aAAa,MAAM,YAAY;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,SAAS,MAAiB,MAAmC;AAClE,WAAO,IAAI,aAAa,UAAM,yCAAsB,IAAI,CAAC;AAAA,EAC3D;AACF;","names":[]}
@@ -81,3 +81,4 @@ class HttpResponse extends Response {
81
81
  export {
82
82
  HttpResponse
83
83
  };
84
+ //# sourceMappingURL=HttpResponse.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/HttpResponse.ts"],"sourcesContent":["import type { DefaultBodyType, JsonBodyType } from './handlers/RequestHandler'\nimport {\n decorateResponse,\n normalizeResponseInit,\n} from './utils/HttpResponse/decorators'\n\nexport interface HttpResponseInit extends ResponseInit {\n type?: ResponseType\n}\n\ndeclare const bodyType: unique symbol\n\nexport interface StrictRequest<BodyType extends DefaultBodyType>\n extends Request {\n json(): Promise<BodyType>\n}\n\n/**\n * Opaque `Response` type that supports strict body type.\n */\nexport interface StrictResponse<BodyType extends DefaultBodyType>\n extends Response {\n readonly [bodyType]: BodyType\n}\n\n/**\n * A drop-in replacement for the standard `Response` class\n * to allow additional features, like mocking the response `Set-Cookie` header.\n *\n * @example\n * new HttpResponse('Hello world', { status: 201 })\n * HttpResponse.json({ name: 'John' })\n * HttpResponse.formData(form)\n *\n * @see {@link https://mswjs.io/docs/api/http-response `HttpResponse` API reference}\n */\nexport class HttpResponse extends Response {\n constructor(body?: BodyInit | null, init?: HttpResponseInit) {\n const responseInit = normalizeResponseInit(init)\n super(body, responseInit)\n decorateResponse(this, responseInit)\n }\n\n /**\n * Create a `Response` with a `Content-Type: \"text/plain\"` body.\n * @example\n * HttpResponse.text('hello world')\n * HttpResponse.text('Error', { status: 500 })\n */\n static text<BodyType extends string>(\n body?: BodyType | null,\n init?: HttpResponseInit,\n ): StrictResponse<BodyType> {\n const responseInit = normalizeResponseInit(init)\n\n if (!responseInit.headers.has('Content-Type')) {\n responseInit.headers.set('Content-Type', 'text/plain')\n }\n\n return new HttpResponse(body, responseInit) as StrictResponse<BodyType>\n }\n\n /**\n * Create a `Response` with a `Content-Type: \"application/json\"` body.\n * @example\n * HttpResponse.json({ firstName: 'John' })\n * HttpResponse.json({ error: 'Not Authorized' }, { status: 401 })\n */\n static json<BodyType extends JsonBodyType>(\n body?: BodyType | null,\n init?: HttpResponseInit,\n ): StrictResponse<BodyType> {\n const responseInit = normalizeResponseInit(init)\n\n if (!responseInit.headers.has('Content-Type')) {\n responseInit.headers.set('Content-Type', 'application/json')\n }\n\n return new HttpResponse(\n JSON.stringify(body),\n responseInit,\n ) as StrictResponse<BodyType>\n }\n\n /**\n * Create a `Response` with a `Content-Type: \"application/xml\"` body.\n * @example\n * HttpResponse.xml(`<user name=\"John\" />`)\n * HttpResponse.xml(`<article id=\"abc-123\" />`, { status: 201 })\n */\n static xml<BodyType extends string>(\n body?: BodyType | null,\n init?: HttpResponseInit,\n ): Response {\n const responseInit = normalizeResponseInit(init)\n\n if (!responseInit.headers.has('Content-Type')) {\n responseInit.headers.set('Content-Type', 'text/xml')\n }\n\n return new HttpResponse(body, responseInit)\n }\n\n /**\n * Create a `Response` with an `ArrayBuffer` body.\n * @example\n * const buffer = new ArrayBuffer(3)\n * const view = new Uint8Array(buffer)\n * view.set([1, 2, 3])\n *\n * HttpResponse.arrayBuffer(buffer)\n */\n static arrayBuffer(body?: ArrayBuffer, init?: HttpResponseInit): Response {\n const responseInit = normalizeResponseInit(init)\n\n if (body) {\n responseInit.headers.set('Content-Length', body.byteLength.toString())\n }\n\n return new HttpResponse(body, responseInit)\n }\n\n /**\n * Create a `Response` with a `FormData` body.\n * @example\n * const data = new FormData()\n * data.set('name', 'Alice')\n *\n * HttpResponse.formData(data)\n */\n static formData(body?: FormData, init?: HttpResponseInit): Response {\n return new HttpResponse(body, normalizeResponseInit(init))\n }\n}\n"],"mappings":"AACA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAgCA,MAAM,qBAAqB,SAAS;AAAA,EACzC,YAAY,MAAwB,MAAyB;AAC3D,UAAM,eAAe,sBAAsB,IAAI;AAC/C,UAAM,MAAM,YAAY;AACxB,qBAAiB,MAAM,YAAY;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,KACL,MACA,MAC0B;AAC1B,UAAM,eAAe,sBAAsB,IAAI;AAE/C,QAAI,CAAC,aAAa,QAAQ,IAAI,cAAc,GAAG;AAC7C,mBAAa,QAAQ,IAAI,gBAAgB,YAAY;AAAA,IACvD;AAEA,WAAO,IAAI,aAAa,MAAM,YAAY;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,KACL,MACA,MAC0B;AAC1B,UAAM,eAAe,sBAAsB,IAAI;AAE/C,QAAI,CAAC,aAAa,QAAQ,IAAI,cAAc,GAAG;AAC7C,mBAAa,QAAQ,IAAI,gBAAgB,kBAAkB;AAAA,IAC7D;AAEA,WAAO,IAAI;AAAA,MACT,KAAK,UAAU,IAAI;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,IACL,MACA,MACU;AACV,UAAM,eAAe,sBAAsB,IAAI;AAE/C,QAAI,CAAC,aAAa,QAAQ,IAAI,cAAc,GAAG;AAC7C,mBAAa,QAAQ,IAAI,gBAAgB,UAAU;AAAA,IACrD;AAEA,WAAO,IAAI,aAAa,MAAM,YAAY;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,YAAY,MAAoB,MAAmC;AACxE,UAAM,eAAe,sBAAsB,IAAI;AAE/C,QAAI,MAAM;AACR,mBAAa,QAAQ,IAAI,kBAAkB,KAAK,WAAW,SAAS,CAAC;AAAA,IACvE;AAEA,WAAO,IAAI,aAAa,MAAM,YAAY;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,SAAS,MAAiB,MAAmC;AAClE,WAAO,IAAI,aAAa,MAAM,sBAAsB,IAAI,CAAC;AAAA,EAC3D;AACF;","names":[]}
@@ -112,6 +112,7 @@ interface RequestHandlerExecutionResult<ParsedResult extends Record<string, unkn
112
112
  response?: Response;
113
113
  }
114
114
  declare abstract class RequestHandler<HandlerInfo extends RequestHandlerDefaultInfo = RequestHandlerDefaultInfo, ParsedResult extends Record<string, any> | undefined = any, ResolverExtras extends Record<string, unknown> = any, HandlerOptions extends RequestHandlerOptions = RequestHandlerOptions> {
115
+ static cache: WeakMap<StrictRequest<DefaultBodyType>, StrictRequest<DefaultBodyType>>;
115
116
  info: HandlerInfo & RequestHandlerInternalInfo;
116
117
  /**
117
118
  * Indicates whether this request handler has been used
@@ -162,6 +163,7 @@ declare abstract class RequestHandler<HandlerInfo extends RequestHandlerDefaultI
162
163
  request: Request;
163
164
  parsedResult: ParsedResult;
164
165
  }): ResolverExtras;
166
+ private cloneRequestOrGetFromCache;
165
167
  /**
166
168
  * Execute this request handler and produce a mocked response
167
169
  * using the given resolver function.
@@ -174,4 +176,4 @@ declare abstract class RequestHandler<HandlerInfo extends RequestHandlerDefaultI
174
176
  private createExecutionResult;
175
177
  }
176
178
 
177
- export { AsyncResponseResolverReturnType as A, DefaultBodyType as D, HttpResponseInit as H, JsonBodyType as J, MaybeAsyncResponseResolverReturnType as M, RequestHandler as R, StrictRequest as S, ResponseResolver as a, ResponseResolverReturnType as b, RequestHandlerOptions as c, DefaultRequestMultipartBody as d, StrictResponse as e, HttpResponse as f, RequestHandlerDefaultInfo as g, ResponseLookupResult as h, ResponseResolutionContext as i, getResponse as j, RequestHandlerInternalInfo as k, ResponseResolverInfo as l, RequestHandlerArgs as m, RequestHandlerExecutionResult as n };
179
+ export { type AsyncResponseResolverReturnType as A, type DefaultBodyType as D, type HttpResponseInit as H, type JsonBodyType as J, type MaybeAsyncResponseResolverReturnType as M, RequestHandler as R, type StrictRequest as S, type ResponseResolver as a, type ResponseResolverReturnType as b, type RequestHandlerOptions as c, type DefaultRequestMultipartBody as d, type StrictResponse as e, HttpResponse as f, type RequestHandlerDefaultInfo as g, type ResponseLookupResult as h, type ResponseResolutionContext as i, getResponse as j, type RequestHandlerInternalInfo as k, type ResponseResolverInfo as l, type RequestHandlerArgs as m, type RequestHandlerExecutionResult as n };