msw 2.0.12 → 2.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (404) hide show
  1. package/lib/browser/index.d.mts +104 -0
  2. package/lib/browser/index.d.ts +1 -1
  3. package/lib/browser/index.js +1 -0
  4. package/lib/browser/index.js.map +1 -0
  5. package/lib/browser/index.mjs +1 -0
  6. package/lib/browser/index.mjs.map +1 -0
  7. package/lib/core/{GraphQLHandler-da09c680.d.ts → GraphQLHandler-JB4bsrLF.d.ts} +4 -2
  8. package/lib/core/GraphQLHandler-mT-MmgeB.d.mts +99 -0
  9. package/lib/core/HttpResponse.d.mts +2 -0
  10. package/lib/core/HttpResponse.d.ts +1 -1
  11. package/lib/core/HttpResponse.js +1 -0
  12. package/lib/core/HttpResponse.js.map +1 -0
  13. package/lib/core/HttpResponse.mjs +1 -0
  14. package/lib/core/HttpResponse.mjs.map +1 -0
  15. package/lib/core/RequestHandler-YiqamK0M.d.mts +179 -0
  16. package/lib/core/{RequestHandler-25f9cfd1.d.ts → RequestHandler-rmY-HeFN.d.ts} +4 -4
  17. package/lib/core/SetupApi.d.mts +26 -0
  18. package/lib/core/SetupApi.d.ts +1 -1
  19. package/lib/core/SetupApi.js +1 -0
  20. package/lib/core/SetupApi.js.map +1 -0
  21. package/lib/core/SetupApi.mjs +1 -0
  22. package/lib/core/SetupApi.mjs.map +1 -0
  23. package/lib/core/bypass.d.mts +16 -0
  24. package/lib/core/bypass.d.ts +1 -1
  25. package/lib/core/bypass.js +1 -0
  26. package/lib/core/bypass.js.map +1 -0
  27. package/lib/core/bypass.mjs +1 -0
  28. package/lib/core/bypass.mjs.map +1 -0
  29. package/lib/core/delay.d.mts +18 -0
  30. package/lib/core/delay.d.ts +1 -1
  31. package/lib/core/delay.js +1 -0
  32. package/lib/core/delay.js.map +1 -0
  33. package/lib/core/delay.mjs +1 -0
  34. package/lib/core/delay.mjs.map +1 -0
  35. package/lib/core/graphql.d.mts +111 -0
  36. package/lib/core/graphql.d.ts +11 -9
  37. package/lib/core/graphql.js +1 -0
  38. package/lib/core/graphql.js.map +1 -0
  39. package/lib/core/graphql.mjs +1 -0
  40. package/lib/core/graphql.mjs.map +1 -0
  41. package/lib/core/handlers/GraphQLHandler.d.mts +5 -0
  42. package/lib/core/handlers/GraphQLHandler.d.ts +2 -2
  43. package/lib/core/handlers/GraphQLHandler.js +8 -6
  44. package/lib/core/handlers/GraphQLHandler.js.map +1 -0
  45. package/lib/core/handlers/GraphQLHandler.mjs +8 -6
  46. package/lib/core/handlers/GraphQLHandler.mjs.map +1 -0
  47. package/lib/core/handlers/HttpHandler.d.mts +62 -0
  48. package/lib/core/handlers/HttpHandler.d.ts +2 -2
  49. package/lib/core/handlers/HttpHandler.js +1 -0
  50. package/lib/core/handlers/HttpHandler.js.map +1 -0
  51. package/lib/core/handlers/HttpHandler.mjs +1 -0
  52. package/lib/core/handlers/HttpHandler.mjs.map +1 -0
  53. package/lib/core/handlers/RequestHandler.d.mts +2 -0
  54. package/lib/core/handlers/RequestHandler.d.ts +1 -1
  55. package/lib/core/handlers/RequestHandler.js +3 -2
  56. package/lib/core/handlers/RequestHandler.js.map +1 -0
  57. package/lib/core/handlers/RequestHandler.mjs +3 -2
  58. package/lib/core/handlers/RequestHandler.mjs.map +1 -0
  59. package/lib/core/http.d.mts +28 -0
  60. package/lib/core/http.d.ts +13 -11
  61. package/lib/core/http.js +1 -0
  62. package/lib/core/http.js.map +1 -0
  63. package/lib/core/http.mjs +1 -0
  64. package/lib/core/http.mjs.map +1 -0
  65. package/lib/core/index.d.mts +18 -0
  66. package/lib/core/index.d.ts +4 -4
  67. package/lib/core/index.js +1 -0
  68. package/lib/core/index.js.map +1 -0
  69. package/lib/core/index.mjs +1 -0
  70. package/lib/core/index.mjs.map +1 -0
  71. package/lib/core/passthrough.d.mts +17 -0
  72. package/lib/core/passthrough.js +1 -0
  73. package/lib/core/passthrough.js.map +1 -0
  74. package/lib/core/passthrough.mjs +1 -0
  75. package/lib/core/passthrough.mjs.map +1 -0
  76. package/lib/core/sharedOptions.d.mts +66 -0
  77. package/lib/core/sharedOptions.d.ts +2 -2
  78. package/lib/core/sharedOptions.js +1 -0
  79. package/lib/core/sharedOptions.js.map +1 -0
  80. package/lib/core/sharedOptions.mjs +1 -0
  81. package/lib/core/sharedOptions.mjs.map +1 -0
  82. package/lib/core/typeUtils.d.mts +7 -0
  83. package/lib/core/typeUtils.d.ts +1 -1
  84. package/lib/core/typeUtils.js +1 -0
  85. package/lib/core/typeUtils.js.map +1 -0
  86. package/lib/core/typeUtils.mjs +1 -0
  87. package/lib/core/typeUtils.mjs.map +1 -0
  88. package/lib/core/utils/HttpResponse/decorators.d.mts +12 -0
  89. package/lib/core/utils/HttpResponse/decorators.d.ts +2 -2
  90. package/lib/core/utils/HttpResponse/decorators.js +1 -0
  91. package/lib/core/utils/HttpResponse/decorators.js.map +1 -0
  92. package/lib/core/utils/HttpResponse/decorators.mjs +1 -0
  93. package/lib/core/utils/HttpResponse/decorators.mjs.map +1 -0
  94. package/lib/core/utils/getResponse.d.mts +2 -0
  95. package/lib/core/utils/getResponse.d.ts +1 -1
  96. package/lib/core/utils/getResponse.js +1 -0
  97. package/lib/core/utils/getResponse.js.map +1 -0
  98. package/lib/core/utils/getResponse.mjs +1 -0
  99. package/lib/core/utils/getResponse.mjs.map +1 -0
  100. package/lib/core/utils/handleRequest.d.mts +37 -0
  101. package/lib/core/utils/handleRequest.d.ts +2 -2
  102. package/lib/core/utils/handleRequest.js +1 -0
  103. package/lib/core/utils/handleRequest.js.map +1 -0
  104. package/lib/core/utils/handleRequest.mjs +1 -0
  105. package/lib/core/utils/handleRequest.mjs.map +1 -0
  106. package/lib/core/utils/internal/Disposable.d.mts +7 -0
  107. package/lib/core/utils/internal/Disposable.d.ts +1 -1
  108. package/lib/core/utils/internal/Disposable.js +1 -0
  109. package/lib/core/utils/internal/Disposable.js.map +1 -0
  110. package/lib/core/utils/internal/Disposable.mjs +1 -0
  111. package/lib/core/utils/internal/Disposable.mjs.map +1 -0
  112. package/lib/core/utils/internal/checkGlobals.d.mts +3 -0
  113. package/lib/core/utils/internal/checkGlobals.js +1 -0
  114. package/lib/core/utils/internal/checkGlobals.js.map +1 -0
  115. package/lib/core/utils/internal/checkGlobals.mjs +1 -0
  116. package/lib/core/utils/internal/checkGlobals.mjs.map +1 -0
  117. package/lib/core/utils/internal/devUtils.d.mts +19 -0
  118. package/lib/core/utils/internal/devUtils.js +1 -0
  119. package/lib/core/utils/internal/devUtils.js.map +1 -0
  120. package/lib/core/utils/internal/devUtils.mjs +1 -0
  121. package/lib/core/utils/internal/devUtils.mjs.map +1 -0
  122. package/lib/core/utils/internal/getCallFrame.d.mts +6 -0
  123. package/lib/core/utils/internal/getCallFrame.js +1 -0
  124. package/lib/core/utils/internal/getCallFrame.js.map +1 -0
  125. package/lib/core/utils/internal/getCallFrame.mjs +1 -0
  126. package/lib/core/utils/internal/getCallFrame.mjs.map +1 -0
  127. package/lib/core/utils/internal/isIterable.d.mts +6 -0
  128. package/lib/core/utils/internal/isIterable.js +1 -0
  129. package/lib/core/utils/internal/isIterable.js.map +1 -0
  130. package/lib/core/utils/internal/isIterable.mjs +1 -0
  131. package/lib/core/utils/internal/isIterable.mjs.map +1 -0
  132. package/lib/core/utils/internal/isObject.d.mts +6 -0
  133. package/lib/core/utils/internal/isObject.js +1 -0
  134. package/lib/core/utils/internal/isObject.js.map +1 -0
  135. package/lib/core/utils/internal/isObject.mjs +1 -0
  136. package/lib/core/utils/internal/isObject.mjs.map +1 -0
  137. package/lib/core/utils/internal/isStringEqual.d.mts +6 -0
  138. package/lib/core/utils/internal/isStringEqual.js +1 -0
  139. package/lib/core/utils/internal/isStringEqual.js.map +1 -0
  140. package/lib/core/utils/internal/isStringEqual.mjs +1 -0
  141. package/lib/core/utils/internal/isStringEqual.mjs.map +1 -0
  142. package/lib/core/utils/internal/jsonParse.d.mts +7 -0
  143. package/lib/core/utils/internal/jsonParse.js +1 -0
  144. package/lib/core/utils/internal/jsonParse.js.map +1 -0
  145. package/lib/core/utils/internal/jsonParse.mjs +1 -0
  146. package/lib/core/utils/internal/jsonParse.mjs.map +1 -0
  147. package/lib/core/utils/internal/mergeRight.d.mts +7 -0
  148. package/lib/core/utils/internal/mergeRight.js +1 -0
  149. package/lib/core/utils/internal/mergeRight.js.map +1 -0
  150. package/lib/core/utils/internal/mergeRight.mjs +1 -0
  151. package/lib/core/utils/internal/mergeRight.mjs.map +1 -0
  152. package/lib/core/utils/internal/parseGraphQLRequest.d.mts +5 -0
  153. package/lib/core/utils/internal/parseGraphQLRequest.d.ts +2 -2
  154. package/lib/core/utils/internal/parseGraphQLRequest.js +1 -0
  155. package/lib/core/utils/internal/parseGraphQLRequest.js.map +1 -0
  156. package/lib/core/utils/internal/parseGraphQLRequest.mjs +1 -0
  157. package/lib/core/utils/internal/parseGraphQLRequest.mjs.map +1 -0
  158. package/lib/core/utils/internal/parseMultipartData.d.mts +10 -0
  159. package/lib/core/utils/internal/parseMultipartData.d.ts +1 -1
  160. package/lib/core/utils/internal/parseMultipartData.js +1 -0
  161. package/lib/core/utils/internal/parseMultipartData.js.map +1 -0
  162. package/lib/core/utils/internal/parseMultipartData.mjs +1 -0
  163. package/lib/core/utils/internal/parseMultipartData.mjs.map +1 -0
  164. package/lib/core/utils/internal/pipeEvents.d.mts +8 -0
  165. package/lib/core/utils/internal/pipeEvents.js +1 -0
  166. package/lib/core/utils/internal/pipeEvents.js.map +1 -0
  167. package/lib/core/utils/internal/pipeEvents.mjs +1 -0
  168. package/lib/core/utils/internal/pipeEvents.mjs.map +1 -0
  169. package/lib/core/utils/internal/requestHandlerUtils.d.mts +8 -0
  170. package/lib/core/utils/internal/requestHandlerUtils.d.ts +1 -1
  171. package/lib/core/utils/internal/requestHandlerUtils.js +1 -0
  172. package/lib/core/utils/internal/requestHandlerUtils.js.map +1 -0
  173. package/lib/core/utils/internal/requestHandlerUtils.mjs +1 -0
  174. package/lib/core/utils/internal/requestHandlerUtils.mjs.map +1 -0
  175. package/lib/core/utils/internal/toReadonlyArray.d.mts +6 -0
  176. package/lib/core/utils/internal/toReadonlyArray.js +1 -0
  177. package/lib/core/utils/internal/toReadonlyArray.js.map +1 -0
  178. package/lib/core/utils/internal/toReadonlyArray.mjs +1 -0
  179. package/lib/core/utils/internal/toReadonlyArray.mjs.map +1 -0
  180. package/lib/core/utils/internal/tryCatch.d.mts +3 -0
  181. package/lib/core/utils/internal/tryCatch.js +1 -0
  182. package/lib/core/utils/internal/tryCatch.js.map +1 -0
  183. package/lib/core/utils/internal/tryCatch.mjs +1 -0
  184. package/lib/core/utils/internal/tryCatch.mjs.map +1 -0
  185. package/lib/core/utils/internal/uuidv4.d.mts +3 -0
  186. package/lib/core/utils/internal/uuidv4.js +1 -0
  187. package/lib/core/utils/internal/uuidv4.js.map +1 -0
  188. package/lib/core/utils/internal/uuidv4.mjs +1 -0
  189. package/lib/core/utils/internal/uuidv4.mjs.map +1 -0
  190. package/lib/core/utils/logging/getStatusCodeColor.d.mts +11 -0
  191. package/lib/core/utils/logging/getStatusCodeColor.js +1 -0
  192. package/lib/core/utils/logging/getStatusCodeColor.js.map +1 -0
  193. package/lib/core/utils/logging/getStatusCodeColor.mjs +1 -0
  194. package/lib/core/utils/logging/getStatusCodeColor.mjs.map +1 -0
  195. package/lib/core/utils/logging/getTimestamp.d.mts +6 -0
  196. package/lib/core/utils/logging/getTimestamp.js +1 -0
  197. package/lib/core/utils/logging/getTimestamp.js.map +1 -0
  198. package/lib/core/utils/logging/getTimestamp.mjs +1 -0
  199. package/lib/core/utils/logging/getTimestamp.mjs.map +1 -0
  200. package/lib/core/utils/logging/serializeRequest.d.mts +12 -0
  201. package/lib/core/utils/logging/serializeRequest.d.ts +1 -1
  202. package/lib/core/utils/logging/serializeRequest.js +1 -0
  203. package/lib/core/utils/logging/serializeRequest.js.map +1 -0
  204. package/lib/core/utils/logging/serializeRequest.mjs +1 -0
  205. package/lib/core/utils/logging/serializeRequest.mjs.map +1 -0
  206. package/lib/core/utils/logging/serializeResponse.d.mts +9 -0
  207. package/lib/core/utils/logging/serializeResponse.d.ts +1 -1
  208. package/lib/core/utils/logging/serializeResponse.js +1 -0
  209. package/lib/core/utils/logging/serializeResponse.js.map +1 -0
  210. package/lib/core/utils/logging/serializeResponse.mjs +1 -0
  211. package/lib/core/utils/logging/serializeResponse.mjs.map +1 -0
  212. package/lib/core/utils/matching/matchRequestUrl.d.mts +19 -0
  213. package/lib/core/utils/matching/matchRequestUrl.d.ts +1 -1
  214. package/lib/core/utils/matching/matchRequestUrl.js +1 -0
  215. package/lib/core/utils/matching/matchRequestUrl.js.map +1 -0
  216. package/lib/core/utils/matching/matchRequestUrl.mjs +1 -0
  217. package/lib/core/utils/matching/matchRequestUrl.mjs.map +1 -0
  218. package/lib/core/utils/matching/normalizePath.d.mts +12 -0
  219. package/lib/core/utils/matching/normalizePath.js +1 -0
  220. package/lib/core/utils/matching/normalizePath.js.map +1 -0
  221. package/lib/core/utils/matching/normalizePath.mjs +1 -0
  222. package/lib/core/utils/matching/normalizePath.mjs.map +1 -0
  223. package/lib/core/utils/request/getPublicUrlFromRequest.d.mts +7 -0
  224. package/lib/core/utils/request/getPublicUrlFromRequest.js +1 -0
  225. package/lib/core/utils/request/getPublicUrlFromRequest.js.map +1 -0
  226. package/lib/core/utils/request/getPublicUrlFromRequest.mjs +1 -0
  227. package/lib/core/utils/request/getPublicUrlFromRequest.mjs.map +1 -0
  228. package/lib/core/utils/request/getRequestCookies.d.mts +8 -0
  229. package/lib/core/utils/request/getRequestCookies.js +1 -0
  230. package/lib/core/utils/request/getRequestCookies.js.map +1 -0
  231. package/lib/core/utils/request/getRequestCookies.mjs +1 -0
  232. package/lib/core/utils/request/getRequestCookies.mjs.map +1 -0
  233. package/lib/core/utils/request/onUnhandledRequest.d.mts +12 -0
  234. package/lib/core/utils/request/onUnhandledRequest.d.ts +2 -2
  235. package/lib/core/utils/request/onUnhandledRequest.js +1 -0
  236. package/lib/core/utils/request/onUnhandledRequest.js.map +1 -0
  237. package/lib/core/utils/request/onUnhandledRequest.mjs +1 -0
  238. package/lib/core/utils/request/onUnhandledRequest.mjs.map +1 -0
  239. package/lib/core/utils/request/readResponseCookies.d.mts +3 -0
  240. package/lib/core/utils/request/readResponseCookies.js +1 -0
  241. package/lib/core/utils/request/readResponseCookies.js.map +1 -0
  242. package/lib/core/utils/request/readResponseCookies.mjs +1 -0
  243. package/lib/core/utils/request/readResponseCookies.mjs.map +1 -0
  244. package/lib/core/utils/toResponseInit.d.mts +3 -0
  245. package/lib/core/utils/toResponseInit.js +1 -0
  246. package/lib/core/utils/toResponseInit.js.map +1 -0
  247. package/lib/core/utils/toResponseInit.mjs +1 -0
  248. package/lib/core/utils/toResponseInit.mjs.map +1 -0
  249. package/lib/core/utils/url/cleanUrl.d.mts +7 -0
  250. package/lib/core/utils/url/cleanUrl.js +1 -0
  251. package/lib/core/utils/url/cleanUrl.js.map +1 -0
  252. package/lib/core/utils/url/cleanUrl.mjs +1 -0
  253. package/lib/core/utils/url/cleanUrl.mjs.map +1 -0
  254. package/lib/core/utils/url/getAbsoluteUrl.d.mts +6 -0
  255. package/lib/core/utils/url/getAbsoluteUrl.js +1 -0
  256. package/lib/core/utils/url/getAbsoluteUrl.js.map +1 -0
  257. package/lib/core/utils/url/getAbsoluteUrl.mjs +1 -0
  258. package/lib/core/utils/url/getAbsoluteUrl.mjs.map +1 -0
  259. package/lib/core/utils/url/isAbsoluteUrl.d.mts +6 -0
  260. package/lib/core/utils/url/isAbsoluteUrl.js +1 -0
  261. package/lib/core/utils/url/isAbsoluteUrl.js.map +1 -0
  262. package/lib/core/utils/url/isAbsoluteUrl.mjs +1 -0
  263. package/lib/core/utils/url/isAbsoluteUrl.mjs.map +1 -0
  264. package/lib/iife/index.js +25 -23
  265. package/lib/iife/index.js.map +1 -0
  266. package/lib/mockServiceWorker.js +1 -1
  267. package/lib/native/index.d.mts +75 -0
  268. package/lib/native/index.js +1 -0
  269. package/lib/native/index.js.map +1 -0
  270. package/lib/native/index.mjs +1 -0
  271. package/lib/native/index.mjs.map +1 -0
  272. package/lib/node/index.d.mts +75 -0
  273. package/lib/node/index.d.ts +1 -1
  274. package/lib/node/index.js +1 -0
  275. package/lib/node/index.js.map +1 -0
  276. package/lib/node/index.mjs +1 -0
  277. package/lib/node/index.mjs.map +1 -0
  278. package/package.json +5 -4
  279. package/src/browser/global.browser.d.ts +1 -0
  280. package/src/browser/index.ts +3 -0
  281. package/src/browser/setupWorker/glossary.ts +259 -0
  282. package/src/browser/setupWorker/setupWorker.node.test.ts +10 -0
  283. package/src/browser/setupWorker/setupWorker.ts +199 -0
  284. package/src/browser/setupWorker/start/createFallbackRequestListener.ts +67 -0
  285. package/src/browser/setupWorker/start/createFallbackStart.ts +21 -0
  286. package/src/browser/setupWorker/start/createRequestListener.ts +127 -0
  287. package/src/browser/setupWorker/start/createResponseListener.ts +58 -0
  288. package/src/browser/setupWorker/start/createStartHandler.ts +143 -0
  289. package/src/browser/setupWorker/start/utils/createMessageChannel.ts +32 -0
  290. package/src/browser/setupWorker/start/utils/enableMocking.ts +32 -0
  291. package/src/browser/setupWorker/start/utils/getWorkerByRegistration.ts +25 -0
  292. package/src/browser/setupWorker/start/utils/getWorkerInstance.ts +94 -0
  293. package/src/browser/setupWorker/start/utils/prepareStartHandler.test.ts +59 -0
  294. package/src/browser/setupWorker/start/utils/prepareStartHandler.ts +44 -0
  295. package/src/browser/setupWorker/start/utils/printStartMessage.test.ts +84 -0
  296. package/src/browser/setupWorker/start/utils/printStartMessage.ts +40 -0
  297. package/src/browser/setupWorker/start/utils/validateWorkerScope.ts +18 -0
  298. package/src/browser/setupWorker/stop/createFallbackStop.ts +11 -0
  299. package/src/browser/setupWorker/stop/createStop.ts +29 -0
  300. package/src/browser/setupWorker/stop/utils/printStopMessage.test.ts +26 -0
  301. package/src/browser/setupWorker/stop/utils/printStopMessage.ts +12 -0
  302. package/src/browser/tsconfig.browser.build.json +6 -0
  303. package/src/browser/tsconfig.browser.json +9 -0
  304. package/src/browser/utils/deferNetworkRequestsUntil.test.ts +48 -0
  305. package/src/browser/utils/deferNetworkRequestsUntil.ts +29 -0
  306. package/src/browser/utils/getAbsoluteWorkerUrl.test.ts +31 -0
  307. package/src/browser/utils/getAbsoluteWorkerUrl.ts +7 -0
  308. package/src/browser/utils/parseWorkerRequest.ts +15 -0
  309. package/src/browser/utils/pruneGetRequestBody.test.ts +53 -0
  310. package/src/browser/utils/pruneGetRequestBody.ts +21 -0
  311. package/src/browser/utils/requestIntegrityCheck.ts +23 -0
  312. package/src/browser/utils/supportsReadableStreamTransfer.ts +17 -0
  313. package/src/core/HttpResponse.test.ts +200 -0
  314. package/src/core/HttpResponse.ts +134 -0
  315. package/src/core/SetupApi.ts +95 -0
  316. package/src/core/bypass.test.ts +47 -0
  317. package/src/core/bypass.ts +36 -0
  318. package/src/core/delay.ts +70 -0
  319. package/src/core/graphql.test.ts +11 -0
  320. package/src/core/graphql.ts +146 -0
  321. package/src/core/handlers/GraphQLHandler.test.ts +835 -0
  322. package/src/core/handlers/GraphQLHandler.ts +266 -0
  323. package/src/core/handlers/HttpHandler.test.ts +218 -0
  324. package/src/core/handlers/HttpHandler.ts +169 -0
  325. package/src/core/handlers/RequestHandler.ts +343 -0
  326. package/src/core/http.test.ts +15 -0
  327. package/src/core/http.ts +64 -0
  328. package/src/core/index.ts +59 -0
  329. package/src/core/passthrough.test.ts +13 -0
  330. package/src/core/passthrough.ts +23 -0
  331. package/src/core/sharedOptions.ts +66 -0
  332. package/src/core/typeUtils.ts +20 -0
  333. package/src/core/utils/HttpResponse/decorators.ts +56 -0
  334. package/src/core/utils/getResponse.ts +55 -0
  335. package/src/core/utils/handleRequest.test.ts +554 -0
  336. package/src/core/utils/handleRequest.ts +132 -0
  337. package/src/core/utils/internal/Disposable.ts +9 -0
  338. package/src/core/utils/internal/checkGlobals.ts +17 -0
  339. package/src/core/utils/internal/devUtils.ts +31 -0
  340. package/src/core/utils/internal/getCallFrame.test.ts +154 -0
  341. package/src/core/utils/internal/getCallFrame.ts +35 -0
  342. package/src/core/utils/internal/isIterable.test.ts +23 -0
  343. package/src/core/utils/internal/isIterable.ts +12 -0
  344. package/src/core/utils/internal/isObject.test.ts +20 -0
  345. package/src/core/utils/internal/isObject.ts +6 -0
  346. package/src/core/utils/internal/isStringEqual.test.ts +45 -0
  347. package/src/core/utils/internal/isStringEqual.ts +6 -0
  348. package/src/core/utils/internal/jsonParse.test.ts +13 -0
  349. package/src/core/utils/internal/jsonParse.ts +13 -0
  350. package/src/core/utils/internal/mergeRight.test.ts +43 -0
  351. package/src/core/utils/internal/mergeRight.ts +27 -0
  352. package/src/core/utils/internal/parseGraphQLRequest.test.ts +99 -0
  353. package/src/core/utils/internal/parseGraphQLRequest.ts +205 -0
  354. package/src/core/utils/internal/parseMultipartData.test.ts +76 -0
  355. package/src/core/utils/internal/parseMultipartData.ts +104 -0
  356. package/src/core/utils/internal/pipeEvents.test.ts +14 -0
  357. package/src/core/utils/internal/pipeEvents.ts +25 -0
  358. package/src/core/utils/internal/requestHandlerUtils.ts +21 -0
  359. package/src/core/utils/internal/toReadonlyArray.test.ts +30 -0
  360. package/src/core/utils/internal/toReadonlyArray.ts +8 -0
  361. package/src/core/utils/internal/tryCatch.test.ts +29 -0
  362. package/src/core/utils/internal/tryCatch.ts +11 -0
  363. package/src/core/utils/internal/uuidv4.ts +3 -0
  364. package/src/core/utils/logging/getStatusCodeColor.test.ts +22 -0
  365. package/src/core/utils/logging/getStatusCodeColor.ts +20 -0
  366. package/src/core/utils/logging/getTimestamp.test.ts +18 -0
  367. package/src/core/utils/logging/getTimestamp.ts +12 -0
  368. package/src/core/utils/logging/serializeRequest.test.ts +23 -0
  369. package/src/core/utils/logging/serializeRequest.ts +23 -0
  370. package/src/core/utils/logging/serializeResponse.test.ts +77 -0
  371. package/src/core/utils/logging/serializeResponse.ts +31 -0
  372. package/src/core/utils/matching/matchRequestUrl.test.ts +114 -0
  373. package/src/core/utils/matching/matchRequestUrl.ts +73 -0
  374. package/src/core/utils/matching/normalizePath.node.test.ts +44 -0
  375. package/src/core/utils/matching/normalizePath.test.ts +50 -0
  376. package/src/core/utils/matching/normalizePath.ts +21 -0
  377. package/src/core/utils/request/getPublicUrlFromRequest.test.ts +26 -0
  378. package/src/core/utils/request/getPublicUrlFromRequest.ts +15 -0
  379. package/src/core/utils/request/getRequestCookies.node.test.ts +29 -0
  380. package/src/core/utils/request/getRequestCookies.test.ts +64 -0
  381. package/src/core/utils/request/getRequestCookies.ts +75 -0
  382. package/src/core/utils/request/onUnhandledRequest.test.ts +215 -0
  383. package/src/core/utils/request/onUnhandledRequest.ts +247 -0
  384. package/src/core/utils/request/readResponseCookies.ts +9 -0
  385. package/src/core/utils/toResponseInit.ts +7 -0
  386. package/src/core/utils/url/cleanUrl.test.ts +17 -0
  387. package/src/core/utils/url/cleanUrl.ts +12 -0
  388. package/src/core/utils/url/getAbsoluteUrl.node.test.ts +19 -0
  389. package/src/core/utils/url/getAbsoluteUrl.test.ts +29 -0
  390. package/src/core/utils/url/getAbsoluteUrl.ts +26 -0
  391. package/src/core/utils/url/isAbsoluteUrl.test.ts +32 -0
  392. package/src/core/utils/url/isAbsoluteUrl.ts +6 -0
  393. package/src/iife/index.ts +2 -0
  394. package/src/mockServiceWorker.js +287 -0
  395. package/src/native/index.ts +17 -0
  396. package/src/node/SetupServerApi.ts +113 -0
  397. package/src/node/glossary.ts +62 -0
  398. package/src/node/index.ts +3 -0
  399. package/src/node/setupServer.ts +21 -0
  400. package/src/node/utils/isNodeExceptionLike.ts +14 -0
  401. package/src/tsconfig.core.build.json +6 -0
  402. package/src/tsconfig.node.build.json +6 -0
  403. package/src/tsconfig.node.json +8 -0
  404. package/src/tsconfig.src.json +15 -0
