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,263 @@
1
+ import type { DocumentNode, GraphQLError, OperationTypeNode } from 'graphql'
2
+ import {
3
+ DefaultBodyType,
4
+ RequestHandler,
5
+ RequestHandlerDefaultInfo,
6
+ RequestHandlerOptions,
7
+ ResponseResolver,
8
+ } from './RequestHandler'
9
+ import { getTimestamp } from '../utils/logging/getTimestamp'
10
+ import { getStatusCodeColor } from '../utils/logging/getStatusCodeColor'
11
+ import { serializeRequest } from '../utils/logging/serializeRequest'
12
+ import { serializeResponse } from '../utils/logging/serializeResponse'
13
+ import { Match, matchRequestUrl, Path } from '../utils/matching/matchRequestUrl'
14
+ import {
15
+ ParsedGraphQLRequest,
16
+ GraphQLMultipartRequestBody,
17
+ parseGraphQLRequest,
18
+ parseDocumentNode,
19
+ } from '../utils/internal/parseGraphQLRequest'
20
+ import { getPublicUrlFromRequest } from '../utils/request/getPublicUrlFromRequest'
21
+ import { devUtils } from '../utils/internal/devUtils'
22
+ import { getAllRequestCookies } from '../utils/request/getRequestCookies'
23
+
24
+ export type ExpectedOperationTypeNode = OperationTypeNode | 'all'
25
+ export type GraphQLHandlerNameSelector = DocumentNode | RegExp | string
26
+
27
+ export type GraphQLVariables = Record<string, any>
28
+
29
+ export interface GraphQLHandlerInfo extends RequestHandlerDefaultInfo {
30
+ operationType: ExpectedOperationTypeNode
31
+ operationName: GraphQLHandlerNameSelector
32
+ }
33
+
34
+ export type GraphQLRequestParsedResult = {
35
+ match: Match
36
+ } & (
37
+ | ParsedGraphQLRequest<GraphQLVariables>
38
+ /**
39
+ * An empty version of the ParsedGraphQLRequest
40
+ * which simplifies the return type of the resolver
41
+ * when the request is to a non-matching endpoint
42
+ */
43
+ | {
44
+ operationType?: undefined
45
+ operationName?: undefined
46
+ query?: undefined
47
+ variables?: undefined
48
+ }
49
+ )
50
+
51
+ export type GraphQLResolverExtras<Variables extends GraphQLVariables> = {
52
+ query: string
53
+ operationName: string
54
+ variables: Variables
55
+ cookies: Record<string, string>
56
+ }
57
+
58
+ export type GraphQLRequestBody<VariablesType extends GraphQLVariables> =
59
+ | GraphQLJsonRequestBody<VariablesType>
60
+ | GraphQLMultipartRequestBody
61
+ | Record<string, any>
62
+ | undefined
63
+
64
+ export interface GraphQLJsonRequestBody<Variables extends GraphQLVariables> {
65
+ query: string
66
+ variables?: Variables
67
+ }
68
+
69
+ export interface GraphQLResponseBody<BodyType extends DefaultBodyType> {
70
+ data?: BodyType | null
71
+ errors?: readonly Partial<GraphQLError>[] | null
72
+ }
73
+
74
+ export function isDocumentNode(
75
+ value: DocumentNode | any,
76
+ ): value is DocumentNode {
77
+ if (value == null) {
78
+ return false
79
+ }
80
+
81
+ return typeof value === 'object' && 'kind' in value && 'definitions' in value
82
+ }
83
+
84
+ export class GraphQLHandler extends RequestHandler<
85
+ GraphQLHandlerInfo,
86
+ GraphQLRequestParsedResult,
87
+ GraphQLResolverExtras<any>
88
+ > {
89
+ private endpoint: Path
90
+
91
+ static parsedRequestCache = new WeakMap<
92
+ Request,
93
+ ParsedGraphQLRequest<GraphQLVariables>
94
+ >()
95
+
96
+ constructor(
97
+ operationType: ExpectedOperationTypeNode,
98
+ operationName: GraphQLHandlerNameSelector,
99
+ endpoint: Path,
100
+ resolver: ResponseResolver<GraphQLResolverExtras<any>, any, any>,
101
+ options?: RequestHandlerOptions,
102
+ ) {
103
+ let resolvedOperationName = operationName
104
+
105
+ if (isDocumentNode(operationName)) {
106
+ const parsedNode = parseDocumentNode(operationName)
107
+
108
+ if (parsedNode.operationType !== operationType) {
109
+ throw new Error(
110
+ `Failed to create a GraphQL handler: provided a DocumentNode with a mismatched operation type (expected "${operationType}", but got "${parsedNode.operationType}").`,
111
+ )
112
+ }
113
+
114
+ if (!parsedNode.operationName) {
115
+ throw new Error(
116
+ `Failed to create a GraphQL handler: provided a DocumentNode with no operation name.`,
117
+ )
118
+ }
119
+
120
+ resolvedOperationName = parsedNode.operationName
121
+ }
122
+
123
+ const header =
124
+ operationType === 'all'
125
+ ? `${operationType} (origin: ${endpoint.toString()})`
126
+ : `${operationType} ${resolvedOperationName} (origin: ${endpoint.toString()})`
127
+
128
+ super({
129
+ info: {
130
+ header,
131
+ operationType,
132
+ operationName: resolvedOperationName,
133
+ },
134
+ resolver,
135
+ options,
136
+ })
137
+
138
+ this.endpoint = endpoint
139
+ }
140
+
141
+ /**
142
+ * Parses the request body, once per request, cached across all
143
+ * GraphQL handlers. This is done to avoid multiple parsing of the
144
+ * request body, which each requires a clone of the request.
145
+ */
146
+ async parseGraphQLRequestOrGetFromCache(
147
+ request: Request,
148
+ ): Promise<ParsedGraphQLRequest<GraphQLVariables>> {
149
+ if (!GraphQLHandler.parsedRequestCache.has(request)) {
150
+ GraphQLHandler.parsedRequestCache.set(
151
+ request,
152
+ await parseGraphQLRequest(request).catch((error) => {
153
+ console.error(error)
154
+ return undefined
155
+ }),
156
+ )
157
+ }
158
+
159
+ return GraphQLHandler.parsedRequestCache.get(request)
160
+ }
161
+
162
+ async parse(args: { request: Request }): Promise<GraphQLRequestParsedResult> {
163
+ /**
164
+ * If the request doesn't match a specified endpoint, there's no
165
+ * need to parse it since there's no case where we would handle this
166
+ */
167
+ const match = matchRequestUrl(new URL(args.request.url), this.endpoint)
168
+ if (!match.matches) {
169
+ return { match }
170
+ }
171
+
172
+ const parsedResult = await this.parseGraphQLRequestOrGetFromCache(
173
+ args.request,
174
+ )
175
+
176
+ if (typeof parsedResult === 'undefined') {
177
+ return { match }
178
+ }
179
+
180
+ return {
181
+ match,
182
+ query: parsedResult.query,
183
+ operationType: parsedResult.operationType,
184
+ operationName: parsedResult.operationName,
185
+ variables: parsedResult.variables,
186
+ }
187
+ }
188
+
189
+ predicate(args: {
190
+ request: Request
191
+ parsedResult: GraphQLRequestParsedResult
192
+ }) {
193
+ if (args.parsedResult.operationType === undefined) {
194
+ return false
195
+ }
196
+
197
+ if (!args.parsedResult.operationName && this.info.operationType !== 'all') {
198
+ const publicUrl = getPublicUrlFromRequest(args.request)
199
+
200
+ devUtils.warn(`\
201
+ Failed to intercept a GraphQL request at "${args.request.method} ${publicUrl}": anonymous GraphQL operations are not supported.
202
+
203
+ Consider naming this operation or using "graphql.operation()" request handler to intercept GraphQL requests regardless of their operation name/type. Read more: https://mswjs.io/docs/api/graphql/#graphqloperationresolver`)
204
+ return false
205
+ }
206
+
207
+ const hasMatchingOperationType =
208
+ this.info.operationType === 'all' ||
209
+ args.parsedResult.operationType === this.info.operationType
210
+
211
+ const hasMatchingOperationName =
212
+ this.info.operationName instanceof RegExp
213
+ ? this.info.operationName.test(args.parsedResult.operationName || '')
214
+ : args.parsedResult.operationName === this.info.operationName
215
+
216
+ return (
217
+ args.parsedResult.match.matches &&
218
+ hasMatchingOperationType &&
219
+ hasMatchingOperationName
220
+ )
221
+ }
222
+
223
+ protected extendResolverArgs(args: {
224
+ request: Request
225
+ parsedResult: GraphQLRequestParsedResult
226
+ }) {
227
+ const cookies = getAllRequestCookies(args.request)
228
+
229
+ return {
230
+ query: args.parsedResult.query || '',
231
+ operationName: args.parsedResult.operationName || '',
232
+ variables: args.parsedResult.variables || {},
233
+ cookies,
234
+ }
235
+ }
236
+
237
+ async log(args: {
238
+ request: Request
239
+ response: Response
240
+ parsedResult: GraphQLRequestParsedResult
241
+ }) {
242
+ const loggedRequest = await serializeRequest(args.request)
243
+ const loggedResponse = await serializeResponse(args.response)
244
+ const statusColor = getStatusCodeColor(loggedResponse.status)
245
+ const requestInfo = args.parsedResult.operationName
246
+ ? `${args.parsedResult.operationType} ${args.parsedResult.operationName}`
247
+ : `anonymous ${args.parsedResult.operationType}`
248
+
249
+ console.groupCollapsed(
250
+ devUtils.formatMessage(
251
+ `${getTimestamp()} ${requestInfo} (%c${loggedResponse.status} ${
252
+ loggedResponse.statusText
253
+ }%c)`,
254
+ ),
255
+ `color:${statusColor}`,
256
+ 'color:inherit',
257
+ )
258
+ console.log('Request:', loggedRequest)
259
+ console.log('Handler:', this)
260
+ console.log('Response:', loggedResponse)
261
+ console.groupEnd()
262
+ }
263
+ }
@@ -0,0 +1,218 @@
1
+ /**
2
+ * @vitest-environment jsdom
3
+ */
4
+ import { HttpHandler, HttpRequestResolverExtras } from './HttpHandler'
5
+ import { HttpResponse } from '..'
6
+ import { ResponseResolver } from './RequestHandler'
7
+
8
+ const resolver: ResponseResolver<
9
+ HttpRequestResolverExtras<{ userId: string }>
10
+ > = ({ params }) => {
11
+ return HttpResponse.json({ userId: params.userId })
12
+ }
13
+
14
+ describe('info', () => {
15
+ test('exposes request handler information', () => {
16
+ const handler = new HttpHandler('GET', '/user/:userId', resolver)
17
+
18
+ expect(handler.info.header).toEqual('GET /user/:userId')
19
+ expect(handler.info.method).toEqual('GET')
20
+ expect(handler.info.path).toEqual('/user/:userId')
21
+ expect(handler.isUsed).toBe(false)
22
+ })
23
+ })
24
+
25
+ describe('parse', () => {
26
+ test('parses a URL given a matching request', async () => {
27
+ const handler = new HttpHandler('GET', '/user/:userId', resolver)
28
+ const request = new Request(new URL('/user/abc-123', location.href))
29
+
30
+ expect(await handler.parse({ request })).toEqual({
31
+ match: {
32
+ matches: true,
33
+ params: {
34
+ userId: 'abc-123',
35
+ },
36
+ },
37
+ cookies: {},
38
+ })
39
+ })
40
+
41
+ test('parses a URL and ignores the request method', async () => {
42
+ const handler = new HttpHandler('GET', '/user/:userId', resolver)
43
+ const request = new Request(new URL('/user/def-456', location.href), {
44
+ method: 'POST',
45
+ })
46
+
47
+ expect(await handler.parse({ request })).toEqual({
48
+ match: {
49
+ matches: true,
50
+ params: {
51
+ userId: 'def-456',
52
+ },
53
+ },
54
+ cookies: {},
55
+ })
56
+ })
57
+
58
+ test('returns negative match result given a non-matching request', async () => {
59
+ const handler = new HttpHandler('GET', '/user/:userId', resolver)
60
+ const request = new Request(new URL('/login', location.href))
61
+
62
+ expect(await handler.parse({ request })).toEqual({
63
+ match: {
64
+ matches: false,
65
+ params: {},
66
+ },
67
+ cookies: {},
68
+ })
69
+ })
70
+ })
71
+
72
+ describe('predicate', () => {
73
+ test('returns true given a matching request', async () => {
74
+ const handler = new HttpHandler('POST', '/login', resolver)
75
+ const request = new Request(new URL('/login', location.href), {
76
+ method: 'POST',
77
+ })
78
+
79
+ expect(
80
+ handler.predicate({
81
+ request,
82
+ parsedResult: await handler.parse({ request }),
83
+ }),
84
+ ).toBe(true)
85
+ })
86
+
87
+ test('respects RegExp as the request method', async () => {
88
+ const handler = new HttpHandler(/.+/, '/login', resolver)
89
+ const requests = [
90
+ new Request(new URL('/login', location.href)),
91
+ new Request(new URL('/login', location.href), { method: 'POST' }),
92
+ new Request(new URL('/login', location.href), { method: 'DELETE' }),
93
+ ]
94
+
95
+ for (const request of requests) {
96
+ expect(
97
+ handler.predicate({
98
+ request,
99
+ parsedResult: await handler.parse({ request }),
100
+ }),
101
+ ).toBe(true)
102
+ }
103
+ })
104
+
105
+ test('returns false given a non-matching request', async () => {
106
+ const handler = new HttpHandler('POST', '/login', resolver)
107
+ const request = new Request(new URL('/user/abc-123', location.href))
108
+
109
+ expect(
110
+ handler.predicate({
111
+ request,
112
+ parsedResult: await handler.parse({ request }),
113
+ }),
114
+ ).toBe(false)
115
+ })
116
+ })
117
+
118
+ describe('test', () => {
119
+ test('returns true given a matching request', async () => {
120
+ const handler = new HttpHandler('GET', '/user/:userId', resolver)
121
+ const firstTest = await handler.test({
122
+ request: new Request(new URL('/user/abc-123', location.href)),
123
+ })
124
+ const secondTest = await handler.test({
125
+ request: new Request(new URL('/user/def-456', location.href)),
126
+ })
127
+
128
+ expect(firstTest).toBe(true)
129
+ expect(secondTest).toBe(true)
130
+ })
131
+
132
+ test('returns false given a non-matching request', async () => {
133
+ const handler = new HttpHandler('GET', '/user/:userId', resolver)
134
+ const firstTest = await handler.test({
135
+ request: new Request(new URL('/login', location.href)),
136
+ })
137
+ const secondTest = await handler.test({
138
+ request: new Request(new URL('/user/', location.href)),
139
+ })
140
+ const thirdTest = await handler.test({
141
+ request: new Request(new URL('/user/abc-123/extra', location.href)),
142
+ })
143
+
144
+ expect(firstTest).toBe(false)
145
+ expect(secondTest).toBe(false)
146
+ expect(thirdTest).toBe(false)
147
+ })
148
+ })
149
+
150
+ describe('run', () => {
151
+ test('returns a mocked response given a matching request', async () => {
152
+ const handler = new HttpHandler('GET', '/user/:userId', resolver)
153
+ const request = new Request(new URL('/user/abc-123', location.href))
154
+ const result = await handler.run({ request })
155
+
156
+ expect(result!.handler).toEqual(handler)
157
+ expect(result!.parsedResult).toEqual({
158
+ match: {
159
+ matches: true,
160
+ params: {
161
+ userId: 'abc-123',
162
+ },
163
+ },
164
+ cookies: {},
165
+ })
166
+ expect(result!.request.method).toBe('GET')
167
+ expect(result!.request.url).toBe('http://localhost/user/abc-123')
168
+ expect(result!.response?.status).toBe(200)
169
+ expect(result!.response?.statusText).toBe('OK')
170
+ expect(await result?.response?.json()).toEqual({ userId: 'abc-123' })
171
+ })
172
+
173
+ test('returns null given a non-matching request', async () => {
174
+ const handler = new HttpHandler('POST', '/login', resolver)
175
+ const result = await handler.run({
176
+ request: new Request(new URL('/users', location.href)),
177
+ })
178
+
179
+ expect(result).toBeNull()
180
+ })
181
+
182
+ test('returns an empty "params" object given request with no URL parameters', async () => {
183
+ const handler = new HttpHandler('GET', '/users', resolver)
184
+ const result = await handler.run({
185
+ request: new Request(new URL('/users', location.href)),
186
+ })
187
+
188
+ expect(result?.parsedResult?.match?.params).toEqual({})
189
+ })
190
+
191
+ test('exhauses resolver until its generator completes', async () => {
192
+ const handler = new HttpHandler('GET', '/users', function* () {
193
+ let count = 0
194
+
195
+ while (count < 5) {
196
+ count += 1
197
+ yield HttpResponse.text('pending')
198
+ }
199
+
200
+ return HttpResponse.text('complete')
201
+ })
202
+
203
+ const run = async () => {
204
+ const result = await handler.run({
205
+ request: new Request(new URL('/users', location.href)),
206
+ })
207
+ return result?.response?.text()
208
+ }
209
+
210
+ expect(await run()).toBe('pending')
211
+ expect(await run()).toBe('pending')
212
+ expect(await run()).toBe('pending')
213
+ expect(await run()).toBe('pending')
214
+ expect(await run()).toBe('pending')
215
+ expect(await run()).toBe('complete')
216
+ expect(await run()).toBe('complete')
217
+ })
218
+ })
@@ -0,0 +1,169 @@
1
+ import { ResponseResolutionContext } from '../utils/getResponse'
2
+ import { devUtils } from '../utils/internal/devUtils'
3
+ import { isStringEqual } from '../utils/internal/isStringEqual'
4
+ import { getStatusCodeColor } from '../utils/logging/getStatusCodeColor'
5
+ import { getTimestamp } from '../utils/logging/getTimestamp'
6
+ import { serializeRequest } from '../utils/logging/serializeRequest'
7
+ import { serializeResponse } from '../utils/logging/serializeResponse'
8
+ import {
9
+ matchRequestUrl,
10
+ Match,
11
+ Path,
12
+ PathParams,
13
+ } from '../utils/matching/matchRequestUrl'
14
+ import { getPublicUrlFromRequest } from '../utils/request/getPublicUrlFromRequest'
15
+ import { getAllRequestCookies } from '../utils/request/getRequestCookies'
16
+ import { cleanUrl, getSearchParams } from '../utils/url/cleanUrl'
17
+ import {
18
+ RequestHandler,
19
+ RequestHandlerDefaultInfo,
20
+ RequestHandlerOptions,
21
+ ResponseResolver,
22
+ } from './RequestHandler'
23
+
24
+ type HttpHandlerMethod = string | RegExp
25
+
26
+ export interface HttpHandlerInfo extends RequestHandlerDefaultInfo {
27
+ method: HttpHandlerMethod
28
+ path: Path
29
+ }
30
+
31
+ export enum HttpMethods {
32
+ HEAD = 'HEAD',
33
+ GET = 'GET',
34
+ POST = 'POST',
35
+ PUT = 'PUT',
36
+ PATCH = 'PATCH',
37
+ OPTIONS = 'OPTIONS',
38
+ DELETE = 'DELETE',
39
+ }
40
+
41
+ export type RequestQuery = {
42
+ [queryName: string]: string
43
+ }
44
+
45
+ export type HttpRequestParsedResult = {
46
+ match: Match
47
+ cookies: Record<string, string>
48
+ }
49
+
50
+ export type HttpRequestResolverExtras<Params extends PathParams> = {
51
+ params: Params
52
+ cookies: Record<string, string>
53
+ }
54
+
55
+ /**
56
+ * Request handler for HTTP requests.
57
+ * Provides request matching based on method and URL.
58
+ */
59
+ export class HttpHandler extends RequestHandler<
60
+ HttpHandlerInfo,
61
+ HttpRequestParsedResult,
62
+ HttpRequestResolverExtras<any>
63
+ > {
64
+ constructor(
65
+ method: HttpHandlerMethod,
66
+ path: Path,
67
+ resolver: ResponseResolver<HttpRequestResolverExtras<any>, any, any>,
68
+ options?: RequestHandlerOptions,
69
+ ) {
70
+ super({
71
+ info: {
72
+ header: `${method} ${path}`,
73
+ path,
74
+ method,
75
+ },
76
+ resolver,
77
+ options,
78
+ })
79
+
80
+ this.checkRedundantQueryParameters()
81
+ }
82
+
83
+ private checkRedundantQueryParameters() {
84
+ const { method, path } = this.info
85
+
86
+ if (path instanceof RegExp) {
87
+ return
88
+ }
89
+
90
+ const url = cleanUrl(path)
91
+
92
+ // Bypass request handler URLs that have no redundant characters.
93
+ if (url === path) {
94
+ return
95
+ }
96
+
97
+ const searchParams = getSearchParams(path)
98
+ const queryParams: string[] = []
99
+
100
+ searchParams.forEach((_, paramName) => {
101
+ queryParams.push(paramName)
102
+ })
103
+
104
+ devUtils.warn(
105
+ `Found a redundant usage of query parameters in the request handler URL for "${method} ${path}". Please match against a path instead and access query parameters in the response resolver function using "req.url.searchParams".`,
106
+ )
107
+ }
108
+
109
+ async parse(args: {
110
+ request: Request
111
+ resolutionContext?: ResponseResolutionContext
112
+ }) {
113
+ const url = new URL(args.request.url)
114
+ const match = matchRequestUrl(
115
+ url,
116
+ this.info.path,
117
+ args.resolutionContext?.baseUrl,
118
+ )
119
+ const cookies = getAllRequestCookies(args.request)
120
+
121
+ return {
122
+ match,
123
+ cookies,
124
+ }
125
+ }
126
+
127
+ predicate(args: { request: Request; parsedResult: HttpRequestParsedResult }) {
128
+ const hasMatchingMethod = this.matchMethod(args.request.method)
129
+ const hasMatchingUrl = args.parsedResult.match.matches
130
+ return hasMatchingMethod && hasMatchingUrl
131
+ }
132
+
133
+ private matchMethod(actualMethod: string): boolean {
134
+ return this.info.method instanceof RegExp
135
+ ? this.info.method.test(actualMethod)
136
+ : isStringEqual(this.info.method, actualMethod)
137
+ }
138
+
139
+ protected extendResolverArgs(args: {
140
+ request: Request
141
+ parsedResult: HttpRequestParsedResult
142
+ }) {
143
+ return {
144
+ params: args.parsedResult.match?.params || {},
145
+ cookies: args.parsedResult.cookies,
146
+ }
147
+ }
148
+
149
+ async log(args: { request: Request; response: Response }) {
150
+ const publicUrl = getPublicUrlFromRequest(args.request)
151
+ const loggedRequest = await serializeRequest(args.request)
152
+ const loggedResponse = await serializeResponse(args.response)
153
+ const statusColor = getStatusCodeColor(loggedResponse.status)
154
+
155
+ console.groupCollapsed(
156
+ devUtils.formatMessage(
157
+ `${getTimestamp()} ${args.request.method} ${publicUrl} (%c${
158
+ loggedResponse.status
159
+ } ${loggedResponse.statusText}%c)`,
160
+ ),
161
+ `color:${statusColor}`,
162
+ 'color:inherit',
163
+ )
164
+ console.log('Request', loggedRequest)
165
+ console.log('Handler:', this)
166
+ console.log('Response', loggedResponse)
167
+ console.groupEnd()
168
+ }
169
+ }