@gravity-ui/data-source 0.6.1 → 0.8.0

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 (278) hide show
  1. package/README.md +752 -15
  2. package/build/cjs/core/index.d.ts +3 -1
  3. package/build/cjs/core/index.js +7 -0
  4. package/build/cjs/core/index.js.map +1 -1
  5. package/build/cjs/core/types/DataManager.d.ts +5 -0
  6. package/build/cjs/core/types/DataManager.js.map +1 -1
  7. package/build/cjs/core/types/DataSource.d.ts +15 -19
  8. package/build/cjs/core/types/DataSource.js.map +1 -1
  9. package/build/cjs/core/types/Normalizer.d.ts +29 -0
  10. package/build/cjs/core/types/Normalizer.js +6 -0
  11. package/build/cjs/core/types/Normalizer.js.map +1 -0
  12. package/build/cjs/core/utils/__tests__/composeFullKey.test.js +34 -0
  13. package/build/cjs/core/utils/__tests__/composeFullKey.test.js.map +1 -0
  14. package/build/cjs/core/utils/__tests__/composeKey.test.js +32 -0
  15. package/build/cjs/core/utils/__tests__/composeKey.test.js.map +1 -0
  16. package/build/cjs/core/utils/__tests__/getError.test.js +31 -0
  17. package/build/cjs/core/utils/__tests__/getError.test.js.map +1 -0
  18. package/build/cjs/core/utils/__tests__/getStatus.test.js +49 -0
  19. package/build/cjs/core/utils/__tests__/getStatus.test.js.map +1 -0
  20. package/build/cjs/core/utils/__tests__/hasTag.test.js +31 -0
  21. package/build/cjs/core/utils/__tests__/hasTag.test.js.map +1 -0
  22. package/build/cjs/core/utils/__tests__/mergeStatuses.test.js +25 -0
  23. package/build/cjs/core/utils/__tests__/mergeStatuses.test.js.map +1 -0
  24. package/build/cjs/core/utils/__tests__/skipContext.test.js +70 -0
  25. package/build/cjs/core/utils/__tests__/skipContext.test.js.map +1 -0
  26. package/build/cjs/core/utils/__tests__/withCancellation.test.js +106 -0
  27. package/build/cjs/core/utils/__tests__/withCancellation.test.js.map +1 -0
  28. package/build/cjs/core/utils/__tests__/withCatch.test.js +208 -0
  29. package/build/cjs/core/utils/__tests__/withCatch.test.js.map +1 -0
  30. package/build/cjs/core/utils/withCatch.d.ts +26 -0
  31. package/build/cjs/core/utils/withCatch.js +37 -0
  32. package/build/cjs/core/utils/withCatch.js.map +1 -0
  33. package/build/cjs/react/DataManagerProvider.d.ts +7 -0
  34. package/build/cjs/react/DataManagerProvider.js +19 -0
  35. package/build/cjs/react/DataManagerProvider.js.map +1 -0
  36. package/build/cjs/react/__tests__/DataManagerContext.test.js +47 -0
  37. package/build/cjs/react/__tests__/DataManagerContext.test.js.map +1 -0
  38. package/build/cjs/react/__tests__/withDataManager.test.js +61 -0
  39. package/build/cjs/react/__tests__/withDataManager.test.js.map +1 -0
  40. package/build/cjs/react/components/DataInfiniteLoader/__tests__/DataInfiniteLoader.test.js +187 -0
  41. package/build/cjs/react/components/DataInfiniteLoader/__tests__/DataInfiniteLoader.test.js.map +1 -0
  42. package/build/cjs/react/components/DataLoader/__tests__/DataLoader.test.js +119 -0
  43. package/build/cjs/react/components/DataLoader/__tests__/DataLoader.test.js.map +1 -0
  44. package/build/cjs/react/index.d.ts +2 -0
  45. package/build/cjs/react/index.js +8 -0
  46. package/build/cjs/react/index.js.map +1 -1
  47. package/build/cjs/react/withDataManager.d.ts +1 -1
  48. package/build/cjs/react/withDataManager.js +3 -3
  49. package/build/cjs/react/withDataManager.js.map +1 -1
  50. package/build/cjs/react-query/ClientDataManager.d.ts +11 -2
  51. package/build/cjs/react-query/ClientDataManager.js +76 -9
  52. package/build/cjs/react-query/ClientDataManager.js.map +1 -1
  53. package/build/cjs/react-query/DataSourceProvider.d.ts +7 -0
  54. package/build/cjs/react-query/DataSourceProvider.js +35 -0
  55. package/build/cjs/react-query/DataSourceProvider.js.map +1 -0
  56. package/build/cjs/react-query/__tests__/createQueryNormalizer.test.js +177 -0
  57. package/build/cjs/react-query/__tests__/createQueryNormalizer.test.js.map +1 -0
  58. package/build/cjs/react-query/__tests__/normalizationEdgeCases.test.js +100 -0
  59. package/build/cjs/react-query/__tests__/normalizationEdgeCases.test.js.map +1 -0
  60. package/build/cjs/react-query/__tests__/subscriptions.test.js +1180 -0
  61. package/build/cjs/react-query/__tests__/subscriptions.test.js.map +1 -0
  62. package/build/cjs/react-query/__tests__/threeLevelIntegration.test.js +514 -0
  63. package/build/cjs/react-query/__tests__/threeLevelIntegration.test.js.map +1 -0
  64. package/build/cjs/react-query/__tests__/updateQueriesFromMutationData.test.js +229 -0
  65. package/build/cjs/react-query/__tests__/updateQueriesFromMutationData.test.js.map +1 -0
  66. package/build/cjs/react-query/constants.d.ts +2 -0
  67. package/build/cjs/react-query/constants.js +9 -0
  68. package/build/cjs/react-query/constants.js.map +1 -0
  69. package/build/cjs/react-query/hooks/__tests__/useQueryContext.test.js +55 -0
  70. package/build/cjs/react-query/hooks/__tests__/useQueryContext.test.js.map +1 -0
  71. package/build/cjs/react-query/hooks/__tests__/useQueryData.refetch.test.js +195 -0
  72. package/build/cjs/react-query/hooks/__tests__/useQueryData.refetch.test.js.map +1 -0
  73. package/build/cjs/react-query/hooks/__tests__/useQueryData.test.js +97 -0
  74. package/build/cjs/react-query/hooks/__tests__/useQueryData.test.js.map +1 -0
  75. package/build/cjs/react-query/hooks/__tests__/useQueryResponses.test.js +77 -0
  76. package/build/cjs/react-query/hooks/__tests__/useQueryResponses.test.js.map +1 -0
  77. package/build/cjs/react-query/hooks/__tests__/useRefetchAll.test.js +79 -0
  78. package/build/cjs/react-query/hooks/__tests__/useRefetchAll.test.js.map +1 -0
  79. package/build/cjs/react-query/hooks/__tests__/useRefetchErrored.test.js +117 -0
  80. package/build/cjs/react-query/hooks/__tests__/useRefetchErrored.test.js.map +1 -0
  81. package/build/cjs/react-query/hooks/__tests__/useRefetchInterval.test.js +156 -0
  82. package/build/cjs/react-query/hooks/__tests__/useRefetchInterval.test.js.map +1 -0
  83. package/build/cjs/react-query/hooks/useRefetchInterval.d.ts +1 -1
  84. package/build/cjs/react-query/impl/infinite/factory.d.ts +1 -1
  85. package/build/cjs/react-query/impl/infinite/factory.js.map +1 -1
  86. package/build/cjs/react-query/impl/infinite/hooks.js +4 -1
  87. package/build/cjs/react-query/impl/infinite/hooks.js.map +1 -1
  88. package/build/cjs/react-query/impl/infinite/types.d.ts +9 -9
  89. package/build/cjs/react-query/impl/infinite/types.js.map +1 -1
  90. package/build/cjs/react-query/impl/infinite/utils.js +11 -22
  91. package/build/cjs/react-query/impl/infinite/utils.js.map +1 -1
  92. package/build/cjs/react-query/impl/plain/factory.d.ts +1 -1
  93. package/build/cjs/react-query/impl/plain/factory.js.map +1 -1
  94. package/build/cjs/react-query/impl/plain/hooks.js +4 -1
  95. package/build/cjs/react-query/impl/plain/hooks.js.map +1 -1
  96. package/build/cjs/react-query/impl/plain/types.d.ts +6 -6
  97. package/build/cjs/react-query/impl/plain/types.js.map +1 -1
  98. package/build/cjs/react-query/impl/plain/utils.js +12 -23
  99. package/build/cjs/react-query/impl/plain/utils.js.map +1 -1
  100. package/build/cjs/react-query/index.d.ts +2 -0
  101. package/build/cjs/react-query/index.js +7 -0
  102. package/build/cjs/react-query/index.js.map +1 -1
  103. package/build/cjs/react-query/types/normalizer.d.ts +21 -0
  104. package/build/cjs/react-query/types/normalizer.js +6 -0
  105. package/build/cjs/react-query/types/normalizer.js.map +1 -0
  106. package/build/cjs/react-query/types/options.d.ts +12 -0
  107. package/build/cjs/react-query/types/options.js.map +1 -1
  108. package/build/cjs/react-query/utils/__tests__/formatNullableValue.test.js +27 -0
  109. package/build/cjs/react-query/utils/__tests__/formatNullableValue.test.js.map +1 -0
  110. package/build/cjs/react-query/utils/__tests__/getProgressiveRefetch.test.js +76 -0
  111. package/build/cjs/react-query/utils/__tests__/getProgressiveRefetch.test.js.map +1 -0
  112. package/build/cjs/react-query/utils/__tests__/normalizeStatus.test.js +30 -0
  113. package/build/cjs/react-query/utils/__tests__/normalizeStatus.test.js.map +1 -0
  114. package/build/cjs/react-query/utils/__tests__/notReachable.test.js +35 -0
  115. package/build/cjs/react-query/utils/__tests__/notReachable.test.js.map +1 -0
  116. package/build/cjs/react-query/utils/__tests__/parseNullableValue.test.js +27 -0
  117. package/build/cjs/react-query/utils/__tests__/parseNullableValue.test.js.map +1 -0
  118. package/build/cjs/react-query/utils/formatNullableValue.d.ts +2 -0
  119. package/build/cjs/react-query/utils/formatNullableValue.js +17 -0
  120. package/build/cjs/react-query/utils/formatNullableValue.js.map +1 -0
  121. package/build/cjs/react-query/utils/getProgressiveRefetch.d.ts +2 -2
  122. package/build/cjs/react-query/utils/normalize.d.ts +22 -0
  123. package/build/cjs/react-query/utils/normalize.js +150 -0
  124. package/build/cjs/react-query/utils/normalize.js.map +1 -0
  125. package/build/cjs/react-query/utils/parseNullableValue.d.ts +2 -0
  126. package/build/cjs/react-query/utils/parseNullableValue.js +17 -0
  127. package/build/cjs/react-query/utils/parseNullableValue.js.map +1 -0
  128. package/build/cjs/react-query/utils/warn.d.ts +1 -0
  129. package/build/cjs/react-query/utils/warn.js +15 -0
  130. package/build/cjs/react-query/utils/warn.js.map +1 -0
  131. package/build/cjs/react-query/utils/warnDisabledRefetch.d.ts +1 -0
  132. package/build/cjs/react-query/utils/warnDisabledRefetch.js +11 -0
  133. package/build/cjs/react-query/utils/warnDisabledRefetch.js.map +1 -0
  134. package/build/cjs/setupTests.d.ts +1 -0
  135. package/build/cjs/setupTests.js +4 -0
  136. package/build/cjs/setupTests.js.map +1 -0
  137. package/build/esm/core/index.d.ts +3 -1
  138. package/build/esm/core/index.js +1 -0
  139. package/build/esm/core/index.js.map +1 -1
  140. package/build/esm/core/types/DataManager.d.ts +5 -0
  141. package/build/esm/core/types/DataManager.js.map +1 -1
  142. package/build/esm/core/types/DataSource.d.ts +15 -19
  143. package/build/esm/core/types/DataSource.js.map +1 -1
  144. package/build/esm/core/types/Normalizer.d.ts +29 -0
  145. package/build/esm/core/types/Normalizer.js +2 -0
  146. package/build/esm/core/types/Normalizer.js.map +1 -0
  147. package/build/esm/core/utils/__tests__/composeFullKey.test.js +32 -0
  148. package/build/esm/core/utils/__tests__/composeFullKey.test.js.map +1 -0
  149. package/build/esm/core/utils/__tests__/composeKey.test.js +30 -0
  150. package/build/esm/core/utils/__tests__/composeKey.test.js.map +1 -0
  151. package/build/esm/core/utils/__tests__/getError.test.js +29 -0
  152. package/build/esm/core/utils/__tests__/getError.test.js.map +1 -0
  153. package/build/esm/core/utils/__tests__/getStatus.test.js +47 -0
  154. package/build/esm/core/utils/__tests__/getStatus.test.js.map +1 -0
  155. package/build/esm/core/utils/__tests__/hasTag.test.js +29 -0
  156. package/build/esm/core/utils/__tests__/hasTag.test.js.map +1 -0
  157. package/build/esm/core/utils/__tests__/mergeStatuses.test.js +23 -0
  158. package/build/esm/core/utils/__tests__/mergeStatuses.test.js.map +1 -0
  159. package/build/esm/core/utils/__tests__/skipContext.test.js +67 -0
  160. package/build/esm/core/utils/__tests__/skipContext.test.js.map +1 -0
  161. package/build/esm/core/utils/__tests__/withCancellation.test.js +104 -0
  162. package/build/esm/core/utils/__tests__/withCancellation.test.js.map +1 -0
  163. package/build/esm/core/utils/__tests__/withCatch.test.js +205 -0
  164. package/build/esm/core/utils/__tests__/withCatch.test.js.map +1 -0
  165. package/build/esm/core/utils/withCatch.d.ts +26 -0
  166. package/build/esm/core/utils/withCatch.js +31 -0
  167. package/build/esm/core/utils/withCatch.js.map +1 -0
  168. package/build/esm/react/DataManagerProvider.d.ts +7 -0
  169. package/build/esm/react/DataManagerProvider.js +12 -0
  170. package/build/esm/react/DataManagerProvider.js.map +1 -0
  171. package/build/esm/react/__tests__/DataManagerContext.test.js +44 -0
  172. package/build/esm/react/__tests__/DataManagerContext.test.js.map +1 -0
  173. package/build/esm/react/__tests__/withDataManager.test.js +58 -0
  174. package/build/esm/react/__tests__/withDataManager.test.js.map +1 -0
  175. package/build/esm/react/components/DataInfiniteLoader/__tests__/DataInfiniteLoader.test.js +184 -0
  176. package/build/esm/react/components/DataInfiniteLoader/__tests__/DataInfiniteLoader.test.js.map +1 -0
  177. package/build/esm/react/components/DataLoader/__tests__/DataLoader.test.js +116 -0
  178. package/build/esm/react/components/DataLoader/__tests__/DataLoader.test.js.map +1 -0
  179. package/build/esm/react/index.d.ts +2 -0
  180. package/build/esm/react/index.js +1 -0
  181. package/build/esm/react/index.js.map +1 -1
  182. package/build/esm/react/withDataManager.d.ts +1 -1
  183. package/build/esm/react/withDataManager.js +3 -3
  184. package/build/esm/react/withDataManager.js.map +1 -1
  185. package/build/esm/react-query/ClientDataManager.d.ts +11 -2
  186. package/build/esm/react-query/ClientDataManager.js +70 -3
  187. package/build/esm/react-query/ClientDataManager.js.map +1 -1
  188. package/build/esm/react-query/DataSourceProvider.d.ts +7 -0
  189. package/build/esm/react-query/DataSourceProvider.js +28 -0
  190. package/build/esm/react-query/DataSourceProvider.js.map +1 -0
  191. package/build/esm/react-query/__tests__/createQueryNormalizer.test.js +174 -0
  192. package/build/esm/react-query/__tests__/createQueryNormalizer.test.js.map +1 -0
  193. package/build/esm/react-query/__tests__/normalizationEdgeCases.test.js +98 -0
  194. package/build/esm/react-query/__tests__/normalizationEdgeCases.test.js.map +1 -0
  195. package/build/esm/react-query/__tests__/subscriptions.test.js +1176 -0
  196. package/build/esm/react-query/__tests__/subscriptions.test.js.map +1 -0
  197. package/build/esm/react-query/__tests__/threeLevelIntegration.test.js +511 -0
  198. package/build/esm/react-query/__tests__/threeLevelIntegration.test.js.map +1 -0
  199. package/build/esm/react-query/__tests__/updateQueriesFromMutationData.test.js +227 -0
  200. package/build/esm/react-query/__tests__/updateQueriesFromMutationData.test.js.map +1 -0
  201. package/build/esm/react-query/constants.d.ts +2 -0
  202. package/build/esm/react-query/constants.js +3 -0
  203. package/build/esm/react-query/constants.js.map +1 -0
  204. package/build/esm/react-query/hooks/__tests__/useQueryContext.test.js +52 -0
  205. package/build/esm/react-query/hooks/__tests__/useQueryContext.test.js.map +1 -0
  206. package/build/esm/react-query/hooks/__tests__/useQueryData.refetch.test.js +192 -0
  207. package/build/esm/react-query/hooks/__tests__/useQueryData.refetch.test.js.map +1 -0
  208. package/build/esm/react-query/hooks/__tests__/useQueryData.test.js +95 -0
  209. package/build/esm/react-query/hooks/__tests__/useQueryData.test.js.map +1 -0
  210. package/build/esm/react-query/hooks/__tests__/useQueryResponses.test.js +74 -0
  211. package/build/esm/react-query/hooks/__tests__/useQueryResponses.test.js.map +1 -0
  212. package/build/esm/react-query/hooks/__tests__/useRefetchAll.test.js +77 -0
  213. package/build/esm/react-query/hooks/__tests__/useRefetchAll.test.js.map +1 -0
  214. package/build/esm/react-query/hooks/__tests__/useRefetchErrored.test.js +115 -0
  215. package/build/esm/react-query/hooks/__tests__/useRefetchErrored.test.js.map +1 -0
  216. package/build/esm/react-query/hooks/__tests__/useRefetchInterval.test.js +154 -0
  217. package/build/esm/react-query/hooks/__tests__/useRefetchInterval.test.js.map +1 -0
  218. package/build/esm/react-query/hooks/useRefetchInterval.d.ts +1 -1
  219. package/build/esm/react-query/impl/infinite/factory.d.ts +1 -1
  220. package/build/esm/react-query/impl/infinite/factory.js.map +1 -1
  221. package/build/esm/react-query/impl/infinite/hooks.js +5 -2
  222. package/build/esm/react-query/impl/infinite/hooks.js.map +1 -1
  223. package/build/esm/react-query/impl/infinite/types.d.ts +9 -9
  224. package/build/esm/react-query/impl/infinite/types.js.map +1 -1
  225. package/build/esm/react-query/impl/infinite/utils.js +9 -20
  226. package/build/esm/react-query/impl/infinite/utils.js.map +1 -1
  227. package/build/esm/react-query/impl/plain/factory.d.ts +1 -1
  228. package/build/esm/react-query/impl/plain/factory.js.map +1 -1
  229. package/build/esm/react-query/impl/plain/hooks.js +5 -2
  230. package/build/esm/react-query/impl/plain/hooks.js.map +1 -1
  231. package/build/esm/react-query/impl/plain/types.d.ts +6 -6
  232. package/build/esm/react-query/impl/plain/types.js.map +1 -1
  233. package/build/esm/react-query/impl/plain/utils.js +10 -21
  234. package/build/esm/react-query/impl/plain/utils.js.map +1 -1
  235. package/build/esm/react-query/index.d.ts +2 -0
  236. package/build/esm/react-query/index.js +1 -0
  237. package/build/esm/react-query/index.js.map +1 -1
  238. package/build/esm/react-query/types/normalizer.d.ts +21 -0
  239. package/build/esm/react-query/types/normalizer.js +2 -0
  240. package/build/esm/react-query/types/normalizer.js.map +1 -0
  241. package/build/esm/react-query/types/options.d.ts +12 -0
  242. package/build/esm/react-query/types/options.js.map +1 -1
  243. package/build/esm/react-query/utils/__tests__/formatNullableValue.test.js +25 -0
  244. package/build/esm/react-query/utils/__tests__/formatNullableValue.test.js.map +1 -0
  245. package/build/esm/react-query/utils/__tests__/getProgressiveRefetch.test.js +74 -0
  246. package/build/esm/react-query/utils/__tests__/getProgressiveRefetch.test.js.map +1 -0
  247. package/build/esm/react-query/utils/__tests__/normalizeStatus.test.js +28 -0
  248. package/build/esm/react-query/utils/__tests__/normalizeStatus.test.js.map +1 -0
  249. package/build/esm/react-query/utils/__tests__/notReachable.test.js +33 -0
  250. package/build/esm/react-query/utils/__tests__/notReachable.test.js.map +1 -0
  251. package/build/esm/react-query/utils/__tests__/parseNullableValue.test.js +25 -0
  252. package/build/esm/react-query/utils/__tests__/parseNullableValue.test.js.map +1 -0
  253. package/build/esm/react-query/utils/formatNullableValue.d.ts +2 -0
  254. package/build/esm/react-query/utils/formatNullableValue.js +11 -0
  255. package/build/esm/react-query/utils/formatNullableValue.js.map +1 -0
  256. package/build/esm/react-query/utils/getProgressiveRefetch.d.ts +2 -2
  257. package/build/esm/react-query/utils/normalize.d.ts +22 -0
  258. package/build/esm/react-query/utils/normalize.js +143 -0
  259. package/build/esm/react-query/utils/normalize.js.map +1 -0
  260. package/build/esm/react-query/utils/parseNullableValue.d.ts +2 -0
  261. package/build/esm/react-query/utils/parseNullableValue.js +11 -0
  262. package/build/esm/react-query/utils/parseNullableValue.js.map +1 -0
  263. package/build/esm/react-query/utils/warn.d.ts +1 -0
  264. package/build/esm/react-query/utils/warn.js +9 -0
  265. package/build/esm/react-query/utils/warn.js.map +1 -0
  266. package/build/esm/react-query/utils/warnDisabledRefetch.d.ts +1 -0
  267. package/build/esm/react-query/utils/warnDisabledRefetch.js +5 -0
  268. package/build/esm/react-query/utils/warnDisabledRefetch.js.map +1 -0
  269. package/build/esm/setupTests.d.ts +1 -0
  270. package/build/esm/setupTests.js +2 -0
  271. package/build/esm/setupTests.js.map +1 -0
  272. package/package.json +18 -13
  273. package/build/cjs/react-query/impl/utils.d.ts +0 -4
  274. package/build/cjs/react-query/impl/utils.js +0 -27
  275. package/build/cjs/react-query/impl/utils.js.map +0 -1
  276. package/build/esm/react-query/impl/utils.d.ts +0 -4
  277. package/build/esm/react-query/impl/utils.js +0 -21
  278. package/build/esm/react-query/impl/utils.js.map +0 -1
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+
3
+ var _withCancellation = require("../withCancellation");
4
+ describe('withCancellation', function () {
5
+ describe('isCancellable', function () {
6
+ it('should return true for objects with cancel method', function () {
7
+ var cancellable = {
8
+ cancel: jest.fn()
9
+ };
10
+ expect((0, _withCancellation.isCancellable)(cancellable)).toBe(true);
11
+ });
12
+ it('should return false for null', function () {
13
+ expect((0, _withCancellation.isCancellable)(null)).toBe(false);
14
+ });
15
+ it('should return false for objects without cancel method', function () {
16
+ expect((0, _withCancellation.isCancellable)({})).toBe(false);
17
+ });
18
+ it('should return false for objects with invalid cancel method', function () {
19
+ expect((0, _withCancellation.isCancellable)({
20
+ cancel: 'not a function'
21
+ })).toBe(false);
22
+ });
23
+ });
24
+ describe('isAbortable', function () {
25
+ it('should return true for objects with valid signal', function () {
26
+ var abortController = new AbortController();
27
+ var abortable = {
28
+ signal: abortController.signal
29
+ };
30
+ expect((0, _withCancellation.isAbortable)(abortable)).toBe(true);
31
+ });
32
+ it('should return false for null', function () {
33
+ expect((0, _withCancellation.isAbortable)(null)).toBe(false);
34
+ });
35
+ it('should return false for objects without signal', function () {
36
+ expect((0, _withCancellation.isAbortable)({})).toBe(false);
37
+ });
38
+ it('should return false for objects with invalid signal', function () {
39
+ expect((0, _withCancellation.isAbortable)({
40
+ signal: {}
41
+ })).toBe(false);
42
+ });
43
+ });
44
+ describe('withCancellation', function () {
45
+ it('should add abort listener when fetch returns cancellable and context is abortable', function () {
46
+ var mockCancel = jest.fn();
47
+ var cancellable = {
48
+ cancel: mockCancel
49
+ };
50
+ var abortController = new AbortController();
51
+ var fetchContext = {
52
+ signal: abortController.signal
53
+ };
54
+ var mockFetch = jest.fn().mockReturnValue(cancellable);
55
+ var dataSource = {
56
+ name: 'test',
57
+ fetch: mockFetch
58
+ };
59
+ var wrappedFetch = (0, _withCancellation.withCancellation)(dataSource.fetch);
60
+ var result = wrappedFetch({}, fetchContext, {});
61
+ expect(mockFetch).toHaveBeenCalledWith({}, fetchContext, {});
62
+ expect(result).toBe(cancellable);
63
+ expect(mockCancel).not.toHaveBeenCalled();
64
+
65
+ // Simulate abort
66
+ abortController.abort();
67
+ expect(mockCancel).toHaveBeenCalled();
68
+ });
69
+ it('should not add abort listener when fetch returns non-cancellable', function () {
70
+ var abortController = new AbortController();
71
+ var fetchContext = {
72
+ signal: abortController.signal
73
+ };
74
+ var mockFetch = jest.fn().mockReturnValue('not cancellable');
75
+ var dataSource = {
76
+ name: 'test',
77
+ fetch: mockFetch
78
+ };
79
+ var wrappedFetch = (0, _withCancellation.withCancellation)(dataSource.fetch);
80
+ var result = wrappedFetch({}, fetchContext, {});
81
+ expect(mockFetch).toHaveBeenCalledWith({}, fetchContext, {});
82
+ expect(result).toBe('not cancellable');
83
+
84
+ // No error should occur when aborting
85
+ abortController.abort();
86
+ });
87
+ it('should not add abort listener when context is not abortable', function () {
88
+ var mockCancel = jest.fn();
89
+ var cancellable = {
90
+ cancel: mockCancel
91
+ };
92
+ var fetchContext = {};
93
+ var mockFetch = jest.fn().mockReturnValue(cancellable);
94
+ var dataSource = {
95
+ name: 'test',
96
+ fetch: mockFetch
97
+ };
98
+ var wrappedFetch = (0, _withCancellation.withCancellation)(dataSource.fetch);
99
+ var result = wrappedFetch({}, fetchContext, {});
100
+ expect(mockFetch).toHaveBeenCalledWith({}, fetchContext, {});
101
+ expect(result).toBe(cancellable);
102
+ expect(mockCancel).not.toHaveBeenCalled();
103
+ });
104
+ });
105
+ });
106
+ // #sourceMappingURL=withCancellation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_withCancellation","require","describe","it","cancellable","cancel","jest","fn","expect","isCancellable","toBe","abortController","AbortController","abortable","signal","isAbortable","mockCancel","fetchContext","mockFetch","mockReturnValue","dataSource","name","fetch","wrappedFetch","withCancellation","result","toHaveBeenCalledWith","not","toHaveBeenCalled","abort"],"sources":["withCancellation.test.ts"],"sourcesContent":["import type {AnyDataSource} from '../../types/DataSource';\nimport type {Cancellable} from '../withCancellation';\nimport {isAbortable, isCancellable, withCancellation} from '../withCancellation';\n\ndescribe('withCancellation', () => {\n describe('isCancellable', () => {\n it('should return true for objects with cancel method', () => {\n const cancellable: Cancellable = {\n cancel: jest.fn(),\n };\n expect(isCancellable(cancellable)).toBe(true);\n });\n\n it('should return false for null', () => {\n expect(isCancellable(null)).toBe(false);\n });\n\n it('should return false for objects without cancel method', () => {\n expect(isCancellable({})).toBe(false);\n });\n\n it('should return false for objects with invalid cancel method', () => {\n expect(isCancellable({cancel: 'not a function'})).toBe(false);\n });\n });\n\n describe('isAbortable', () => {\n it('should return true for objects with valid signal', () => {\n const abortController = new AbortController();\n const abortable = {signal: abortController.signal};\n expect(isAbortable(abortable)).toBe(true);\n });\n\n it('should return false for null', () => {\n expect(isAbortable(null)).toBe(false);\n });\n\n it('should return false for objects without signal', () => {\n expect(isAbortable({})).toBe(false);\n });\n\n it('should return false for objects with invalid signal', () => {\n expect(isAbortable({signal: {}})).toBe(false);\n });\n });\n\n describe('withCancellation', () => {\n it('should add abort listener when fetch returns cancellable and context is abortable', () => {\n const mockCancel = jest.fn();\n const cancellable: Cancellable = {\n cancel: mockCancel,\n };\n\n const abortController = new AbortController();\n const fetchContext = {signal: abortController.signal};\n\n const mockFetch = jest.fn().mockReturnValue(cancellable);\n const dataSource: AnyDataSource = {\n name: 'test',\n fetch: mockFetch,\n };\n\n const wrappedFetch = withCancellation(dataSource.fetch);\n const result = wrappedFetch({}, fetchContext, {});\n\n expect(mockFetch).toHaveBeenCalledWith({}, fetchContext, {});\n expect(result).toBe(cancellable);\n expect(mockCancel).not.toHaveBeenCalled();\n\n // Simulate abort\n abortController.abort();\n expect(mockCancel).toHaveBeenCalled();\n });\n\n it('should not add abort listener when fetch returns non-cancellable', () => {\n const abortController = new AbortController();\n const fetchContext = {signal: abortController.signal};\n\n const mockFetch = jest.fn().mockReturnValue('not cancellable');\n const dataSource: AnyDataSource = {\n name: 'test',\n fetch: mockFetch,\n };\n\n const wrappedFetch = withCancellation(dataSource.fetch);\n const result = wrappedFetch({}, fetchContext, {});\n\n expect(mockFetch).toHaveBeenCalledWith({}, fetchContext, {});\n expect(result).toBe('not cancellable');\n\n // No error should occur when aborting\n abortController.abort();\n });\n\n it('should not add abort listener when context is not abortable', () => {\n const mockCancel = jest.fn();\n const cancellable: Cancellable = {\n cancel: mockCancel,\n };\n\n const fetchContext = {};\n\n const mockFetch = jest.fn().mockReturnValue(cancellable);\n const dataSource: AnyDataSource = {\n name: 'test',\n fetch: mockFetch,\n };\n\n const wrappedFetch = withCancellation(dataSource.fetch);\n const result = wrappedFetch({}, fetchContext, {});\n\n expect(mockFetch).toHaveBeenCalledWith({}, fetchContext, {});\n expect(result).toBe(cancellable);\n expect(mockCancel).not.toHaveBeenCalled();\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+
3
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
4
+ var _regeneratorRuntime2 = _interopRequireDefault(require("@babel/runtime/helpers/regeneratorRuntime"));
5
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
6
+ var _withCatch = require("../withCatch");
7
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
8
+ describe('withCatch', function () {
9
+ it('should return the result of the fetch function when it succeeds', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee() {
10
+ var mockFetch, mockErrorHandler, safeFetch, result;
11
+ return (0, _regeneratorRuntime2.default)().wrap(function _callee$(_context) {
12
+ while (1) switch (_context.prev = _context.next) {
13
+ case 0:
14
+ mockFetch = jest.fn().mockResolvedValue({
15
+ data: 'success'
16
+ });
17
+ mockErrorHandler = jest.fn().mockReturnValue({
18
+ error: 'handled'
19
+ });
20
+ safeFetch = (0, _withCatch.withCatch)(mockFetch, mockErrorHandler);
21
+ _context.next = 5;
22
+ return safeFetch('arg1', 42);
23
+ case 5:
24
+ result = _context.sent;
25
+ expect(mockFetch).toHaveBeenCalledWith('arg1', 42);
26
+ expect(mockErrorHandler).not.toHaveBeenCalled();
27
+ expect(result).toEqual({
28
+ data: 'success'
29
+ });
30
+ case 9:
31
+ case "end":
32
+ return _context.stop();
33
+ }
34
+ }, _callee);
35
+ })));
36
+ it('should call the error handler when the fetch function fails', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee2() {
37
+ var error, mockFetch, mockErrorHandler, safeFetch, result;
38
+ return (0, _regeneratorRuntime2.default)().wrap(function _callee2$(_context2) {
39
+ while (1) switch (_context2.prev = _context2.next) {
40
+ case 0:
41
+ error = new Error('fetch failed');
42
+ mockFetch = jest.fn().mockRejectedValue(error);
43
+ mockErrorHandler = jest.fn().mockReturnValue({
44
+ error: 'handled'
45
+ });
46
+ safeFetch = (0, _withCatch.withCatch)(mockFetch, mockErrorHandler);
47
+ _context2.next = 6;
48
+ return safeFetch('arg1', 42);
49
+ case 6:
50
+ result = _context2.sent;
51
+ expect(mockFetch).toHaveBeenCalledWith('arg1', 42);
52
+ expect(mockErrorHandler).toHaveBeenCalledWith(error);
53
+ expect(result).toEqual({
54
+ error: 'handled'
55
+ });
56
+ case 10:
57
+ case "end":
58
+ return _context2.stop();
59
+ }
60
+ }, _callee2);
61
+ })));
62
+ it('should work with functions that take no parameters', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee3() {
63
+ var mockFetch, mockErrorHandler, safeFetch, result;
64
+ return (0, _regeneratorRuntime2.default)().wrap(function _callee3$(_context3) {
65
+ while (1) switch (_context3.prev = _context3.next) {
66
+ case 0:
67
+ mockFetch = jest.fn().mockResolvedValue({
68
+ data: 'success'
69
+ });
70
+ mockErrorHandler = jest.fn().mockReturnValue({
71
+ error: 'handled'
72
+ });
73
+ safeFetch = (0, _withCatch.withCatch)(mockFetch, mockErrorHandler);
74
+ _context3.next = 5;
75
+ return safeFetch();
76
+ case 5:
77
+ result = _context3.sent;
78
+ expect(mockFetch).toHaveBeenCalledWith();
79
+ expect(mockErrorHandler).not.toHaveBeenCalled();
80
+ expect(result).toEqual({
81
+ data: 'success'
82
+ });
83
+ case 9:
84
+ case "end":
85
+ return _context3.stop();
86
+ }
87
+ }, _callee3);
88
+ })));
89
+ it('should work with functions that take multiple parameters', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee4() {
90
+ var mockFetch, mockErrorHandler, safeFetch, result;
91
+ return (0, _regeneratorRuntime2.default)().wrap(function _callee4$(_context4) {
92
+ while (1) switch (_context4.prev = _context4.next) {
93
+ case 0:
94
+ mockFetch = jest.fn().mockResolvedValue({
95
+ data: 'success'
96
+ });
97
+ mockErrorHandler = jest.fn().mockReturnValue({
98
+ error: 'handled'
99
+ });
100
+ safeFetch = (0, _withCatch.withCatch)(mockFetch, mockErrorHandler);
101
+ _context4.next = 5;
102
+ return safeFetch('arg1', 42, true, {
103
+ complex: 'object'
104
+ });
105
+ case 5:
106
+ result = _context4.sent;
107
+ expect(mockFetch).toHaveBeenCalledWith('arg1', 42, true, {
108
+ complex: 'object'
109
+ });
110
+ expect(mockErrorHandler).not.toHaveBeenCalled();
111
+ expect(result).toEqual({
112
+ data: 'success'
113
+ });
114
+ case 9:
115
+ case "end":
116
+ return _context4.stop();
117
+ }
118
+ }, _callee4);
119
+ })));
120
+ it('should handle error handlers that return promises', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee5() {
121
+ var error, mockFetch, mockErrorHandler, safeFetch, result;
122
+ return (0, _regeneratorRuntime2.default)().wrap(function _callee5$(_context5) {
123
+ while (1) switch (_context5.prev = _context5.next) {
124
+ case 0:
125
+ error = new Error('fetch failed');
126
+ mockFetch = jest.fn().mockRejectedValue(error);
127
+ mockErrorHandler = jest.fn().mockResolvedValue({
128
+ error: 'async handled'
129
+ });
130
+ safeFetch = (0, _withCatch.withCatch)(mockFetch, mockErrorHandler);
131
+ _context5.next = 6;
132
+ return safeFetch('arg1');
133
+ case 6:
134
+ result = _context5.sent;
135
+ expect(mockFetch).toHaveBeenCalledWith('arg1');
136
+ expect(mockErrorHandler).toHaveBeenCalledWith(error);
137
+ expect(result).toEqual({
138
+ error: 'async handled'
139
+ });
140
+ case 10:
141
+ case "end":
142
+ return _context5.stop();
143
+ }
144
+ }, _callee5);
145
+ })));
146
+ it('should preserve the type of the fetch function return value', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee6() {
147
+ var mockFetch, mockErrorHandler, safeFetch, result, userName;
148
+ return (0, _regeneratorRuntime2.default)().wrap(function _callee6$(_context6) {
149
+ while (1) switch (_context6.prev = _context6.next) {
150
+ case 0:
151
+ mockFetch = jest.fn().mockResolvedValue({
152
+ id: 1,
153
+ name: 'John Doe'
154
+ });
155
+ mockErrorHandler = jest.fn().mockReturnValue(null);
156
+ safeFetch = (0, _withCatch.withCatch)(mockFetch, mockErrorHandler);
157
+ _context6.next = 5;
158
+ return safeFetch('user1');
159
+ case 5:
160
+ result = _context6.sent;
161
+ expect(result).toEqual({
162
+ id: 1,
163
+ name: 'John Doe'
164
+ });
165
+ // TypeScript should recognize result as User | null
166
+ if (result !== null) {
167
+ // This should compile without errors
168
+ userName = result.name;
169
+ expect(userName).toBe('John Doe');
170
+ }
171
+ case 8:
172
+ case "end":
173
+ return _context6.stop();
174
+ }
175
+ }, _callee6);
176
+ })));
177
+ it('should preserve the type of the error handler return value', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee7() {
178
+ var error, mockFetch, mockErrorHandler, safeFetch, result, errorCode;
179
+ return (0, _regeneratorRuntime2.default)().wrap(function _callee7$(_context7) {
180
+ while (1) switch (_context7.prev = _context7.next) {
181
+ case 0:
182
+ error = new Error('fetch failed');
183
+ mockFetch = jest.fn().mockRejectedValue(error);
184
+ mockErrorHandler = jest.fn().mockReturnValue({
185
+ code: 500,
186
+ message: 'Internal Server Error'
187
+ });
188
+ safeFetch = (0, _withCatch.withCatch)(mockFetch, mockErrorHandler);
189
+ _context7.next = 6;
190
+ return safeFetch('user1');
191
+ case 6:
192
+ result = _context7.sent;
193
+ expect(mockErrorHandler).toHaveBeenCalledWith(error);
194
+
195
+ // TypeScript should recognize result as unknown | ErrorResponse
196
+ if ((0, _typeof2.default)(result) === 'object' && result !== null && 'code' in result) {
197
+ // This should compile without errors
198
+ errorCode = result.code;
199
+ expect(errorCode).toBe(500);
200
+ }
201
+ case 9:
202
+ case "end":
203
+ return _context7.stop();
204
+ }
205
+ }, _callee7);
206
+ })));
207
+ });
208
+ // #sourceMappingURL=withCatch.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_withCatch","require","_interopRequireDefault","e","__esModule","default","describe","it","_asyncToGenerator","_regeneratorRuntime","mark","_callee","mockFetch","mockErrorHandler","safeFetch","result","wrap","_callee$","_context","prev","next","jest","fn","mockResolvedValue","data","mockReturnValue","error","withCatch","sent","expect","toHaveBeenCalledWith","not","toHaveBeenCalled","toEqual","stop","_callee2","_callee2$","_context2","Error","mockRejectedValue","_callee3","_callee3$","_context3","_callee4","_callee4$","_context4","complex","_callee5","_callee5$","_context5","_callee6","userName","_callee6$","_context6","id","name","toBe","_callee7","errorCode","_callee7$","_context7","code","message","_typeof"],"sources":["withCatch.test.ts"],"sourcesContent":["import {withCatch} from '../withCatch';\n\ndescribe('withCatch', () => {\n it('should return the result of the fetch function when it succeeds', async () => {\n const mockFetch = jest.fn().mockResolvedValue({data: 'success'});\n const mockErrorHandler = jest.fn().mockReturnValue({error: 'handled'});\n\n const safeFetch = withCatch(mockFetch, mockErrorHandler);\n const result = await safeFetch('arg1', 42);\n\n expect(mockFetch).toHaveBeenCalledWith('arg1', 42);\n expect(mockErrorHandler).not.toHaveBeenCalled();\n expect(result).toEqual({data: 'success'});\n });\n\n it('should call the error handler when the fetch function fails', async () => {\n const error = new Error('fetch failed');\n const mockFetch = jest.fn().mockRejectedValue(error);\n const mockErrorHandler = jest.fn().mockReturnValue({error: 'handled'});\n\n const safeFetch = withCatch(mockFetch, mockErrorHandler);\n const result = await safeFetch('arg1', 42);\n\n expect(mockFetch).toHaveBeenCalledWith('arg1', 42);\n expect(mockErrorHandler).toHaveBeenCalledWith(error);\n expect(result).toEqual({error: 'handled'});\n });\n\n it('should work with functions that take no parameters', async () => {\n const mockFetch = jest.fn().mockResolvedValue({data: 'success'});\n const mockErrorHandler = jest.fn().mockReturnValue({error: 'handled'});\n\n const safeFetch = withCatch(mockFetch, mockErrorHandler);\n const result = await safeFetch();\n\n expect(mockFetch).toHaveBeenCalledWith();\n expect(mockErrorHandler).not.toHaveBeenCalled();\n expect(result).toEqual({data: 'success'});\n });\n\n it('should work with functions that take multiple parameters', async () => {\n const mockFetch = jest.fn().mockResolvedValue({data: 'success'});\n const mockErrorHandler = jest.fn().mockReturnValue({error: 'handled'});\n\n const safeFetch = withCatch(mockFetch, mockErrorHandler);\n const result = await safeFetch('arg1', 42, true, {complex: 'object'});\n\n expect(mockFetch).toHaveBeenCalledWith('arg1', 42, true, {complex: 'object'});\n expect(mockErrorHandler).not.toHaveBeenCalled();\n expect(result).toEqual({data: 'success'});\n });\n\n it('should handle error handlers that return promises', async () => {\n const error = new Error('fetch failed');\n const mockFetch = jest.fn().mockRejectedValue(error);\n const mockErrorHandler = jest.fn().mockResolvedValue({error: 'async handled'});\n\n const safeFetch = withCatch(mockFetch, mockErrorHandler);\n const result = await safeFetch('arg1');\n\n expect(mockFetch).toHaveBeenCalledWith('arg1');\n expect(mockErrorHandler).toHaveBeenCalledWith(error);\n expect(result).toEqual({error: 'async handled'});\n });\n\n it('should preserve the type of the fetch function return value', async () => {\n interface User {\n id: number;\n name: string;\n }\n\n const mockFetch = jest.fn().mockResolvedValue({\n id: 1,\n name: 'John Doe',\n } as User);\n\n const mockErrorHandler = jest.fn().mockReturnValue(null);\n\n const safeFetch = withCatch<[string], User, null>(mockFetch, mockErrorHandler);\n const result = await safeFetch('user1');\n\n expect(result).toEqual({id: 1, name: 'John Doe'});\n // TypeScript should recognize result as User | null\n if (result !== null) {\n // This should compile without errors\n const userName = result.name;\n expect(userName).toBe('John Doe');\n }\n });\n\n it('should preserve the type of the error handler return value', async () => {\n interface ErrorResponse {\n code: number;\n message: string;\n }\n\n const error = new Error('fetch failed');\n const mockFetch = jest.fn<Promise<unknown>, [string]>().mockRejectedValue(error);\n\n const mockErrorHandler = jest.fn().mockReturnValue({\n code: 500,\n message: 'Internal Server Error',\n } as ErrorResponse);\n\n const safeFetch = withCatch<[string], unknown, ErrorResponse>(mockFetch, mockErrorHandler);\n const result = await safeFetch('user1');\n\n expect(mockErrorHandler).toHaveBeenCalledWith(error);\n\n // TypeScript should recognize result as unknown | ErrorResponse\n if (typeof result === 'object' && result !== null && 'code' in result) {\n // This should compile without errors\n const errorCode = (result as ErrorResponse).code;\n expect(errorCode).toBe(500);\n }\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Creates a wrapper around a function that safely handles errors using a provided error handler.
3
+ *
4
+ * This utility function enhances a Promise-returning function by adding standardized error handling.
5
+ * It catches any errors thrown by the original function and processes them through the provided
6
+ * error handler, allowing for consistent error management across the application.
7
+ *
8
+ * @template TArgs - The argument types of the original function
9
+ * @template TFetchReturnType - The return type of the original function's Promise
10
+ * @template TCatchReturnType - The return type of the error handler function
11
+ *
12
+ * @param fetchFn - The original function that returns a Promise
13
+ * @param onCatchFn - The error handler function that processes any caught errors
14
+ *
15
+ * @returns A new function with the same signature as the original function,
16
+ * but with error handling applied. The returned function will resolve to either
17
+ * the successful result of the original function or the result of the error handler.
18
+ *
19
+ * @example
20
+ * // Basic usage with a string parameter
21
+ * const fetchUser = withCatch(
22
+ * someFetchFunction,
23
+ * (error) => ({ error: true, message: error.message })
24
+ * );
25
+ */
26
+ export declare function withCatch<TArgs extends unknown[], TFetchReturnType, TCatchReturnType>(fetchFn: (...args: TArgs) => Promise<TFetchReturnType>, onCatchFn: (reason: unknown) => TCatchReturnType): (...args: TArgs) => Promise<TFetchReturnType | TCatchReturnType>;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.withCatch = withCatch;
7
+ /**
8
+ * Creates a wrapper around a function that safely handles errors using a provided error handler.
9
+ *
10
+ * This utility function enhances a Promise-returning function by adding standardized error handling.
11
+ * It catches any errors thrown by the original function and processes them through the provided
12
+ * error handler, allowing for consistent error management across the application.
13
+ *
14
+ * @template TArgs - The argument types of the original function
15
+ * @template TFetchReturnType - The return type of the original function's Promise
16
+ * @template TCatchReturnType - The return type of the error handler function
17
+ *
18
+ * @param fetchFn - The original function that returns a Promise
19
+ * @param onCatchFn - The error handler function that processes any caught errors
20
+ *
21
+ * @returns A new function with the same signature as the original function,
22
+ * but with error handling applied. The returned function will resolve to either
23
+ * the successful result of the original function or the result of the error handler.
24
+ *
25
+ * @example
26
+ * // Basic usage with a string parameter
27
+ * const fetchUser = withCatch(
28
+ * someFetchFunction,
29
+ * (error) => ({ error: true, message: error.message })
30
+ * );
31
+ */
32
+ function withCatch(fetchFn, onCatchFn) {
33
+ return function () {
34
+ return fetchFn.apply(void 0, arguments)["catch"](onCatchFn);
35
+ };
36
+ }
37
+ // #sourceMappingURL=withCatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["withCatch","fetchFn","onCatchFn","apply","arguments"],"sources":["withCatch.ts"],"sourcesContent":["/**\n * Creates a wrapper around a function that safely handles errors using a provided error handler.\n *\n * This utility function enhances a Promise-returning function by adding standardized error handling.\n * It catches any errors thrown by the original function and processes them through the provided\n * error handler, allowing for consistent error management across the application.\n *\n * @template TArgs - The argument types of the original function\n * @template TFetchReturnType - The return type of the original function's Promise\n * @template TCatchReturnType - The return type of the error handler function\n *\n * @param fetchFn - The original function that returns a Promise\n * @param onCatchFn - The error handler function that processes any caught errors\n *\n * @returns A new function with the same signature as the original function,\n * but with error handling applied. The returned function will resolve to either\n * the successful result of the original function or the result of the error handler.\n *\n * @example\n * // Basic usage with a string parameter\n * const fetchUser = withCatch(\n * someFetchFunction,\n * (error) => ({ error: true, message: error.message })\n * );\n */\nexport function withCatch<TArgs extends unknown[], TFetchReturnType, TCatchReturnType>(\n fetchFn: (...args: TArgs) => Promise<TFetchReturnType>,\n onCatchFn: (reason: unknown) => TCatchReturnType,\n): (...args: TArgs) => Promise<TFetchReturnType | TCatchReturnType> {\n return (...args) => {\n return fetchFn(...args).catch(onCatchFn) as Promise<TFetchReturnType | TCatchReturnType>;\n };\n}\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,SAASA,CACrBC,OAAsD,EACtDC,SAAgD,EACgB;EAChE,OAAO,YAAa;IAChB,OAAOD,OAAO,CAAAE,KAAA,SAAAC,SAAQ,CAAC,SAAM,CAACF,SAAS,CAAC;EAC5C,CAAC;AACL","ignoreList":[]}
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import type { DataManager } from '../core';
3
+ export interface DataManagerProviderProps {
4
+ children: React.ReactNode;
5
+ dataManager: DataManager;
6
+ }
7
+ export declare const DataManagerProvider: React.FC<DataManagerProviderProps>;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.DataManagerProvider = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _DataManagerContext = require("./DataManagerContext");
9
+ var _jsxRuntime = require("react/jsx-runtime");
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ var DataManagerProvider = exports.DataManagerProvider = function DataManagerProvider(_ref) {
12
+ var children = _ref.children,
13
+ dataManager = _ref.dataManager;
14
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_DataManagerContext.DataManagerContext.Provider, {
15
+ value: dataManager,
16
+ children: children
17
+ });
18
+ };
19
+ // #sourceMappingURL=DataManagerProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","_interopRequireDefault","require","_DataManagerContext","_jsxRuntime","e","__esModule","default","DataManagerProvider","exports","_ref","children","dataManager","_jsx","DataManagerContext","Provider","value"],"sources":["DataManagerProvider.tsx"],"sourcesContent":["import React from 'react';\n\nimport type {DataManager} from '../core';\n\nimport {DataManagerContext} from './DataManagerContext';\n\nexport interface DataManagerProviderProps {\n children: React.ReactNode;\n dataManager: DataManager;\n}\n\nexport const DataManagerProvider: React.FC<DataManagerProviderProps> = ({\n children,\n dataManager,\n}) => {\n return (\n <DataManagerContext.Provider value={dataManager}>{children}</DataManagerContext.Provider>\n );\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAIA,IAAAC,mBAAA,GAAAD,OAAA;AAAwD,IAAAE,WAAA,GAAAF,OAAA;AAAA,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAOjD,IAAMG,mBAAuD,GAAAC,OAAA,CAAAD,mBAAA,GAAG,SAA1DA,mBAAuDA,CAAAE,IAAA,EAG9D;EAAA,IAFFC,QAAQ,GAAAD,IAAA,CAARC,QAAQ;IACRC,WAAW,GAAAF,IAAA,CAAXE,WAAW;EAEX,oBACI,IAAAC,eAAA,EAACC,sCAAkB,CAACC,QAAQ;IAACC,KAAK,EAAEJ,WAAY;IAAAD,QAAA,EAAEA;EAAQ,CAA8B,CAAC;AAEjG,CAAC","ignoreList":[]}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ var _react = _interopRequireDefault(require("react"));
4
+ var _react2 = require("@testing-library/react");
5
+ var _DataManagerContext = require("../DataManagerContext");
6
+ var _jsxRuntime = require("react/jsx-runtime");
7
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
8
+ describe('useDataManager', function () {
9
+ it('should return dataManager from context', function () {
10
+ var mockDataManager = {
11
+ normalizer: undefined,
12
+ optimisticUpdate: jest.fn(),
13
+ invalidateData: jest.fn(),
14
+ invalidateTag: jest.fn(),
15
+ invalidateTags: jest.fn(),
16
+ invalidateSource: jest.fn(),
17
+ resetSource: jest.fn(),
18
+ invalidateParams: jest.fn(),
19
+ resetParams: jest.fn(),
20
+ invalidateSourceTags: jest.fn()
21
+ };
22
+ var wrapper = function wrapper(_ref) {
23
+ var children = _ref.children;
24
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_DataManagerContext.DataManagerContext.Provider, {
25
+ value: mockDataManager,
26
+ children: children
27
+ });
28
+ };
29
+ var _renderHook = (0, _react2.renderHook)(function () {
30
+ return (0, _DataManagerContext.useDataManager)();
31
+ }, {
32
+ wrapper: wrapper
33
+ }),
34
+ result = _renderHook.result;
35
+ expect(result.current).toBe(mockDataManager);
36
+ });
37
+ it('should throw an error when dataManager is not provided', function () {
38
+ var consoleSpy = jest.spyOn(console, 'error').mockImplementation();
39
+ expect(function () {
40
+ (0, _react2.renderHook)(function () {
41
+ return (0, _DataManagerContext.useDataManager)();
42
+ });
43
+ }).toThrow('DataManager is not provided by context. Use DataManagerContext.Provider to do it');
44
+ consoleSpy.mockRestore();
45
+ });
46
+ });
47
+ // #sourceMappingURL=DataManagerContext.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","_interopRequireDefault","require","_react2","_DataManagerContext","_jsxRuntime","e","__esModule","default","describe","it","mockDataManager","normalizer","undefined","optimisticUpdate","jest","fn","invalidateData","invalidateTag","invalidateTags","invalidateSource","resetSource","invalidateParams","resetParams","invalidateSourceTags","wrapper","_ref","children","_jsx","DataManagerContext","Provider","value","_renderHook","renderHook","useDataManager","result","expect","current","toBe","consoleSpy","spyOn","console","mockImplementation","toThrow","mockRestore"],"sources":["DataManagerContext.test.tsx"],"sourcesContent":["import React from 'react';\n\nimport {renderHook} from '@testing-library/react';\n\nimport type {DataManager} from '../../core';\nimport {DataManagerContext, useDataManager} from '../DataManagerContext';\n\ndescribe('useDataManager', () => {\n it('should return dataManager from context', () => {\n const mockDataManager: DataManager = {\n normalizer: undefined,\n optimisticUpdate: jest.fn(),\n invalidateData: jest.fn(),\n invalidateTag: jest.fn(),\n invalidateTags: jest.fn(),\n invalidateSource: jest.fn(),\n resetSource: jest.fn(),\n invalidateParams: jest.fn(),\n resetParams: jest.fn(),\n invalidateSourceTags: jest.fn(),\n };\n\n const wrapper: React.FC<{children: React.ReactNode}> = ({children}) => (\n <DataManagerContext.Provider value={mockDataManager}>\n {children}\n </DataManagerContext.Provider>\n );\n\n const {result} = renderHook(() => useDataManager(), {wrapper});\n\n expect(result.current).toBe(mockDataManager);\n });\n\n it('should throw an error when dataManager is not provided', () => {\n const consoleSpy = jest.spyOn(console, 'error').mockImplementation();\n\n expect(() => {\n renderHook(() => useDataManager());\n }).toThrow(\n 'DataManager is not provided by context. Use DataManagerContext.Provider to do it',\n );\n\n consoleSpy.mockRestore();\n });\n});\n"],"mappings":";;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AAGA,IAAAE,mBAAA,GAAAF,OAAA;AAAyE,IAAAG,WAAA,GAAAH,OAAA;AAAA,SAAAD,uBAAAK,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEzEG,QAAQ,CAAC,gBAAgB,EAAE,YAAM;EAC7BC,EAAE,CAAC,wCAAwC,EAAE,YAAM;IAC/C,IAAMC,eAA4B,GAAG;MACjCC,UAAU,EAAEC,SAAS;MACrBC,gBAAgB,EAAEC,IAAI,CAACC,EAAE,CAAC,CAAC;MAC3BC,cAAc,EAAEF,IAAI,CAACC,EAAE,CAAC,CAAC;MACzBE,aAAa,EAAEH,IAAI,CAACC,EAAE,CAAC,CAAC;MACxBG,cAAc,EAAEJ,IAAI,CAACC,EAAE,CAAC,CAAC;MACzBI,gBAAgB,EAAEL,IAAI,CAACC,EAAE,CAAC,CAAC;MAC3BK,WAAW,EAAEN,IAAI,CAACC,EAAE,CAAC,CAAC;MACtBM,gBAAgB,EAAEP,IAAI,CAACC,EAAE,CAAC,CAAC;MAC3BO,WAAW,EAAER,IAAI,CAACC,EAAE,CAAC,CAAC;MACtBQ,oBAAoB,EAAET,IAAI,CAACC,EAAE,CAAC;IAClC,CAAC;IAED,IAAMS,OAA8C,GAAG,SAAjDA,OAA8CA,CAAAC,IAAA;MAAA,IAAKC,QAAQ,GAAAD,IAAA,CAARC,QAAQ;MAAA,oBAC7D,IAAAC,eAAA,EAACC,sCAAkB,CAACC,QAAQ;QAACC,KAAK,EAAEpB,eAAgB;QAAAgB,QAAA,EAC/CA;MAAQ,CACgB,CAAC;IAAA,CACjC;IAED,IAAAK,WAAA,GAAiB,IAAAC,kBAAU,EAAC;QAAA,OAAM,IAAAC,kCAAc,EAAC,CAAC;MAAA,GAAE;QAACT,OAAO,EAAPA;MAAO,CAAC,CAAC;MAAvDU,MAAM,GAAAH,WAAA,CAANG,MAAM;IAEbC,MAAM,CAACD,MAAM,CAACE,OAAO,CAAC,CAACC,IAAI,CAAC3B,eAAe,CAAC;EAChD,CAAC,CAAC;EAEFD,EAAE,CAAC,wDAAwD,EAAE,YAAM;IAC/D,IAAM6B,UAAU,GAAGxB,IAAI,CAACyB,KAAK,CAACC,OAAO,EAAE,OAAO,CAAC,CAACC,kBAAkB,CAAC,CAAC;IAEpEN,MAAM,CAAC,YAAM;MACT,IAAAH,kBAAU,EAAC;QAAA,OAAM,IAAAC,kCAAc,EAAC,CAAC;MAAA,EAAC;IACtC,CAAC,CAAC,CAACS,OAAO,CACN,kFACJ,CAAC;IAEDJ,UAAU,CAACK,WAAW,CAAC,CAAC;EAC5B,CAAC,CAAC;AACN,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+
3
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
4
+ var _react = _interopRequireDefault(require("react"));
5
+ var _react2 = require("@testing-library/react");
6
+ var _DataManagerContext = require("../DataManagerContext");
7
+ var _withDataManager = require("../withDataManager");
8
+ var _jsxRuntime = require("react/jsx-runtime");
9
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
+ jest.mock('../DataManagerContext', function () {
11
+ var originalModule = jest.requireActual('../DataManagerContext');
12
+ return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, originalModule), {}, {
13
+ useDataManager: jest.fn()
14
+ });
15
+ });
16
+ describe('withDataManager', function () {
17
+ var mockDataManager = {
18
+ normalizer: undefined,
19
+ optimisticUpdate: jest.fn(),
20
+ invalidateData: jest.fn(),
21
+ invalidateTag: jest.fn(),
22
+ invalidateTags: jest.fn(),
23
+ invalidateSource: jest.fn(),
24
+ resetSource: jest.fn(),
25
+ invalidateParams: jest.fn(),
26
+ resetParams: jest.fn(),
27
+ invalidateSourceTags: jest.fn()
28
+ };
29
+ beforeEach(function () {
30
+ jest.clearAllMocks();
31
+ _DataManagerContext.useDataManager.mockReturnValue(mockDataManager);
32
+ });
33
+ it('should pass dataManager to wrapped component', function () {
34
+ var TestComponent = function TestComponent(_ref) {
35
+ var dataManager = _ref.dataManager;
36
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
37
+ "data-testid": "test-component",
38
+ children: dataManager ? 'DataManager provided' : 'No DataManager'
39
+ });
40
+ };
41
+ var WrappedComponent = (0, _withDataManager.withDataManager)(TestComponent);
42
+ (0, _react2.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(WrappedComponent, {}));
43
+ expect(_react2.screen.getByTestId('test-component')).toHaveTextContent('DataManager provided');
44
+ });
45
+ it('should pass through additional props', function () {
46
+ var TestComponent = function TestComponent(_ref2) {
47
+ var dataManager = _ref2.dataManager,
48
+ testProp = _ref2.testProp;
49
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
50
+ "data-testid": "test-component",
51
+ children: dataManager ? "DataManager provided, testProp: ".concat(testProp) : 'No DataManager'
52
+ });
53
+ };
54
+ var WrappedComponent = (0, _withDataManager.withDataManager)(TestComponent);
55
+ (0, _react2.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(WrappedComponent, {
56
+ testProp: "test value"
57
+ }));
58
+ expect(_react2.screen.getByTestId('test-component')).toHaveTextContent('DataManager provided, testProp: test value');
59
+ });
60
+ });
61
+ // #sourceMappingURL=withDataManager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","_interopRequireDefault","require","_react2","_DataManagerContext","_withDataManager","_jsxRuntime","e","__esModule","default","jest","mock","originalModule","requireActual","_objectSpread","useDataManager","fn","describe","mockDataManager","normalizer","undefined","optimisticUpdate","invalidateData","invalidateTag","invalidateTags","invalidateSource","resetSource","invalidateParams","resetParams","invalidateSourceTags","beforeEach","clearAllMocks","mockReturnValue","it","TestComponent","_ref","dataManager","_jsx","children","WrappedComponent","withDataManager","render","expect","screen","getByTestId","toHaveTextContent","_ref2","testProp","concat"],"sources":["withDataManager.test.tsx"],"sourcesContent":["import React from 'react';\n\nimport {render, screen} from '@testing-library/react';\n\nimport type {DataManager} from '../../core';\nimport {useDataManager} from '../DataManagerContext';\nimport type {WithDataManagerProps} from '../withDataManager';\nimport {withDataManager} from '../withDataManager';\n\njest.mock('../DataManagerContext', () => {\n const originalModule = jest.requireActual('../DataManagerContext');\n return {\n ...originalModule,\n useDataManager: jest.fn(),\n };\n});\n\ndescribe('withDataManager', () => {\n const mockDataManager: DataManager = {\n normalizer: undefined,\n optimisticUpdate: jest.fn(),\n invalidateData: jest.fn(),\n invalidateTag: jest.fn(),\n invalidateTags: jest.fn(),\n invalidateSource: jest.fn(),\n resetSource: jest.fn(),\n invalidateParams: jest.fn(),\n resetParams: jest.fn(),\n invalidateSourceTags: jest.fn(),\n };\n\n beforeEach(() => {\n jest.clearAllMocks();\n\n (useDataManager as jest.Mock).mockReturnValue(mockDataManager);\n });\n\n it('should pass dataManager to wrapped component', () => {\n const TestComponent: React.FC<WithDataManagerProps> = ({dataManager}) => (\n <div data-testid=\"test-component\">\n {dataManager ? 'DataManager provided' : 'No DataManager'}\n </div>\n );\n const WrappedComponent = withDataManager(TestComponent);\n\n render(<WrappedComponent />);\n\n expect(screen.getByTestId('test-component')).toHaveTextContent('DataManager provided');\n });\n\n it('should pass through additional props', () => {\n const TestComponent: React.FC<WithDataManagerProps & {testProp: string}> = ({\n dataManager,\n testProp,\n }) => (\n <div data-testid=\"test-component\">\n {dataManager ? `DataManager provided, testProp: ${testProp}` : 'No DataManager'}\n </div>\n );\n const WrappedComponent = withDataManager(TestComponent);\n\n render(<WrappedComponent testProp=\"test value\" />);\n\n expect(screen.getByTestId('test-component')).toHaveTextContent(\n 'DataManager provided, testProp: test value',\n );\n });\n});\n"],"mappings":"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","ignoreList":[]}