@@ -0,0 +1,132 @@
1
+ import { until } from '@open-draft/until'
2
+ import { Emitter } from 'strict-event-emitter'
3
+ import { RequestHandler } from '../handlers/RequestHandler'
4
+ import { LifeCycleEventsMap, SharedOptions } from '../sharedOptions'
5
+ import { RequiredDeep } from '../typeUtils'
6
+ import { ResponseLookupResult, getResponse } from './getResponse'
7
+ import { onUnhandledRequest } from './request/onUnhandledRequest'
8
+ import { readResponseCookies } from './request/readResponseCookies'
9
+
10
+ export interface HandleRequestOptions {
11
+ /**
12
+ * `resolutionContext` is not part of the general public api
13
+ * but is exposed to aid in creating extensions like
14
+ * `@mswjs/http-middleware`.
15
+ */
16
+ resolutionContext?: {
17
+ /**
18
+ * A base url to use when resolving relative urls.
19
+ * @note This is primarily used by the `@mswjs/http-middleware`
20
+ * to resolve relative urls in the context of the running server
21
+ */
22
+ baseUrl?: string
23
+ }
24
+
25
+ /**
26
+ * Transforms a `MockedResponse` instance returned from a handler
27
+ * to a response instance supported by the lower tooling (i.e. interceptors).
28
+ */
29
+ transformResponse?(response: Response): Response
30
+
31
+ /**
32
+ * Invoked whenever a request is performed as-is.
33
+ */
34
+ onPassthroughResponse?(request: Request): void
35
+
36
+ /**
37
+ * Invoked when the mocked response is ready to be sent.
38
+ */
39
+ onMockedResponse?(
40
+ response: Response,
41
+ handler: RequiredDeep<ResponseLookupResult>,
42
+ ): void
43
+ }
44
+
45
+ export async function handleRequest(
46
+ request: Request,
47
+ requestId: string,
48
+ handlers: Array<RequestHandler>,
49
+ options: RequiredDeep<SharedOptions>,
50
+ emitter: Emitter<LifeCycleEventsMap>,
51
+ handleRequestOptions?: HandleRequestOptions,
52
+ ): Promise<Response | undefined> {
53
+ emitter.emit('request:start', { request, requestId })
54
+
55
+ // Perform bypassed requests (i.e. issued via "ctx.fetch") as-is.
56
+ if (request.headers.get('x-msw-intention') === 'bypass') {
57
+ emitter.emit('request:end', { request, requestId })
58
+ handleRequestOptions?.onPassthroughResponse?.(request)
59
+ return
60
+ }
61
+
62
+ // Resolve a mocked response from the list of request handlers.
63
+ const lookupResult = await until(() => {
64
+ return getResponse(
65
+ request,
66
+ handlers,
67
+ handleRequestOptions?.resolutionContext,
68
+ )
69
+ })
70
+
71
+ if (lookupResult.error) {
72
+ // Allow developers to react to unhandled exceptions in request handlers.
73
+ emitter.emit('unhandledException', {
74
+ error: lookupResult.error,
75
+ request,
76
+ requestId,
77
+ })
78
+ throw lookupResult.error
79
+ }
80
+
81
+ // If the handler lookup returned nothing, no request handler was found
82
+ // matching this request. Report the request as unhandled.
83
+ if (!lookupResult.data) {
84
+ await onUnhandledRequest(request, handlers, options.onUnhandledRequest)
85
+ emitter.emit('request:unhandled', { request, requestId })
86
+ emitter.emit('request:end', { request, requestId })
87
+ handleRequestOptions?.onPassthroughResponse?.(request)
88
+ return
89
+ }
90
+
91
+ const { response } = lookupResult.data
92
+
93
+ // When the handled request returned no mocked response, warn the developer,
94
+ // as it may be an oversight on their part. Perform the request as-is.
95
+ if (!response) {
96
+ emitter.emit('request:end', { request, requestId })
97
+ handleRequestOptions?.onPassthroughResponse?.(request)
98
+ return
99
+ }
100
+
101
+ // Perform the request as-is when the developer explicitly returned "req.passthrough()".
102
+ // This produces no warning as the request was handled.
103
+ if (
104
+ response.status === 302 &&
105
+ response.headers.get('x-msw-intention') === 'passthrough'
106
+ ) {
107
+ emitter.emit('request:end', { request, requestId })
108
+ handleRequestOptions?.onPassthroughResponse?.(request)
109
+ return
110
+ }
111
+
112
+ // Store all the received response cookies in the virtual cookie store.
113
+ readResponseCookies(request, response)
114
+
115
+ emitter.emit('request:match', { request, requestId })
116
+
117
+ const requiredLookupResult =
118
+ lookupResult.data as RequiredDeep<ResponseLookupResult>
119
+
120
+ const transformedResponse =
121
+ handleRequestOptions?.transformResponse?.(response) ||
122
+ (response as any as Response)
123
+
124
+ handleRequestOptions?.onMockedResponse?.(
125
+ transformedResponse,
126
+ requiredLookupResult,
127
+ )
128
+
129
+ emitter.emit('request:end', { request, requestId })
130
+
131
+ return transformedResponse
132
+ }
@@ -0,0 +1,9 @@
1
+ export type DisposableSubscription = () => Promise<void> | void
2
+
3
+ export class Disposable {
4
+ protected subscriptions: Array<DisposableSubscription> = []
5
+
6
+ public async dispose() {
7
+ await Promise.all(this.subscriptions.map((subscription) => subscription()))
8
+ }
9
+ }
@@ -0,0 +1,17 @@
1
+ import { invariant } from 'outvariant'
2
+ import { devUtils } from './devUtils'
3
+
4
+ export function checkGlobals() {
5
+ /**
6
+ * MSW expects the "URL" constructor to be defined.
7
+ * It's not present in React Native so suggest a polyfill
8
+ * instead of failing silently.
9
+ * @see https://github.com/mswjs/msw/issues/1408
10
+ */
11
+ invariant(
12
+ typeof URL !== 'undefined',
13
+ devUtils.formatMessage(
14
+ `Global "URL" class is not defined. This likely means that you're running MSW in an environment that doesn't support all Node.js standard API (e.g. React Native). If that's the case, please use an appropriate polyfill for the "URL" class, like "react-native-url-polyfill".`,
15
+ ),
16
+ )
17
+ }
@@ -0,0 +1,31 @@
1
+ import { format } from 'outvariant'
2
+
3
+ const LIBRARY_PREFIX = '[MSW]'
4
+
5
+ /**
6
+ * Formats a given message by appending the library's prefix string.
7
+ */
8
+ function formatMessage(message: string, ...positionals: any[]): string {
9
+ const interpolatedMessage = format(message, ...positionals)
10
+ return `${LIBRARY_PREFIX} ${interpolatedMessage}`
11
+ }
12
+
13
+ /**
14
+ * Prints a library-specific warning.
15
+ */
16
+ function warn(message: string, ...positionals: any[]): void {
17
+ console.warn(formatMessage(message, ...positionals))
18
+ }
19
+
20
+ /**
21
+ * Prints a library-specific error.
22
+ */
23
+ function error(message: string, ...positionals: any[]): void {
24
+ console.error(formatMessage(message, ...positionals))
25
+ }
26
+
27
+ export const devUtils = {
28
+ formatMessage,
29
+ warn,
30
+ error,
31
+ }
@@ -0,0 +1,154 @@
1
+ /**
2
+ * @vitest-environment jsdom
3
+ */
4
+ import { getCallFrame } from './getCallFrame'
5
+
6
+ class ErrorWithStack extends Error {
7
+ constructor(stack: string[] | undefined | null) {
8
+ super('')
9
+ this.stack = stack?.join('\n')
10
+ }
11
+ }
12
+
13
+ test('supports Node.js (Linux, MacOS) error stack', () => {
14
+ const linuxError = new ErrorWithStack([
15
+ 'Error: ',
16
+ ' at getCallFrame (/Users/mock/github/msw/lib/node/index.js:3735:22)',
17
+ ' at Object.get (/Users/mock/github/msw/lib/node/index.js:3776:29)',
18
+ ' at Object.<anonymous> (/Users/mock/github/msw/test/msw-api/setup-server/listHandlers.test.ts:13:8)', // <-- this one
19
+ ' at Runtime._execModule (/Users/mock/github/msw/node_modules/jest-runtime/build/index.js:1299:24)',
20
+ ' at Runtime._loadModule (/Users/mock/github/msw/node_modules/jest-runtime/build/index.js:898:12)',
21
+ ' at Runtime.requireModule (/Users/mock/github/msw/node_modules/jest-runtime/build/index.js:746:10)',
22
+ ' at jasmine2 (/Users/mock/github/msw/node_modules/jest-jasmine2/build/index.js:230:13)',
23
+ ' at runTestInternal (/Users/mock/github/msw/node_modules/jest-runner/build/runTest.js:380:22)',
24
+ ' at runTest (/Users/mock/github/msw/node_modules/jest-runner/build/runTest.js:472:34)',
25
+ ])
26
+ expect(getCallFrame(linuxError)).toEqual(
27
+ '/Users/mock/github/msw/test/msw-api/setup-server/listHandlers.test.ts:13:8',
28
+ )
29
+
30
+ const macOsError = new ErrorWithStack([
31
+ 'Error: ',
32
+ ' at getCallFrame (/Users/mock/git/msw/lib/node/index.js:3735:22)',
33
+ ' at graphQLRequestHandler (/Users/mock/git/msw/lib/node/index.js:7071:25)',
34
+ ' at Object.query (/Users/mock/git/msw/lib/node/index.js:7182:18)',
35
+ ' at Object.<anonymous> (/Users/mock/git/msw/test/msw-api/setup-server/listHandlers.test.ts:14:11)', // <-- this one
36
+ ' at Runtime._execModule (/Users/mock/git/msw/node_modules/jest-runtime/build/index.js:1299:24)',
37
+ ' at Runtime._loadModule (/Users/mock/git/msw/node_modules/jest-runtime/build/index.js:898:12)',
38
+ ' at Runtime.requireModule (/Users/mock/git/msw/node_modules/jest-runtime/build/index.js:746:10)',
39
+ ' at jasmine2 (/Users/mock/git/msw/node_modules/jest-jasmine2/build/index.js:230:13)',
40
+ ' at runTestInternal (/Users/mock/git/msw/node_modules/jest-runner/build/runTest.js:380:22)',
41
+ ' at runTest (/Users/mock/git/msw/node_modules/jest-runner/build/runTest.js:472:34)',
42
+ ])
43
+
44
+ expect(getCallFrame(macOsError)).toEqual(
45
+ '/Users/mock/git/msw/test/msw-api/setup-server/listHandlers.test.ts:14:11',
46
+ )
47
+ })
48
+
49
+ test('supports Node.js (Windows) error stack', () => {
50
+ const error = new ErrorWithStack([
51
+ 'Error: ',
52
+ ' at getCallFrame (C:\\Users\\mock\\git\\msw\\lib\\node\\index.js:3735:22)',
53
+ ' at graphQLRequestHandler (C:\\Users\\mock\\git\\msw\\lib\\node\\index.js:7071:25)',
54
+ ' at Object.query (C:\\Users\\mock\\git\\msw\\lib\\node\\index.js:7182:18)',
55
+ ' at Object.<anonymous> (C:\\Users\\mock\\git\\msw\\test\\msw-api\\setup-server\\listHandlers.test.ts:75:13)', // <-- this one
56
+ ' at Object.asyncJestTest (C:\\Users\\mock\\git\\msw\\node_modules\\jest-jasmine2\\build\\jasmineAsyncInstall.js:106:37)',
57
+ ' at C:\\Users\\mock\\git\\msw\\node_modules\\jest-jasmine2\\build\\queueRunner.js:45:12',
58
+ ' at new Promise (<anonymous>)',
59
+ ' at mapper (C:\\Users\\mock\\git\\msw\\node_modules\\jest-jasmine2\\build\\queueRunner.js:28:19)',
60
+ ' at C:\\Users\\mock\\git\\msw\\node_modules\\jest-jasmine2\\build\\queueRunner.js:75:41',
61
+ ])
62
+
63
+ expect(getCallFrame(error)).toBe(
64
+ 'C:\\Users\\mock\\git\\msw\\test\\msw-api\\setup-server\\listHandlers.test.ts:75:13',
65
+ )
66
+ })
67
+
68
+ test('supports Chrome and Edge error stack', () => {
69
+ const error = new ErrorWithStack([
70
+ 'Error',
71
+ ' at getCallFrame (webpack:///./lib/browser/getCallFrame-deps.js?:272:20)',
72
+ ' at Object.eval [as get] (webpack:///./lib/browser/rest-deps.js?:1402:90)',
73
+ ' at eval (webpack:///./test/msw-api/setup-worker/listHandlers.mocks.ts?:6:113)', // <-- this one
74
+ ' at Module../test/msw-api/setup-worker/listHandlers.mocks.ts (http://localhost:59464/main.js:1376:1)',
75
+ ' at __webpack_require__ (http://localhost:59464/main.js:790:30)',
76
+ ' at fn (http://localhost:59464/main.js:101:20)',
77
+ ' at eval (webpack:///multi_(webpack)-dev-server/client?:4:18)',
78
+ ' at Object.0 (http://localhost:59464/main.js:1399:1)',
79
+ ' at __webpack_require__ (http://localhost:59464/main.js:790:30)',
80
+ ' at http://localhost:59464/main.js:857:37',
81
+ ])
82
+
83
+ expect(getCallFrame(error)).toBe(
84
+ 'webpack:///./test/msw-api/setup-worker/listHandlers.mocks.ts?:6:113',
85
+ )
86
+ })
87
+
88
+ test('supports Firefox (MacOS, Windows) error stack', () => {
89
+ const error = new ErrorWithStack([
90
+ 'getCallFrame@webpack:///./lib/browser/getCallFrame-deps.js?:272:20',
91
+ 'createRestHandler/<@webpack:///./lib/browser/rest-deps.js?:1402:90',
92
+ '@webpack:///./test/msw-api/setup-worker/listHandlers.mocks.ts?:6:113', // <-- this one
93
+ './test/msw-api/setup-worker/listHandlers.mocks.ts@http://localhost:59464/main.js:1376:1',
94
+ '__webpack_require__@http://localhost:59464/main.js:790:30',
95
+ 'fn@http://localhost:59464/main.js:101:20',
96
+ '@webpack:///multi_(webpack)-dev-server/client?:4:18',
97
+ '0@http://localhost:59464/main.js:1399:1',
98
+ '__webpack_require__@http://localhost:59464/main.js:790:30',
99
+ '@http://localhost:59464/main.js:857:37',
100
+ ])
101
+
102
+ expect(getCallFrame(error)).toBe(
103
+ 'webpack:///./test/msw-api/setup-worker/listHandlers.mocks.ts?:6:113',
104
+ )
105
+ })
106
+
107
+ test('supports Safari (MacOS) error stack', () => {
108
+ const errorOne = new ErrorWithStack([
109
+ 'getCallFrame',
110
+ '',
111
+ 'eval code',
112
+ 'eval@[native code]',
113
+ './test/msw-api/setup-worker/listHandlers.mocks.ts@http://localhost:59464/main.js:1376:5', // <-- this one
114
+ '__webpack_require__@http://localhost:59464/main.js:790:34',
115
+ 'fn@http://localhost:59464/main.js:101:39',
116
+ 'eval code',
117
+ 'eval@[native code]',
118
+ 'http://localhost:59464/main.js:1399:5',
119
+ '__webpack_require__@http://localhost:59464/main.js:790:34',
120
+ 'http://localhost:59464/main.js:857:37',
121
+ 'global code@http://localhost:59464/main.js:858:12',
122
+ ])
123
+
124
+ expect(getCallFrame(errorOne)).toBe(
125
+ './test/msw-api/setup-worker/listHandlers.mocks.ts@http://localhost:59464/main.js:1376:5',
126
+ )
127
+
128
+ const errorTwo = new ErrorWithStack([
129
+ 'getCallFrame',
130
+ 'graphQLRequestHandler',
131
+ 'eval code',
132
+ 'eval@[native code]',
133
+ './test/msw-api/setup-worker/listHandlers.mocks.ts@http://localhost:56460/main.js:1376:5', // <-- this one
134
+ '__webpack_require__@http://localhost:56460/main.js:790:34',
135
+ 'fn@http://localhost:56460/main.js:101:39',
136
+ 'eval code',
137
+ 'eval@[native code]',
138
+ 'http://localhost:56460/main.js:1399:5',
139
+ '__webpack_require__@http://localhost:56460/main.js:790:34',
140
+ 'http://localhost:56460/main.js:857:37',
141
+ 'global code@http://localhost:56460/main.js:858:12',
142
+ ])
143
+
144
+ expect(getCallFrame(errorTwo)).toBe(
145
+ './test/msw-api/setup-worker/listHandlers.mocks.ts@http://localhost:56460/main.js:1376:5',
146
+ )
147
+ })
148
+
149
+ test('handles the undefined stack trace', () => {
150
+ expect(() => getCallFrame(new ErrorWithStack(undefined))).not.toThrow(
151
+ TypeError,
152
+ )
153
+ expect(() => getCallFrame(new ErrorWithStack(null))).not.toThrow(TypeError)
154
+ })
@@ -0,0 +1,35 @@
1
+ // Ignore the source files traces for local testing.
2
+ const SOURCE_FRAME = /[\/\\]msw[\/\\]src[\/\\](.+)/
3
+
4
+ const BUILD_FRAME =
5
+ /(node_modules)?[\/\\]lib[\/\\](core|browser|node|native|iife)[\/\\]|^[^\/\\]*$/
6
+
7
+ /**
8
+ * Return the stack trace frame of a function's invocation.
9
+ */
10
+ export function getCallFrame(error: Error) {
11
+ // In <IE11, new Error may return an undefined stack
12
+ const stack = error.stack
13
+
14
+ if (!stack) {
15
+ return
16
+ }
17
+
18
+ const frames: string[] = stack.split('\n').slice(1)
19
+
20
+ // Get the first frame that doesn't reference the library's internal trace.
21
+ // Assume that frame is the invocation frame.
22
+ const declarationFrame = frames.find((frame) => {
23
+ return !(SOURCE_FRAME.test(frame) || BUILD_FRAME.test(frame))
24
+ })
25
+
26
+ if (!declarationFrame) {
27
+ return
28
+ }
29
+
30
+ // Extract file reference from the stack frame.
31
+ const declarationPath = declarationFrame
32
+ .replace(/\s*at [^()]*\(([^)]+)\)/, '$1')
33
+ .replace(/^@/, '')
34
+ return declarationPath
35
+ }
@@ -0,0 +1,23 @@
1
+ import { isIterable } from './isIterable'
2
+
3
+ test('returns true given an iterator', () => {
4
+ expect(
5
+ isIterable(
6
+ (function* () {
7
+ yield 2
8
+ })(),
9
+ ),
10
+ ).toEqual(true)
11
+ })
12
+
13
+ test('returns false given a regular function', () => {
14
+ expect(
15
+ isIterable(
16
+ (function () {
17
+ return null
18
+ })(),
19
+ ),
20
+ ).toEqual(false)
21
+
22
+ expect(isIterable((() => null)())).toEqual(false)
23
+ })
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Determines if the given function is an iterator.
3
+ */
4
+ export function isIterable<IteratorType>(
5
+ fn: any,
6
+ ): fn is Generator<IteratorType, IteratorType, IteratorType> {
7
+ if (!fn) {
8
+ return false
9
+ }
10
+
11
+ return typeof (fn as Generator<unknown>)[Symbol.iterator] == 'function'
12
+ }
@@ -0,0 +1,20 @@
1
+ import { isObject } from './isObject'
2
+
3
+ test('returns true given an object', () => {
4
+ expect(isObject({})).toBe(true)
5
+ expect(isObject({ a: 1 })).toBe(true)
6
+ })
7
+
8
+ test('returns false given a non-object value', () => {
9
+ expect(isObject(1)).toBe(false)
10
+ expect(isObject('string')).toBe(false)
11
+ expect(isObject([])).toBe(false)
12
+ expect(
13
+ isObject(function () {
14
+ return 2
15
+ }),
16
+ ).toBe(false)
17
+ expect(isObject(false)).toBe(false)
18
+ expect(isObject(undefined)).toBe(false)
19
+ expect(isObject(null)).toBe(false)
20
+ })
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Determines if the given value is an object.
3
+ */
4
+ export function isObject(value: any): boolean {
5
+ return value != null && typeof value === 'object' && !Array.isArray(value)
6
+ }
@@ -0,0 +1,45 @@
1
+ import { isStringEqual } from './isStringEqual'
2
+
3
+ describe('isStringEqual', () => {
4
+ describe('given two uppercase strings', () => {
5
+ describe('and the strings are equal', () => {
6
+ it('should return true', () => {
7
+ expect(isStringEqual('GET', 'GET')).toBe(true)
8
+ })
9
+ })
10
+
11
+ describe('and the strings are not equal', () => {
12
+ it('should return false', () => {
13
+ expect(isStringEqual('GET', 'POST')).toBe(false)
14
+ })
15
+ })
16
+ })
17
+
18
+ describe('given two lowercase strings', () => {
19
+ describe('and the strings are equal', () => {
20
+ it('should return true', () => {
21
+ expect(isStringEqual('get', 'get')).toBe(true)
22
+ })
23
+ })
24
+
25
+ describe('and the strings are not equal', () => {
26
+ it('should return false', () => {
27
+ expect(isStringEqual('get', 'post')).toBe(false)
28
+ })
29
+ })
30
+ })
31
+
32
+ describe('given two strings cased differently', () => {
33
+ describe('and the strings are equal', () => {
34
+ it('should return true', () => {
35
+ expect(isStringEqual('get', 'GET')).toBe(true)
36
+ })
37
+ })
38
+
39
+ describe('and the strings are not equal', () => {
40
+ it('should return false', () => {
41
+ expect(isStringEqual('get', 'POST')).toBe(false)
42
+ })
43
+ })
44
+ })
45
+ })
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Performs a case-insensitive comparison of two given strings.
3
+ */
4
+ export function isStringEqual(actual: string, expected: string): boolean {
5
+ return actual.toLowerCase() === expected.toLowerCase()
6
+ }
@@ -0,0 +1,13 @@
1
+ import { jsonParse } from './jsonParse'
2
+
3
+ test('parses a given valid JSON string', () => {
4
+ expect(jsonParse(`{"property":"value"}`)).toEqual({
5
+ property: 'value',
6
+ })
7
+ })
8
+
9
+ test('returns undefined without an error given an invalid JSON string', () => {
10
+ const parse = () => jsonParse(`{"property:val"ue$}`)
11
+ expect(parse).not.toThrow()
12
+ expect(parse()).toBeUndefined()
13
+ })
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Parses a given value into a JSON.
3
+ * Does not throw an exception on an invalid JSON string.
4
+ */
5
+ export function jsonParse<ValueType extends Record<string, any>>(
6
+ value: any,
7
+ ): ValueType | undefined {
8
+ try {
9
+ return JSON.parse(value)
10
+ } catch (error) {
11
+ return undefined
12
+ }
13
+ }
@@ -0,0 +1,43 @@
1
+ import { mergeRight } from './mergeRight'
2
+
3
+ test('shallowly merges two given objects', () => {
4
+ expect(mergeRight({ a: 1, b: 2 }, { b: 3, c: 4 })).toEqual({
5
+ a: 1,
6
+ b: 3,
7
+ c: 4,
8
+ })
9
+ })
10
+
11
+ test('deeply merges two given objects', () => {
12
+ expect(
13
+ mergeRight(
14
+ {
15
+ a: 'string',
16
+ b: [1, 2],
17
+ c: {
18
+ d: 2,
19
+ },
20
+ },
21
+ {
22
+ a: 'another-string',
23
+ b: [3],
24
+ c: {
25
+ e: 'five',
26
+ f: {
27
+ g: true,
28
+ },
29
+ },
30
+ },
31
+ ),
32
+ ).toEqual({
33
+ a: 'another-string',
34
+ b: [1, 2, 3],
35
+ c: {
36
+ d: 2,
37
+ e: 'five',
38
+ f: {
39
+ g: true,
40
+ },
41
+ },
42
+ })
43
+ })
@@ -0,0 +1,27 @@
1
+ import { isObject } from './isObject'
2
+
3
+ /**
4
+ * Deeply merges two given objects with the right one
5
+ * having a priority during property assignment.
6
+ */
7
+ export function mergeRight(
8
+ left: Record<string, any>,
9
+ right: Record<string, any>,
10
+ ) {
11
+ return Object.entries(right).reduce((result, [key, rightValue]) => {
12
+ const leftValue = result[key]
13
+
14
+ if (Array.isArray(leftValue) && Array.isArray(rightValue)) {
15
+ result[key] = leftValue.concat(rightValue)
16
+ return result
17
+ }
18
+
19
+ if (isObject(leftValue) && isObject(rightValue)) {
20
+ result[key] = mergeRight(leftValue, rightValue)
21
+ return result
22
+ }
23
+
24
+ result[key] = rightValue
25
+ return result
26
+ }, Object.assign({}, left))
27
+ }