msw 2.0.12 → 2.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (404) hide show
  1. package/lib/browser/index.d.mts +104 -0
  2. package/lib/browser/index.d.ts +1 -1
  3. package/lib/browser/index.js +1 -0
  4. package/lib/browser/index.js.map +1 -0
  5. package/lib/browser/index.mjs +1 -0
  6. package/lib/browser/index.mjs.map +1 -0
  7. package/lib/core/{GraphQLHandler-da09c680.d.ts → GraphQLHandler-SHlRCcy4.d.ts} +2 -2
  8. package/lib/core/GraphQLHandler-zlmUDnN6.d.mts +97 -0
  9. package/lib/core/HttpResponse.d.mts +2 -0
  10. package/lib/core/HttpResponse.d.ts +1 -1
  11. package/lib/core/HttpResponse.js +1 -0
  12. package/lib/core/HttpResponse.js.map +1 -0
  13. package/lib/core/HttpResponse.mjs +1 -0
  14. package/lib/core/HttpResponse.mjs.map +1 -0
  15. package/lib/core/{RequestHandler-25f9cfd1.d.ts → RequestHandler-rBDJQrEf.d.ts} +1 -1
  16. package/lib/core/RequestHandler-vxZdj6Tw.d.mts +179 -0
  17. package/lib/core/SetupApi.d.mts +26 -0
  18. package/lib/core/SetupApi.d.ts +1 -1
  19. package/lib/core/SetupApi.js +1 -0
  20. package/lib/core/SetupApi.js.map +1 -0
  21. package/lib/core/SetupApi.mjs +1 -0
  22. package/lib/core/SetupApi.mjs.map +1 -0
  23. package/lib/core/bypass.d.mts +16 -0
  24. package/lib/core/bypass.d.ts +1 -1
  25. package/lib/core/bypass.js +1 -0
  26. package/lib/core/bypass.js.map +1 -0
  27. package/lib/core/bypass.mjs +1 -0
  28. package/lib/core/bypass.mjs.map +1 -0
  29. package/lib/core/delay.d.mts +18 -0
  30. package/lib/core/delay.d.ts +1 -1
  31. package/lib/core/delay.js +1 -0
  32. package/lib/core/delay.js.map +1 -0
  33. package/lib/core/delay.mjs +1 -0
  34. package/lib/core/delay.mjs.map +1 -0
  35. package/lib/core/graphql.d.mts +109 -0
  36. package/lib/core/graphql.d.ts +3 -3
  37. package/lib/core/graphql.js +1 -0
  38. package/lib/core/graphql.js.map +1 -0
  39. package/lib/core/graphql.mjs +1 -0
  40. package/lib/core/graphql.mjs.map +1 -0
  41. package/lib/core/handlers/GraphQLHandler.d.mts +5 -0
  42. package/lib/core/handlers/GraphQLHandler.d.ts +2 -2
  43. package/lib/core/handlers/GraphQLHandler.js +3 -2
  44. package/lib/core/handlers/GraphQLHandler.js.map +1 -0
  45. package/lib/core/handlers/GraphQLHandler.mjs +3 -2
  46. package/lib/core/handlers/GraphQLHandler.mjs.map +1 -0
  47. package/lib/core/handlers/HttpHandler.d.mts +62 -0
  48. package/lib/core/handlers/HttpHandler.d.ts +2 -2
  49. package/lib/core/handlers/HttpHandler.js +1 -0
  50. package/lib/core/handlers/HttpHandler.js.map +1 -0
  51. package/lib/core/handlers/HttpHandler.mjs +1 -0
  52. package/lib/core/handlers/HttpHandler.mjs.map +1 -0
  53. package/lib/core/handlers/RequestHandler.d.mts +2 -0
  54. package/lib/core/handlers/RequestHandler.d.ts +1 -1
  55. package/lib/core/handlers/RequestHandler.js +3 -2
  56. package/lib/core/handlers/RequestHandler.js.map +1 -0
  57. package/lib/core/handlers/RequestHandler.mjs +3 -2
  58. package/lib/core/handlers/RequestHandler.mjs.map +1 -0
  59. package/lib/core/http.d.mts +26 -0
  60. package/lib/core/http.d.ts +1 -1
  61. package/lib/core/http.js +1 -0
  62. package/lib/core/http.js.map +1 -0
  63. package/lib/core/http.mjs +1 -0
  64. package/lib/core/http.mjs.map +1 -0
  65. package/lib/core/index.d.mts +18 -0
  66. package/lib/core/index.d.ts +2 -2
  67. package/lib/core/index.js +1 -0
  68. package/lib/core/index.js.map +1 -0
  69. package/lib/core/index.mjs +1 -0
  70. package/lib/core/index.mjs.map +1 -0
  71. package/lib/core/passthrough.d.mts +17 -0
  72. package/lib/core/passthrough.js +1 -0
  73. package/lib/core/passthrough.js.map +1 -0
  74. package/lib/core/passthrough.mjs +1 -0
  75. package/lib/core/passthrough.mjs.map +1 -0
  76. package/lib/core/sharedOptions.d.mts +66 -0
  77. package/lib/core/sharedOptions.d.ts +2 -2
  78. package/lib/core/sharedOptions.js +1 -0
  79. package/lib/core/sharedOptions.js.map +1 -0
  80. package/lib/core/sharedOptions.mjs +1 -0
  81. package/lib/core/sharedOptions.mjs.map +1 -0
  82. package/lib/core/typeUtils.d.mts +7 -0
  83. package/lib/core/typeUtils.d.ts +1 -1
  84. package/lib/core/typeUtils.js +1 -0
  85. package/lib/core/typeUtils.js.map +1 -0
  86. package/lib/core/typeUtils.mjs +1 -0
  87. package/lib/core/typeUtils.mjs.map +1 -0
  88. package/lib/core/utils/HttpResponse/decorators.d.mts +12 -0
  89. package/lib/core/utils/HttpResponse/decorators.d.ts +2 -2
  90. package/lib/core/utils/HttpResponse/decorators.js +1 -0
  91. package/lib/core/utils/HttpResponse/decorators.js.map +1 -0
  92. package/lib/core/utils/HttpResponse/decorators.mjs +1 -0
  93. package/lib/core/utils/HttpResponse/decorators.mjs.map +1 -0
  94. package/lib/core/utils/getResponse.d.mts +2 -0
  95. package/lib/core/utils/getResponse.d.ts +1 -1
  96. package/lib/core/utils/getResponse.js +1 -0
  97. package/lib/core/utils/getResponse.js.map +1 -0
  98. package/lib/core/utils/getResponse.mjs +1 -0
  99. package/lib/core/utils/getResponse.mjs.map +1 -0
  100. package/lib/core/utils/handleRequest.d.mts +37 -0
  101. package/lib/core/utils/handleRequest.d.ts +2 -2
  102. package/lib/core/utils/handleRequest.js +1 -0
  103. package/lib/core/utils/handleRequest.js.map +1 -0
  104. package/lib/core/utils/handleRequest.mjs +1 -0
  105. package/lib/core/utils/handleRequest.mjs.map +1 -0
  106. package/lib/core/utils/internal/Disposable.d.mts +7 -0
  107. package/lib/core/utils/internal/Disposable.d.ts +1 -1
  108. package/lib/core/utils/internal/Disposable.js +1 -0
  109. package/lib/core/utils/internal/Disposable.js.map +1 -0
  110. package/lib/core/utils/internal/Disposable.mjs +1 -0
  111. package/lib/core/utils/internal/Disposable.mjs.map +1 -0
  112. package/lib/core/utils/internal/checkGlobals.d.mts +3 -0
  113. package/lib/core/utils/internal/checkGlobals.js +1 -0
  114. package/lib/core/utils/internal/checkGlobals.js.map +1 -0
  115. package/lib/core/utils/internal/checkGlobals.mjs +1 -0
  116. package/lib/core/utils/internal/checkGlobals.mjs.map +1 -0
  117. package/lib/core/utils/internal/devUtils.d.mts +19 -0
  118. package/lib/core/utils/internal/devUtils.js +1 -0
  119. package/lib/core/utils/internal/devUtils.js.map +1 -0
  120. package/lib/core/utils/internal/devUtils.mjs +1 -0
  121. package/lib/core/utils/internal/devUtils.mjs.map +1 -0
  122. package/lib/core/utils/internal/getCallFrame.d.mts +6 -0
  123. package/lib/core/utils/internal/getCallFrame.js +1 -0
  124. package/lib/core/utils/internal/getCallFrame.js.map +1 -0
  125. package/lib/core/utils/internal/getCallFrame.mjs +1 -0
  126. package/lib/core/utils/internal/getCallFrame.mjs.map +1 -0
  127. package/lib/core/utils/internal/isIterable.d.mts +6 -0
  128. package/lib/core/utils/internal/isIterable.js +1 -0
  129. package/lib/core/utils/internal/isIterable.js.map +1 -0
  130. package/lib/core/utils/internal/isIterable.mjs +1 -0
  131. package/lib/core/utils/internal/isIterable.mjs.map +1 -0
  132. package/lib/core/utils/internal/isObject.d.mts +6 -0
  133. package/lib/core/utils/internal/isObject.js +1 -0
  134. package/lib/core/utils/internal/isObject.js.map +1 -0
  135. package/lib/core/utils/internal/isObject.mjs +1 -0
  136. package/lib/core/utils/internal/isObject.mjs.map +1 -0
  137. package/lib/core/utils/internal/isStringEqual.d.mts +6 -0
  138. package/lib/core/utils/internal/isStringEqual.js +1 -0
  139. package/lib/core/utils/internal/isStringEqual.js.map +1 -0
  140. package/lib/core/utils/internal/isStringEqual.mjs +1 -0
  141. package/lib/core/utils/internal/isStringEqual.mjs.map +1 -0
  142. package/lib/core/utils/internal/jsonParse.d.mts +7 -0
  143. package/lib/core/utils/internal/jsonParse.js +1 -0
  144. package/lib/core/utils/internal/jsonParse.js.map +1 -0
  145. package/lib/core/utils/internal/jsonParse.mjs +1 -0
  146. package/lib/core/utils/internal/jsonParse.mjs.map +1 -0
  147. package/lib/core/utils/internal/mergeRight.d.mts +7 -0
  148. package/lib/core/utils/internal/mergeRight.js +1 -0
  149. package/lib/core/utils/internal/mergeRight.js.map +1 -0
  150. package/lib/core/utils/internal/mergeRight.mjs +1 -0
  151. package/lib/core/utils/internal/mergeRight.mjs.map +1 -0
  152. package/lib/core/utils/internal/parseGraphQLRequest.d.mts +5 -0
  153. package/lib/core/utils/internal/parseGraphQLRequest.d.ts +2 -2
  154. package/lib/core/utils/internal/parseGraphQLRequest.js +1 -0
  155. package/lib/core/utils/internal/parseGraphQLRequest.js.map +1 -0
  156. package/lib/core/utils/internal/parseGraphQLRequest.mjs +1 -0
  157. package/lib/core/utils/internal/parseGraphQLRequest.mjs.map +1 -0
  158. package/lib/core/utils/internal/parseMultipartData.d.mts +10 -0
  159. package/lib/core/utils/internal/parseMultipartData.d.ts +1 -1
  160. package/lib/core/utils/internal/parseMultipartData.js +1 -0
  161. package/lib/core/utils/internal/parseMultipartData.js.map +1 -0
  162. package/lib/core/utils/internal/parseMultipartData.mjs +1 -0
  163. package/lib/core/utils/internal/parseMultipartData.mjs.map +1 -0
  164. package/lib/core/utils/internal/pipeEvents.d.mts +8 -0
  165. package/lib/core/utils/internal/pipeEvents.js +1 -0
  166. package/lib/core/utils/internal/pipeEvents.js.map +1 -0
  167. package/lib/core/utils/internal/pipeEvents.mjs +1 -0
  168. package/lib/core/utils/internal/pipeEvents.mjs.map +1 -0
  169. package/lib/core/utils/internal/requestHandlerUtils.d.mts +8 -0
  170. package/lib/core/utils/internal/requestHandlerUtils.d.ts +1 -1
  171. package/lib/core/utils/internal/requestHandlerUtils.js +1 -0
  172. package/lib/core/utils/internal/requestHandlerUtils.js.map +1 -0
  173. package/lib/core/utils/internal/requestHandlerUtils.mjs +1 -0
  174. package/lib/core/utils/internal/requestHandlerUtils.mjs.map +1 -0
  175. package/lib/core/utils/internal/toReadonlyArray.d.mts +6 -0
  176. package/lib/core/utils/internal/toReadonlyArray.js +1 -0
  177. package/lib/core/utils/internal/toReadonlyArray.js.map +1 -0
  178. package/lib/core/utils/internal/toReadonlyArray.mjs +1 -0
  179. package/lib/core/utils/internal/toReadonlyArray.mjs.map +1 -0
  180. package/lib/core/utils/internal/tryCatch.d.mts +3 -0
  181. package/lib/core/utils/internal/tryCatch.js +1 -0
  182. package/lib/core/utils/internal/tryCatch.js.map +1 -0
  183. package/lib/core/utils/internal/tryCatch.mjs +1 -0
  184. package/lib/core/utils/internal/tryCatch.mjs.map +1 -0
  185. package/lib/core/utils/internal/uuidv4.d.mts +3 -0
  186. package/lib/core/utils/internal/uuidv4.js +1 -0
  187. package/lib/core/utils/internal/uuidv4.js.map +1 -0
  188. package/lib/core/utils/internal/uuidv4.mjs +1 -0
  189. package/lib/core/utils/internal/uuidv4.mjs.map +1 -0
  190. package/lib/core/utils/logging/getStatusCodeColor.d.mts +11 -0
  191. package/lib/core/utils/logging/getStatusCodeColor.js +1 -0
  192. package/lib/core/utils/logging/getStatusCodeColor.js.map +1 -0
  193. package/lib/core/utils/logging/getStatusCodeColor.mjs +1 -0
  194. package/lib/core/utils/logging/getStatusCodeColor.mjs.map +1 -0
  195. package/lib/core/utils/logging/getTimestamp.d.mts +6 -0
  196. package/lib/core/utils/logging/getTimestamp.js +1 -0
  197. package/lib/core/utils/logging/getTimestamp.js.map +1 -0
  198. package/lib/core/utils/logging/getTimestamp.mjs +1 -0
  199. package/lib/core/utils/logging/getTimestamp.mjs.map +1 -0
  200. package/lib/core/utils/logging/serializeRequest.d.mts +12 -0
  201. package/lib/core/utils/logging/serializeRequest.d.ts +1 -1
  202. package/lib/core/utils/logging/serializeRequest.js +1 -0
  203. package/lib/core/utils/logging/serializeRequest.js.map +1 -0
  204. package/lib/core/utils/logging/serializeRequest.mjs +1 -0
  205. package/lib/core/utils/logging/serializeRequest.mjs.map +1 -0
  206. package/lib/core/utils/logging/serializeResponse.d.mts +9 -0
  207. package/lib/core/utils/logging/serializeResponse.d.ts +1 -1
  208. package/lib/core/utils/logging/serializeResponse.js +1 -0
  209. package/lib/core/utils/logging/serializeResponse.js.map +1 -0
  210. package/lib/core/utils/logging/serializeResponse.mjs +1 -0
  211. package/lib/core/utils/logging/serializeResponse.mjs.map +1 -0
  212. package/lib/core/utils/matching/matchRequestUrl.d.mts +19 -0
  213. package/lib/core/utils/matching/matchRequestUrl.d.ts +1 -1
  214. package/lib/core/utils/matching/matchRequestUrl.js +1 -0
  215. package/lib/core/utils/matching/matchRequestUrl.js.map +1 -0
  216. package/lib/core/utils/matching/matchRequestUrl.mjs +1 -0
  217. package/lib/core/utils/matching/matchRequestUrl.mjs.map +1 -0
  218. package/lib/core/utils/matching/normalizePath.d.mts +12 -0
  219. package/lib/core/utils/matching/normalizePath.js +1 -0
  220. package/lib/core/utils/matching/normalizePath.js.map +1 -0
  221. package/lib/core/utils/matching/normalizePath.mjs +1 -0
  222. package/lib/core/utils/matching/normalizePath.mjs.map +1 -0
  223. package/lib/core/utils/request/getPublicUrlFromRequest.d.mts +7 -0
  224. package/lib/core/utils/request/getPublicUrlFromRequest.js +1 -0
  225. package/lib/core/utils/request/getPublicUrlFromRequest.js.map +1 -0
  226. package/lib/core/utils/request/getPublicUrlFromRequest.mjs +1 -0
  227. package/lib/core/utils/request/getPublicUrlFromRequest.mjs.map +1 -0
  228. package/lib/core/utils/request/getRequestCookies.d.mts +8 -0
  229. package/lib/core/utils/request/getRequestCookies.js +1 -0
  230. package/lib/core/utils/request/getRequestCookies.js.map +1 -0
  231. package/lib/core/utils/request/getRequestCookies.mjs +1 -0
  232. package/lib/core/utils/request/getRequestCookies.mjs.map +1 -0
  233. package/lib/core/utils/request/onUnhandledRequest.d.mts +12 -0
  234. package/lib/core/utils/request/onUnhandledRequest.d.ts +2 -2
  235. package/lib/core/utils/request/onUnhandledRequest.js +1 -0
  236. package/lib/core/utils/request/onUnhandledRequest.js.map +1 -0
  237. package/lib/core/utils/request/onUnhandledRequest.mjs +1 -0
  238. package/lib/core/utils/request/onUnhandledRequest.mjs.map +1 -0
  239. package/lib/core/utils/request/readResponseCookies.d.mts +3 -0
  240. package/lib/core/utils/request/readResponseCookies.js +1 -0
  241. package/lib/core/utils/request/readResponseCookies.js.map +1 -0
  242. package/lib/core/utils/request/readResponseCookies.mjs +1 -0
  243. package/lib/core/utils/request/readResponseCookies.mjs.map +1 -0
  244. package/lib/core/utils/toResponseInit.d.mts +3 -0
  245. package/lib/core/utils/toResponseInit.js +1 -0
  246. package/lib/core/utils/toResponseInit.js.map +1 -0
  247. package/lib/core/utils/toResponseInit.mjs +1 -0
  248. package/lib/core/utils/toResponseInit.mjs.map +1 -0
  249. package/lib/core/utils/url/cleanUrl.d.mts +7 -0
  250. package/lib/core/utils/url/cleanUrl.js +1 -0
  251. package/lib/core/utils/url/cleanUrl.js.map +1 -0
  252. package/lib/core/utils/url/cleanUrl.mjs +1 -0
  253. package/lib/core/utils/url/cleanUrl.mjs.map +1 -0
  254. package/lib/core/utils/url/getAbsoluteUrl.d.mts +6 -0
  255. package/lib/core/utils/url/getAbsoluteUrl.js +1 -0
  256. package/lib/core/utils/url/getAbsoluteUrl.js.map +1 -0
  257. package/lib/core/utils/url/getAbsoluteUrl.mjs +1 -0
  258. package/lib/core/utils/url/getAbsoluteUrl.mjs.map +1 -0
  259. package/lib/core/utils/url/isAbsoluteUrl.d.mts +6 -0
  260. package/lib/core/utils/url/isAbsoluteUrl.js +1 -0
  261. package/lib/core/utils/url/isAbsoluteUrl.js.map +1 -0
  262. package/lib/core/utils/url/isAbsoluteUrl.mjs +1 -0
  263. package/lib/core/utils/url/isAbsoluteUrl.mjs.map +1 -0
  264. package/lib/iife/index.js +20 -19
  265. package/lib/iife/index.js.map +1 -0
  266. package/lib/mockServiceWorker.js +1 -1
  267. package/lib/native/index.d.mts +75 -0
  268. package/lib/native/index.js +1 -0
  269. package/lib/native/index.js.map +1 -0
  270. package/lib/native/index.mjs +1 -0
  271. package/lib/native/index.mjs.map +1 -0
  272. package/lib/node/index.d.mts +75 -0
  273. package/lib/node/index.d.ts +1 -1
  274. package/lib/node/index.js +1 -0
  275. package/lib/node/index.js.map +1 -0
  276. package/lib/node/index.mjs +1 -0
  277. package/lib/node/index.mjs.map +1 -0
  278. package/package.json +5 -4
  279. package/src/browser/global.browser.d.ts +1 -0
  280. package/src/browser/index.ts +3 -0
  281. package/src/browser/setupWorker/glossary.ts +259 -0
  282. package/src/browser/setupWorker/setupWorker.node.test.ts +10 -0
  283. package/src/browser/setupWorker/setupWorker.ts +199 -0
  284. package/src/browser/setupWorker/start/createFallbackRequestListener.ts +67 -0
  285. package/src/browser/setupWorker/start/createFallbackStart.ts +21 -0
  286. package/src/browser/setupWorker/start/createRequestListener.ts +127 -0
  287. package/src/browser/setupWorker/start/createResponseListener.ts +58 -0
  288. package/src/browser/setupWorker/start/createStartHandler.ts +143 -0
  289. package/src/browser/setupWorker/start/utils/createMessageChannel.ts +32 -0
  290. package/src/browser/setupWorker/start/utils/enableMocking.ts +32 -0
  291. package/src/browser/setupWorker/start/utils/getWorkerByRegistration.ts +25 -0
  292. package/src/browser/setupWorker/start/utils/getWorkerInstance.ts +94 -0
  293. package/src/browser/setupWorker/start/utils/prepareStartHandler.test.ts +59 -0
  294. package/src/browser/setupWorker/start/utils/prepareStartHandler.ts +44 -0
  295. package/src/browser/setupWorker/start/utils/printStartMessage.test.ts +84 -0
  296. package/src/browser/setupWorker/start/utils/printStartMessage.ts +40 -0
  297. package/src/browser/setupWorker/start/utils/validateWorkerScope.ts +18 -0
  298. package/src/browser/setupWorker/stop/createFallbackStop.ts +11 -0
  299. package/src/browser/setupWorker/stop/createStop.ts +29 -0
  300. package/src/browser/setupWorker/stop/utils/printStopMessage.test.ts +26 -0
  301. package/src/browser/setupWorker/stop/utils/printStopMessage.ts +12 -0
  302. package/src/browser/tsconfig.browser.build.json +6 -0
  303. package/src/browser/tsconfig.browser.json +9 -0
  304. package/src/browser/utils/deferNetworkRequestsUntil.test.ts +48 -0
  305. package/src/browser/utils/deferNetworkRequestsUntil.ts +29 -0
  306. package/src/browser/utils/getAbsoluteWorkerUrl.test.ts +31 -0
  307. package/src/browser/utils/getAbsoluteWorkerUrl.ts +7 -0
  308. package/src/browser/utils/parseWorkerRequest.ts +15 -0
  309. package/src/browser/utils/pruneGetRequestBody.test.ts +53 -0
  310. package/src/browser/utils/pruneGetRequestBody.ts +21 -0
  311. package/src/browser/utils/requestIntegrityCheck.ts +23 -0
  312. package/src/browser/utils/supportsReadableStreamTransfer.ts +17 -0
  313. package/src/core/HttpResponse.test.ts +200 -0
  314. package/src/core/HttpResponse.ts +134 -0
  315. package/src/core/SetupApi.ts +95 -0
  316. package/src/core/bypass.test.ts +47 -0
  317. package/src/core/bypass.ts +36 -0
  318. package/src/core/delay.ts +70 -0
  319. package/src/core/graphql.test.ts +11 -0
  320. package/src/core/graphql.ts +138 -0
  321. package/src/core/handlers/GraphQLHandler.test.ts +820 -0
  322. package/src/core/handlers/GraphQLHandler.ts +263 -0
  323. package/src/core/handlers/HttpHandler.test.ts +218 -0
  324. package/src/core/handlers/HttpHandler.ts +169 -0
  325. package/src/core/handlers/RequestHandler.ts +338 -0
  326. package/src/core/http.test.ts +15 -0
  327. package/src/core/http.ts +51 -0
  328. package/src/core/index.ts +56 -0
  329. package/src/core/passthrough.test.ts +13 -0
  330. package/src/core/passthrough.ts +23 -0
  331. package/src/core/sharedOptions.ts +66 -0
  332. package/src/core/typeUtils.ts +20 -0
  333. package/src/core/utils/HttpResponse/decorators.ts +56 -0
  334. package/src/core/utils/getResponse.ts +55 -0
  335. package/src/core/utils/handleRequest.test.ts +554 -0
  336. package/src/core/utils/handleRequest.ts +132 -0
  337. package/src/core/utils/internal/Disposable.ts +9 -0
  338. package/src/core/utils/internal/checkGlobals.ts +17 -0
  339. package/src/core/utils/internal/devUtils.ts +31 -0
  340. package/src/core/utils/internal/getCallFrame.test.ts +154 -0
  341. package/src/core/utils/internal/getCallFrame.ts +35 -0
  342. package/src/core/utils/internal/isIterable.test.ts +23 -0
  343. package/src/core/utils/internal/isIterable.ts +12 -0
  344. package/src/core/utils/internal/isObject.test.ts +20 -0
  345. package/src/core/utils/internal/isObject.ts +6 -0
  346. package/src/core/utils/internal/isStringEqual.test.ts +45 -0
  347. package/src/core/utils/internal/isStringEqual.ts +6 -0
  348. package/src/core/utils/internal/jsonParse.test.ts +13 -0
  349. package/src/core/utils/internal/jsonParse.ts +13 -0
  350. package/src/core/utils/internal/mergeRight.test.ts +43 -0
  351. package/src/core/utils/internal/mergeRight.ts +27 -0
  352. package/src/core/utils/internal/parseGraphQLRequest.test.ts +99 -0
  353. package/src/core/utils/internal/parseGraphQLRequest.ts +205 -0
  354. package/src/core/utils/internal/parseMultipartData.test.ts +76 -0
  355. package/src/core/utils/internal/parseMultipartData.ts +104 -0
  356. package/src/core/utils/internal/pipeEvents.test.ts +14 -0
  357. package/src/core/utils/internal/pipeEvents.ts +25 -0
  358. package/src/core/utils/internal/requestHandlerUtils.ts +21 -0
  359. package/src/core/utils/internal/toReadonlyArray.test.ts +30 -0
  360. package/src/core/utils/internal/toReadonlyArray.ts +8 -0
  361. package/src/core/utils/internal/tryCatch.test.ts +29 -0
  362. package/src/core/utils/internal/tryCatch.ts +11 -0
  363. package/src/core/utils/internal/uuidv4.ts +3 -0
  364. package/src/core/utils/logging/getStatusCodeColor.test.ts +22 -0
  365. package/src/core/utils/logging/getStatusCodeColor.ts +20 -0
  366. package/src/core/utils/logging/getTimestamp.test.ts +18 -0
  367. package/src/core/utils/logging/getTimestamp.ts +12 -0
  368. package/src/core/utils/logging/serializeRequest.test.ts +23 -0
  369. package/src/core/utils/logging/serializeRequest.ts +23 -0
  370. package/src/core/utils/logging/serializeResponse.test.ts +77 -0
  371. package/src/core/utils/logging/serializeResponse.ts +31 -0
  372. package/src/core/utils/matching/matchRequestUrl.test.ts +114 -0
  373. package/src/core/utils/matching/matchRequestUrl.ts +73 -0
  374. package/src/core/utils/matching/normalizePath.node.test.ts +44 -0
  375. package/src/core/utils/matching/normalizePath.test.ts +50 -0
  376. package/src/core/utils/matching/normalizePath.ts +21 -0
  377. package/src/core/utils/request/getPublicUrlFromRequest.test.ts +26 -0
  378. package/src/core/utils/request/getPublicUrlFromRequest.ts +15 -0
  379. package/src/core/utils/request/getRequestCookies.node.test.ts +29 -0
  380. package/src/core/utils/request/getRequestCookies.test.ts +64 -0
  381. package/src/core/utils/request/getRequestCookies.ts +75 -0
  382. package/src/core/utils/request/onUnhandledRequest.test.ts +215 -0
  383. package/src/core/utils/request/onUnhandledRequest.ts +247 -0
  384. package/src/core/utils/request/readResponseCookies.ts +9 -0
  385. package/src/core/utils/toResponseInit.ts +7 -0
  386. package/src/core/utils/url/cleanUrl.test.ts +17 -0
  387. package/src/core/utils/url/cleanUrl.ts +12 -0
  388. package/src/core/utils/url/getAbsoluteUrl.node.test.ts +19 -0
  389. package/src/core/utils/url/getAbsoluteUrl.test.ts +29 -0
  390. package/src/core/utils/url/getAbsoluteUrl.ts +26 -0
  391. package/src/core/utils/url/isAbsoluteUrl.test.ts +32 -0
  392. package/src/core/utils/url/isAbsoluteUrl.ts +6 -0
  393. package/src/iife/index.ts +2 -0
  394. package/src/mockServiceWorker.js +287 -0
  395. package/src/native/index.ts +17 -0
  396. package/src/node/SetupServerApi.ts +113 -0
  397. package/src/node/glossary.ts +62 -0
  398. package/src/node/index.ts +3 -0
  399. package/src/node/setupServer.ts +21 -0
  400. package/src/node/utils/isNodeExceptionLike.ts +14 -0
  401. package/src/tsconfig.core.build.json +6 -0
  402. package/src/tsconfig.node.build.json +6 -0
  403. package/src/tsconfig.node.json +8 -0
  404. package/src/tsconfig.src.json +15 -0
@@ -0,0 +1,199 @@
1
+ import { invariant } from 'outvariant'
2
+ import { isNodeProcess } from 'is-node-process'
3
+ import {
4
+ SetupWorkerInternalContext,
5
+ ServiceWorkerIncomingEventsMap,
6
+ StartReturnType,
7
+ StopHandler,
8
+ StartHandler,
9
+ StartOptions,
10
+ } from './glossary'
11
+ import { createStartHandler } from './start/createStartHandler'
12
+ import { createStop } from './stop/createStop'
13
+ import { ServiceWorkerMessage } from './start/utils/createMessageChannel'
14
+ import { RequestHandler } from '~/core/handlers/RequestHandler'
15
+ import { DEFAULT_START_OPTIONS } from './start/utils/prepareStartHandler'
16
+ import { createFallbackStart } from './start/createFallbackStart'
17
+ import { createFallbackStop } from './stop/createFallbackStop'
18
+ import { devUtils } from '~/core/utils/internal/devUtils'
19
+ import { SetupApi } from '~/core/SetupApi'
20
+ import { mergeRight } from '~/core/utils/internal/mergeRight'
21
+ import { LifeCycleEventsMap } from '~/core/sharedOptions'
22
+ import { SetupWorker } from './glossary'
23
+ import { supportsReadableStreamTransfer } from '../utils/supportsReadableStreamTransfer'
24
+
25
+ interface Listener {
26
+ target: EventTarget
27
+ eventType: string
28
+ callback: EventListenerOrEventListenerObject
29
+ }
30
+
31
+ export class SetupWorkerApi
32
+ extends SetupApi<LifeCycleEventsMap>
33
+ implements SetupWorker
34
+ {
35
+ private context: SetupWorkerInternalContext
36
+ private startHandler: StartHandler = null as any
37
+ private stopHandler: StopHandler = null as any
38
+ private listeners: Array<Listener>
39
+
40
+ constructor(...handlers: Array<RequestHandler>) {
41
+ super(...handlers)
42
+
43
+ invariant(
44
+ !isNodeProcess(),
45
+ devUtils.formatMessage(
46
+ 'Failed to execute `setupWorker` in a non-browser environment. Consider using `setupServer` for Node.js environment instead.',
47
+ ),
48
+ )
49
+
50
+ this.listeners = []
51
+ this.context = this.createWorkerContext()
52
+ }
53
+
54
+ private createWorkerContext(): SetupWorkerInternalContext {
55
+ const context: SetupWorkerInternalContext = {
56
+ // Mocking is not considered enabled until the worker
57
+ // signals back the successful activation event.
58
+ isMockingEnabled: false,
59
+ startOptions: null as any,
60
+ worker: null,
61
+ registration: null,
62
+ requestHandlers: this.currentHandlers,
63
+ emitter: this.emitter,
64
+ workerChannel: {
65
+ on: (eventType, callback) => {
66
+ this.context.events.addListener<
67
+ MessageEvent<ServiceWorkerMessage<typeof eventType, any>>
68
+ >(navigator.serviceWorker, 'message', (event) => {
69
+ // Avoid messages broadcasted from unrelated workers.
70
+ if (event.source !== this.context.worker) {
71
+ return
72
+ }
73
+
74
+ const message = event.data
75
+
76
+ if (!message) {
77
+ return
78
+ }
79
+
80
+ if (message.type === eventType) {
81
+ callback(event, message)
82
+ }
83
+ })
84
+ },
85
+ send: (type) => {
86
+ this.context.worker?.postMessage(type)
87
+ },
88
+ },
89
+ events: {
90
+ addListener: (target, eventType, callback) => {
91
+ target.addEventListener(eventType, callback as EventListener)
92
+ this.listeners.push({
93
+ eventType,
94
+ target,
95
+ callback: callback as EventListener,
96
+ })
97
+
98
+ return () => {
99
+ target.removeEventListener(eventType, callback as EventListener)
100
+ }
101
+ },
102
+ removeAllListeners: () => {
103
+ for (const { target, eventType, callback } of this.listeners) {
104
+ target.removeEventListener(eventType, callback)
105
+ }
106
+ this.listeners = []
107
+ },
108
+ once: (eventType) => {
109
+ const bindings: Array<() => void> = []
110
+
111
+ return new Promise<
112
+ ServiceWorkerMessage<
113
+ typeof eventType,
114
+ ServiceWorkerIncomingEventsMap[typeof eventType]
115
+ >
116
+ >((resolve, reject) => {
117
+ const handleIncomingMessage = (event: MessageEvent) => {
118
+ try {
119
+ const message = event.data
120
+
121
+ if (message.type === eventType) {
122
+ resolve(message)
123
+ }
124
+ } catch (error) {
125
+ reject(error)
126
+ }
127
+ }
128
+
129
+ bindings.push(
130
+ this.context.events.addListener(
131
+ navigator.serviceWorker,
132
+ 'message',
133
+ handleIncomingMessage,
134
+ ),
135
+ this.context.events.addListener(
136
+ navigator.serviceWorker,
137
+ 'messageerror',
138
+ reject,
139
+ ),
140
+ )
141
+ }).finally(() => {
142
+ bindings.forEach((unbind) => unbind())
143
+ })
144
+ },
145
+ },
146
+ supports: {
147
+ serviceWorkerApi:
148
+ !('serviceWorker' in navigator) || location.protocol === 'file:',
149
+ readableStreamTransfer: supportsReadableStreamTransfer(),
150
+ },
151
+ }
152
+
153
+ /**
154
+ * @todo Not sure I like this but "this.currentHandlers"
155
+ * updates never bubble to "this.context.requestHandlers".
156
+ */
157
+ Object.defineProperties(context, {
158
+ requestHandlers: {
159
+ get: () => this.currentHandlers,
160
+ },
161
+ })
162
+
163
+ this.startHandler = context.supports.serviceWorkerApi
164
+ ? createFallbackStart(context)
165
+ : createStartHandler(context)
166
+
167
+ this.stopHandler = context.supports.serviceWorkerApi
168
+ ? createFallbackStop(context)
169
+ : createStop(context)
170
+
171
+ return context
172
+ }
173
+
174
+ public async start(options: StartOptions = {}): StartReturnType {
175
+ this.context.startOptions = mergeRight(
176
+ DEFAULT_START_OPTIONS,
177
+ options,
178
+ ) as SetupWorkerInternalContext['startOptions']
179
+
180
+ return await this.startHandler(this.context.startOptions, options)
181
+ }
182
+
183
+ public stop(): void {
184
+ super.dispose()
185
+ this.context.events.removeAllListeners()
186
+ this.context.emitter.removeAllListeners()
187
+ this.stopHandler()
188
+ }
189
+ }
190
+
191
+ /**
192
+ * Sets up a requests interception in the browser with the given request handlers.
193
+ * @param {RequestHandler[]} handlers List of request handlers.
194
+ *
195
+ * @see {@link https://mswjs.io/docs/api/setup-worker `setupWorker()` API reference}
196
+ */
197
+ export function setupWorker(...handlers: Array<RequestHandler>): SetupWorker {
198
+ return new SetupWorkerApi(...handlers)
199
+ }
@@ -0,0 +1,67 @@
1
+ import {
2
+ Interceptor,
3
+ BatchInterceptor,
4
+ HttpRequestEventMap,
5
+ } from '@mswjs/interceptors'
6
+ import { FetchInterceptor } from '@mswjs/interceptors/fetch'
7
+ import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest'
8
+ import { SetupWorkerInternalContext, StartOptions } from '../glossary'
9
+ import type { RequiredDeep } from '~/core/typeUtils'
10
+ import { handleRequest } from '~/core/utils/handleRequest'
11
+
12
+ export function createFallbackRequestListener(
13
+ context: SetupWorkerInternalContext,
14
+ options: RequiredDeep<StartOptions>,
15
+ ): Interceptor<HttpRequestEventMap> {
16
+ const interceptor = new BatchInterceptor({
17
+ name: 'fallback',
18
+ interceptors: [new FetchInterceptor(), new XMLHttpRequestInterceptor()],
19
+ })
20
+
21
+ interceptor.on('request', async ({ request, requestId }) => {
22
+ const requestCloneForLogs = request.clone()
23
+
24
+ const response = await handleRequest(
25
+ request,
26
+ requestId,
27
+ context.requestHandlers,
28
+ options,
29
+ context.emitter,
30
+ {
31
+ onMockedResponse(_, { handler, parsedResult }) {
32
+ if (!options.quiet) {
33
+ context.emitter.once('response:mocked', ({ response }) => {
34
+ handler.log({
35
+ request: requestCloneForLogs,
36
+ response,
37
+ parsedResult,
38
+ })
39
+ })
40
+ }
41
+ },
42
+ },
43
+ )
44
+
45
+ if (response) {
46
+ request.respondWith(response)
47
+ }
48
+ })
49
+
50
+ interceptor.on(
51
+ 'response',
52
+ ({ response, isMockedResponse, request, requestId }) => {
53
+ context.emitter.emit(
54
+ isMockedResponse ? 'response:mocked' : 'response:bypass',
55
+ {
56
+ response,
57
+ request,
58
+ requestId,
59
+ },
60
+ )
61
+ },
62
+ )
63
+
64
+ interceptor.apply()
65
+
66
+ return interceptor
67
+ }
@@ -0,0 +1,21 @@
1
+ import { createFallbackRequestListener } from './createFallbackRequestListener'
2
+ import { SetupWorkerInternalContext, StartHandler } from '../glossary'
3
+ import { printStartMessage } from './utils/printStartMessage'
4
+
5
+ export function createFallbackStart(
6
+ context: SetupWorkerInternalContext,
7
+ ): StartHandler {
8
+ return async function start(options) {
9
+ context.fallbackInterceptor = createFallbackRequestListener(
10
+ context,
11
+ options,
12
+ )
13
+
14
+ printStartMessage({
15
+ message: 'Mocking enabled (fallback mode).',
16
+ quiet: options.quiet,
17
+ })
18
+
19
+ return undefined
20
+ }
21
+ }
@@ -0,0 +1,127 @@
1
+ import {
2
+ StartOptions,
3
+ SetupWorkerInternalContext,
4
+ ServiceWorkerIncomingEventsMap,
5
+ } from '../glossary'
6
+ import {
7
+ ServiceWorkerMessage,
8
+ WorkerChannel,
9
+ } from './utils/createMessageChannel'
10
+ import { parseWorkerRequest } from '../../utils/parseWorkerRequest'
11
+ import { handleRequest } from '~/core/utils/handleRequest'
12
+ import { RequiredDeep } from '~/core/typeUtils'
13
+ import { devUtils } from '~/core/utils/internal/devUtils'
14
+ import { toResponseInit } from '~/core/utils/toResponseInit'
15
+
16
+ export const createRequestListener = (
17
+ context: SetupWorkerInternalContext,
18
+ options: RequiredDeep<StartOptions>,
19
+ ) => {
20
+ return async (
21
+ event: MessageEvent,
22
+ message: ServiceWorkerMessage<
23
+ 'REQUEST',
24
+ ServiceWorkerIncomingEventsMap['REQUEST']
25
+ >,
26
+ ) => {
27
+ const messageChannel = new WorkerChannel(event.ports[0])
28
+
29
+ const requestId = message.payload.id
30
+ const request = parseWorkerRequest(message.payload)
31
+ const requestCloneForLogs = request.clone()
32
+
33
+ try {
34
+ await handleRequest(
35
+ request,
36
+ requestId,
37
+ context.requestHandlers,
38
+ options,
39
+ context.emitter,
40
+ {
41
+ onPassthroughResponse() {
42
+ messageChannel.postMessage('NOT_FOUND')
43
+ },
44
+ async onMockedResponse(response, { handler, parsedResult }) {
45
+ // Clone the mocked response so its body could be read
46
+ // to buffer to be sent to the worker and also in the
47
+ // ".log()" method of the request handler.
48
+ const responseClone = response.clone()
49
+ const responseCloneForLogs = response.clone()
50
+ const responseInit = toResponseInit(response)
51
+
52
+ /**
53
+ * @note Safari doesn't support transferring a "ReadableStream".
54
+ * Check that the browser supports that before sending it to the worker.
55
+ */
56
+ if (context.supports.readableStreamTransfer) {
57
+ const responseStreamOrNull = response.body
58
+
59
+ messageChannel.postMessage(
60
+ 'MOCK_RESPONSE',
61
+ {
62
+ ...responseInit,
63
+ body: responseStreamOrNull,
64
+ },
65
+ responseStreamOrNull ? [responseStreamOrNull] : undefined,
66
+ )
67
+ } else {
68
+ /**
69
+ * @note If we are here, this means the current environment doesn't
70
+ * support "ReadableStream" as transferable. In that case,
71
+ * attempt to read the non-empty response body as ArrayBuffer, if it's not empty.
72
+ * @see https://github.com/mswjs/msw/issues/1827
73
+ */
74
+ const responseBufferOrNull =
75
+ response.body === null
76
+ ? null
77
+ : await responseClone.arrayBuffer()
78
+
79
+ messageChannel.postMessage('MOCK_RESPONSE', {
80
+ ...responseInit,
81
+ body: responseBufferOrNull,
82
+ })
83
+ }
84
+
85
+ if (!options.quiet) {
86
+ context.emitter.once('response:mocked', () => {
87
+ handler.log({
88
+ request: requestCloneForLogs,
89
+ response: responseCloneForLogs,
90
+ parsedResult,
91
+ })
92
+ })
93
+ }
94
+ },
95
+ },
96
+ )
97
+ } catch (error) {
98
+ if (error instanceof Error) {
99
+ devUtils.error(
100
+ `Uncaught exception in the request handler for "%s %s":
101
+
102
+ %s
103
+
104
+ This 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`,
105
+ request.method,
106
+ request.url,
107
+ error.stack ?? error,
108
+ )
109
+
110
+ // Treat all other exceptions in a request handler as unintended,
111
+ // alerting that there is a problem that needs fixing.
112
+ messageChannel.postMessage('MOCK_RESPONSE', {
113
+ status: 500,
114
+ statusText: 'Request Handler Error',
115
+ headers: {
116
+ 'Content-Type': 'application/json',
117
+ },
118
+ body: JSON.stringify({
119
+ name: error.name,
120
+ message: error.message,
121
+ stack: error.stack,
122
+ }),
123
+ })
124
+ }
125
+ }
126
+ }
127
+ }
@@ -0,0 +1,58 @@
1
+ import {
2
+ ServiceWorkerIncomingEventsMap,
3
+ SetupWorkerInternalContext,
4
+ } from '../glossary'
5
+ import { ServiceWorkerMessage } from './utils/createMessageChannel'
6
+ import { isResponseWithoutBody } from '@mswjs/interceptors'
7
+
8
+ export function createResponseListener(context: SetupWorkerInternalContext) {
9
+ return (
10
+ _: MessageEvent,
11
+ message: ServiceWorkerMessage<
12
+ 'RESPONSE',
13
+ ServiceWorkerIncomingEventsMap['RESPONSE']
14
+ >,
15
+ ) => {
16
+ const { payload: responseJson } = message
17
+
18
+ /**
19
+ * CORS requests with `mode: "no-cors"` result in "opaque" responses.
20
+ * That kind of responses cannot be manipulated in JavaScript due
21
+ * to the security considerations.
22
+ * @see https://fetch.spec.whatwg.org/#concept-filtered-response-opaque
23
+ * @see https://github.com/mswjs/msw/issues/529
24
+ */
25
+ if (responseJson.type?.includes('opaque')) {
26
+ return
27
+ }
28
+
29
+ const response =
30
+ responseJson.status === 0
31
+ ? Response.error()
32
+ : new Response(
33
+ /**
34
+ * Responses may be streams here, but when we create a response object
35
+ * with null-body status codes, like 204, 205, 304 Response will
36
+ * throw when passed a non-null body, so ensure it's null here
37
+ * for those codes
38
+ */
39
+ isResponseWithoutBody(responseJson.status)
40
+ ? null
41
+ : responseJson.body,
42
+ responseJson,
43
+ )
44
+
45
+ context.emitter.emit(
46
+ responseJson.isMockedResponse ? 'response:mocked' : 'response:bypass',
47
+ {
48
+ response,
49
+ /**
50
+ * @todo @fixme In this context, we don't know anything about
51
+ * the request.
52
+ */
53
+ request: null as any,
54
+ requestId: responseJson.requestId,
55
+ },
56
+ )
57
+ }
58
+ }
@@ -0,0 +1,143 @@
1
+ import { until } from '@open-draft/until'
2
+ import { devUtils } from '~/core/utils/internal/devUtils'
3
+ import { getWorkerInstance } from './utils/getWorkerInstance'
4
+ import { enableMocking } from './utils/enableMocking'
5
+ import { SetupWorkerInternalContext, StartHandler } from '../glossary'
6
+ import { createRequestListener } from './createRequestListener'
7
+ import { requestIntegrityCheck } from '../../utils/requestIntegrityCheck'
8
+ import { deferNetworkRequestsUntil } from '../../utils/deferNetworkRequestsUntil'
9
+ import { createResponseListener } from './createResponseListener'
10
+ import { validateWorkerScope } from './utils/validateWorkerScope'
11
+
12
+ export const createStartHandler = (
13
+ context: SetupWorkerInternalContext,
14
+ ): StartHandler => {
15
+ return function start(options, customOptions) {
16
+ const startWorkerInstance = async () => {
17
+ // Remove all previously existing event listeners.
18
+ // This way none of the listeners persists between Fast refresh
19
+ // of the application's code.
20
+ context.events.removeAllListeners()
21
+
22
+ // Handle requests signaled by the worker.
23
+ context.workerChannel.on(
24
+ 'REQUEST',
25
+ createRequestListener(context, options),
26
+ )
27
+
28
+ // Handle responses signaled by the worker.
29
+ context.workerChannel.on('RESPONSE', createResponseListener(context))
30
+
31
+ const instance = await getWorkerInstance(
32
+ options.serviceWorker.url,
33
+ options.serviceWorker.options,
34
+ options.findWorker,
35
+ )
36
+
37
+ const [worker, registration] = instance
38
+
39
+ if (!worker) {
40
+ const missingWorkerMessage = customOptions?.findWorker
41
+ ? devUtils.formatMessage(
42
+ `Failed to locate the Service Worker registration using a custom "findWorker" predicate.
43
+
44
+ Please ensure that the custom predicate properly locates the Service Worker registration at "%s".
45
+ More details: https://mswjs.io/docs/api/setup-worker/start#findworker
46
+ `,
47
+ options.serviceWorker.url,
48
+ )
49
+ : devUtils.formatMessage(
50
+ `Failed to locate the Service Worker registration.
51
+
52
+ This 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.
53
+
54
+ Please 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`,
55
+ options.serviceWorker.url,
56
+ location.host,
57
+ )
58
+
59
+ throw new Error(missingWorkerMessage)
60
+ }
61
+
62
+ context.worker = worker
63
+ context.registration = registration
64
+
65
+ context.events.addListener(window, 'beforeunload', () => {
66
+ if (worker.state !== 'redundant') {
67
+ // Notify the Service Worker that this client has closed.
68
+ // Internally, it's similar to disabling the mocking, only
69
+ // client close event has a handler that self-terminates
70
+ // the Service Worker when there are no open clients.
71
+ context.workerChannel.send('CLIENT_CLOSED')
72
+ }
73
+ // Make sure we're always clearing the interval - there are reports that not doing this can
74
+ // cause memory leaks in headless browser environments.
75
+ window.clearInterval(context.keepAliveInterval)
76
+ })
77
+
78
+ // Check if the active Service Worker is the latest published one
79
+ const integrityCheckResult = await until(() =>
80
+ requestIntegrityCheck(context, worker),
81
+ )
82
+
83
+ if (integrityCheckResult.error) {
84
+ devUtils.error(`\
85
+ Detected outdated Service Worker: ${integrityCheckResult.error.message}
86
+
87
+ The mocking is still enabled, but it's highly recommended that you update your Service Worker by running:
88
+
89
+ $ npx msw init <PUBLIC_DIR>
90
+
91
+ This is necessary to ensure that the Service Worker is in sync with the library to guarantee its stability.
92
+ If this message still persists after updating, please report an issue: https://github.com/open-draft/msw/issues\
93
+ `)
94
+ }
95
+
96
+ context.keepAliveInterval = window.setInterval(
97
+ () => context.workerChannel.send('KEEPALIVE_REQUEST'),
98
+ 5000,
99
+ )
100
+
101
+ // Warn the user when loading the page that lies outside
102
+ // of the worker's scope.
103
+ validateWorkerScope(registration, context.startOptions)
104
+
105
+ return registration
106
+ }
107
+
108
+ const workerRegistration = startWorkerInstance().then(
109
+ async (registration) => {
110
+ const pendingInstance = registration.installing || registration.waiting
111
+
112
+ // Wait until the worker is activated.
113
+ // Assume the worker is already activated if there's no pending registration
114
+ // (i.e. when reloading the page after a successful activation).
115
+ if (pendingInstance) {
116
+ await new Promise<void>((resolve) => {
117
+ pendingInstance.addEventListener('statechange', () => {
118
+ if (pendingInstance.state === 'activated') {
119
+ return resolve()
120
+ }
121
+ })
122
+ })
123
+ }
124
+
125
+ // Print the activation message only after the worker has been activated.
126
+ await enableMocking(context, options).catch((error) => {
127
+ throw new Error(`Failed to enable mocking: ${error?.message}`)
128
+ })
129
+
130
+ return registration
131
+ },
132
+ )
133
+
134
+ // Defer any network requests until the Service Worker instance is ready.
135
+ // This prevents a race condition between the Service Worker registration
136
+ // and application's runtime requests (i.e. requests on mount).
137
+ if (options.waitUntilReady) {
138
+ deferNetworkRequestsUntil(workerRegistration)
139
+ }
140
+
141
+ return workerRegistration
142
+ }
143
+ }
@@ -0,0 +1,32 @@
1
+ import {
2
+ StringifiedResponse,
3
+ ServiceWorkerIncomingEventsMap,
4
+ } from '../../glossary'
5
+
6
+ export interface ServiceWorkerMessage<
7
+ EventType extends keyof ServiceWorkerIncomingEventsMap,
8
+ EventPayload,
9
+ > {
10
+ type: EventType
11
+ payload: EventPayload
12
+ }
13
+
14
+ interface WorkerChannelEventsMap {
15
+ MOCK_RESPONSE: [
16
+ data: StringifiedResponse,
17
+ transfer?: [ReadableStream<Uint8Array>],
18
+ ]
19
+ NOT_FOUND: []
20
+ }
21
+
22
+ export class WorkerChannel {
23
+ constructor(private readonly port: MessagePort) {}
24
+
25
+ public postMessage<Event extends keyof WorkerChannelEventsMap>(
26
+ event: Event,
27
+ ...rest: WorkerChannelEventsMap[Event]
28
+ ): void {
29
+ const [data, transfer] = rest
30
+ this.port.postMessage({ type: event, data }, { transfer })
31
+ }
32
+ }
@@ -0,0 +1,32 @@
1
+ import { devUtils } from '~/core/utils/internal/devUtils'
2
+ import { StartOptions, SetupWorkerInternalContext } from '../../glossary'
3
+ import { printStartMessage } from './printStartMessage'
4
+
5
+ /**
6
+ * Signals the worker to enable the interception of requests.
7
+ */
8
+ export async function enableMocking(
9
+ context: SetupWorkerInternalContext,
10
+ options: StartOptions,
11
+ ) {
12
+ context.workerChannel.send('MOCK_ACTIVATE')
13
+ await context.events.once('MOCKING_ENABLED')
14
+
15
+ // Warn the developer on multiple "worker.start()" calls.
16
+ // While this will not affect the worker in any way,
17
+ // it likely indicates an issue with the developer's code.
18
+ if (context.isMockingEnabled) {
19
+ devUtils.warn(
20
+ `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.`,
21
+ )
22
+ return
23
+ }
24
+
25
+ context.isMockingEnabled = true
26
+
27
+ printStartMessage({
28
+ quiet: options.quiet,
29
+ workerScope: context.registration?.scope,
30
+ workerUrl: context.worker?.scriptURL,
31
+ })
32
+ }