@tanstack/react-query 5.0.0-alpha.9 → 5.0.0-alpha.90

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 (411) hide show
  1. package/build/codemods/remove-overloads/remove-overloads.js +59 -0
  2. package/build/codemods/remove-overloads/transformers/filter-aware-usage-transformer.js +153 -0
  3. package/build/codemods/remove-overloads/transformers/query-fn-aware-usage-transformer.js +188 -0
  4. package/build/codemods/remove-overloads/utils/index.js +124 -0
  5. package/build/codemods/remove-overloads/utils/unknown-usage-error.js +27 -0
  6. package/build/codemods/rename-hydrate/rename-hydrate.js +55 -0
  7. package/build/codemods/rename-properties/rename-properties.js +41 -0
  8. package/build/codemods/src/utils/index.js +205 -0
  9. package/build/codemods/src/v4/key-transformation.js +138 -0
  10. package/build/codemods/src/v4/replace-import-specifier.js +25 -0
  11. package/build/codemods/transformers/query-cache-transformer.js +116 -0
  12. package/build/codemods/transformers/query-client-transformer.js +48 -0
  13. package/build/codemods/transformers/use-query-like-transformer.js +32 -0
  14. package/build/codemods/utils/replacers/key-replacer.js +164 -0
  15. package/build/legacy/HydrationBoundary.cjs +60 -0
  16. package/build/legacy/HydrationBoundary.cjs.map +1 -0
  17. package/build/legacy/HydrationBoundary.d.cts +12 -0
  18. package/build/legacy/HydrationBoundary.d.ts +12 -0
  19. package/build/legacy/HydrationBoundary.js +26 -0
  20. package/build/legacy/HydrationBoundary.js.map +1 -0
  21. package/build/legacy/QueryClientProvider.cjs +71 -0
  22. package/build/legacy/QueryClientProvider.cjs.map +1 -0
  23. package/build/legacy/QueryClientProvider.d.cts +12 -0
  24. package/build/legacy/QueryClientProvider.d.ts +12 -0
  25. package/build/legacy/QueryClientProvider.js +35 -0
  26. package/build/legacy/QueryClientProvider.js.map +1 -0
  27. package/build/legacy/QueryErrorResetBoundary.cjs +66 -0
  28. package/build/legacy/QueryErrorResetBoundary.cjs.map +1 -0
  29. package/build/legacy/QueryErrorResetBoundary.d.cts +14 -0
  30. package/build/legacy/QueryErrorResetBoundary.d.ts +14 -0
  31. package/build/legacy/QueryErrorResetBoundary.js +31 -0
  32. package/build/legacy/QueryErrorResetBoundary.js.map +1 -0
  33. package/build/legacy/errorBoundaryUtils.cjs +67 -0
  34. package/build/legacy/errorBoundaryUtils.cjs.map +1 -0
  35. package/build/legacy/errorBoundaryUtils.d.cts +14 -0
  36. package/build/legacy/errorBoundaryUtils.d.ts +14 -0
  37. package/build/legacy/errorBoundaryUtils.js +31 -0
  38. package/build/legacy/errorBoundaryUtils.js.map +1 -0
  39. package/build/legacy/index.cjs +85 -0
  40. package/build/legacy/index.cjs.map +1 -0
  41. package/build/legacy/index.d.cts +17 -0
  42. package/build/legacy/index.d.ts +17 -0
  43. package/build/legacy/index.js +46 -0
  44. package/build/legacy/index.js.map +1 -0
  45. package/build/legacy/infiniteQueryOptions.cjs +33 -0
  46. package/build/legacy/infiniteQueryOptions.cjs.map +1 -0
  47. package/build/legacy/infiniteQueryOptions.d.cts +13 -0
  48. package/build/legacy/infiniteQueryOptions.d.ts +13 -0
  49. package/build/legacy/infiniteQueryOptions.js +8 -0
  50. package/build/legacy/infiniteQueryOptions.js.map +1 -0
  51. package/build/legacy/isRestoring.cjs +47 -0
  52. package/build/legacy/isRestoring.cjs.map +1 -0
  53. package/build/legacy/isRestoring.d.cts +6 -0
  54. package/build/legacy/isRestoring.d.ts +6 -0
  55. package/build/legacy/isRestoring.js +12 -0
  56. package/build/legacy/isRestoring.js.map +1 -0
  57. package/build/legacy/queryOptions.cjs +33 -0
  58. package/build/legacy/queryOptions.cjs.map +1 -0
  59. package/build/legacy/queryOptions.d.cts +13 -0
  60. package/build/legacy/queryOptions.d.ts +13 -0
  61. package/build/legacy/queryOptions.js +8 -0
  62. package/build/legacy/queryOptions.js.map +1 -0
  63. package/build/legacy/suspense.cjs +48 -0
  64. package/build/legacy/suspense.cjs.map +1 -0
  65. package/build/legacy/suspense.d.cts +10 -0
  66. package/build/legacy/suspense.d.ts +10 -0
  67. package/build/legacy/suspense.js +20 -0
  68. package/build/legacy/suspense.js.map +1 -0
  69. package/build/legacy/types.cjs +19 -0
  70. package/build/legacy/types.cjs.map +1 -0
  71. package/build/legacy/types.d.cts +34 -0
  72. package/build/legacy/types.d.ts +34 -0
  73. package/build/legacy/types.js +1 -0
  74. package/build/legacy/types.js.map +1 -0
  75. package/build/legacy/useBaseQuery.cjs +92 -0
  76. package/build/legacy/useBaseQuery.cjs.map +1 -0
  77. package/build/legacy/useBaseQuery.d.cts +92 -0
  78. package/build/legacy/useBaseQuery.d.ts +92 -0
  79. package/build/legacy/useBaseQuery.js +62 -0
  80. package/build/legacy/useBaseQuery.js.map +1 -0
  81. package/build/legacy/useInfiniteQuery.cjs +41 -0
  82. package/build/legacy/useInfiniteQuery.cjs.map +1 -0
  83. package/build/legacy/useInfiniteQuery.d.cts +8 -0
  84. package/build/legacy/useInfiniteQuery.d.ts +8 -0
  85. package/build/legacy/useInfiniteQuery.js +17 -0
  86. package/build/legacy/useInfiniteQuery.js.map +1 -0
  87. package/build/legacy/useIsFetching.cjs +56 -0
  88. package/build/legacy/useIsFetching.cjs.map +1 -0
  89. package/build/legacy/useIsFetching.d.cts +5 -0
  90. package/build/legacy/useIsFetching.d.ts +5 -0
  91. package/build/legacy/useIsFetching.js +22 -0
  92. package/build/legacy/useIsFetching.js.map +1 -0
  93. package/build/legacy/useMutation.cjs +77 -0
  94. package/build/legacy/useMutation.cjs.map +1 -0
  95. package/build/legacy/useMutation.d.cts +6 -0
  96. package/build/legacy/useMutation.d.ts +6 -0
  97. package/build/legacy/useMutation.js +43 -0
  98. package/build/legacy/useMutation.js.map +1 -0
  99. package/build/legacy/useMutationState.cjs +88 -0
  100. package/build/legacy/useMutationState.cjs.map +1 -0
  101. package/build/legacy/useMutationState.d.cts +10 -0
  102. package/build/legacy/useMutationState.d.ts +10 -0
  103. package/build/legacy/useMutationState.js +53 -0
  104. package/build/legacy/useMutationState.js.map +1 -0
  105. package/build/legacy/useQueries.cjs +128 -0
  106. package/build/legacy/useQueries.cjs.map +1 -0
  107. package/build/legacy/useQueries.d.cts +53 -0
  108. package/build/{lib → legacy}/useQueries.d.ts +14 -11
  109. package/build/legacy/useQueries.js +103 -0
  110. package/build/legacy/useQueries.js.map +1 -0
  111. package/build/legacy/useQuery.cjs +36 -0
  112. package/build/legacy/useQuery.cjs.map +1 -0
  113. package/build/legacy/useQuery.d.cts +8 -0
  114. package/build/legacy/useQuery.d.ts +8 -0
  115. package/build/legacy/useQuery.js +12 -0
  116. package/build/legacy/useQuery.js.map +1 -0
  117. package/build/legacy/useSuspenseInfiniteQuery.cjs +46 -0
  118. package/build/legacy/useSuspenseInfiniteQuery.cjs.map +1 -0
  119. package/build/legacy/useSuspenseInfiniteQuery.d.cts +6 -0
  120. package/build/legacy/useSuspenseInfiniteQuery.d.ts +6 -0
  121. package/build/legacy/useSuspenseInfiniteQuery.js +22 -0
  122. package/build/legacy/useSuspenseInfiniteQuery.js.map +1 -0
  123. package/build/legacy/useSuspenseQuery.cjs +45 -0
  124. package/build/legacy/useSuspenseQuery.cjs.map +1 -0
  125. package/build/legacy/useSuspenseQuery.d.cts +6 -0
  126. package/build/legacy/useSuspenseQuery.d.ts +6 -0
  127. package/build/legacy/useSuspenseQuery.js +21 -0
  128. package/build/legacy/useSuspenseQuery.js.map +1 -0
  129. package/build/legacy/utils.cjs +36 -0
  130. package/build/legacy/utils.cjs.map +1 -0
  131. package/build/legacy/utils.d.cts +3 -0
  132. package/build/legacy/utils.d.ts +3 -0
  133. package/build/legacy/utils.js +11 -0
  134. package/build/legacy/utils.js.map +1 -0
  135. package/build/modern/HydrationBoundary.cjs +60 -0
  136. package/build/modern/HydrationBoundary.cjs.map +1 -0
  137. package/build/modern/HydrationBoundary.d.cts +12 -0
  138. package/build/modern/HydrationBoundary.d.ts +12 -0
  139. package/build/modern/HydrationBoundary.js +26 -0
  140. package/build/modern/HydrationBoundary.js.map +1 -0
  141. package/build/modern/QueryClientProvider.cjs +71 -0
  142. package/build/modern/QueryClientProvider.cjs.map +1 -0
  143. package/build/modern/QueryClientProvider.d.cts +12 -0
  144. package/build/modern/QueryClientProvider.d.ts +12 -0
  145. package/build/modern/QueryClientProvider.js +35 -0
  146. package/build/modern/QueryClientProvider.js.map +1 -0
  147. package/build/modern/QueryErrorResetBoundary.cjs +66 -0
  148. package/build/modern/QueryErrorResetBoundary.cjs.map +1 -0
  149. package/build/modern/QueryErrorResetBoundary.d.cts +14 -0
  150. package/build/modern/QueryErrorResetBoundary.d.ts +14 -0
  151. package/build/modern/QueryErrorResetBoundary.js +31 -0
  152. package/build/modern/QueryErrorResetBoundary.js.map +1 -0
  153. package/build/modern/errorBoundaryUtils.cjs +67 -0
  154. package/build/modern/errorBoundaryUtils.cjs.map +1 -0
  155. package/build/modern/errorBoundaryUtils.d.cts +14 -0
  156. package/build/modern/errorBoundaryUtils.d.ts +14 -0
  157. package/build/modern/errorBoundaryUtils.js +31 -0
  158. package/build/modern/errorBoundaryUtils.js.map +1 -0
  159. package/build/modern/index.cjs +85 -0
  160. package/build/modern/index.cjs.map +1 -0
  161. package/build/modern/index.d.cts +17 -0
  162. package/build/modern/index.d.ts +17 -0
  163. package/build/modern/index.js +46 -0
  164. package/build/modern/index.js.map +1 -0
  165. package/build/modern/infiniteQueryOptions.cjs +33 -0
  166. package/build/modern/infiniteQueryOptions.cjs.map +1 -0
  167. package/build/modern/infiniteQueryOptions.d.cts +13 -0
  168. package/build/modern/infiniteQueryOptions.d.ts +13 -0
  169. package/build/modern/infiniteQueryOptions.js +8 -0
  170. package/build/modern/infiniteQueryOptions.js.map +1 -0
  171. package/build/modern/isRestoring.cjs +47 -0
  172. package/build/modern/isRestoring.cjs.map +1 -0
  173. package/build/modern/isRestoring.d.cts +6 -0
  174. package/build/modern/isRestoring.d.ts +6 -0
  175. package/build/modern/isRestoring.js +12 -0
  176. package/build/modern/isRestoring.js.map +1 -0
  177. package/build/modern/queryOptions.cjs +33 -0
  178. package/build/modern/queryOptions.cjs.map +1 -0
  179. package/build/modern/queryOptions.d.cts +13 -0
  180. package/build/modern/queryOptions.d.ts +13 -0
  181. package/build/modern/queryOptions.js +8 -0
  182. package/build/modern/queryOptions.js.map +1 -0
  183. package/build/modern/suspense.cjs +48 -0
  184. package/build/modern/suspense.cjs.map +1 -0
  185. package/build/modern/suspense.d.cts +10 -0
  186. package/build/modern/suspense.d.ts +10 -0
  187. package/build/modern/suspense.js +20 -0
  188. package/build/modern/suspense.js.map +1 -0
  189. package/build/modern/types.cjs +19 -0
  190. package/build/modern/types.cjs.map +1 -0
  191. package/build/modern/types.d.cts +34 -0
  192. package/build/modern/types.d.ts +34 -0
  193. package/build/modern/types.js +1 -0
  194. package/build/modern/types.js.map +1 -0
  195. package/build/modern/useBaseQuery.cjs +92 -0
  196. package/build/modern/useBaseQuery.cjs.map +1 -0
  197. package/build/modern/useBaseQuery.d.cts +92 -0
  198. package/build/modern/useBaseQuery.d.ts +92 -0
  199. package/build/modern/useBaseQuery.js +62 -0
  200. package/build/modern/useBaseQuery.js.map +1 -0
  201. package/build/modern/useInfiniteQuery.cjs +41 -0
  202. package/build/modern/useInfiniteQuery.cjs.map +1 -0
  203. package/build/modern/useInfiniteQuery.d.cts +8 -0
  204. package/build/modern/useInfiniteQuery.d.ts +8 -0
  205. package/build/modern/useInfiniteQuery.js +17 -0
  206. package/build/modern/useInfiniteQuery.js.map +1 -0
  207. package/build/modern/useIsFetching.cjs +56 -0
  208. package/build/modern/useIsFetching.cjs.map +1 -0
  209. package/build/modern/useIsFetching.d.cts +5 -0
  210. package/build/modern/useIsFetching.d.ts +5 -0
  211. package/build/modern/useIsFetching.js +22 -0
  212. package/build/modern/useIsFetching.js.map +1 -0
  213. package/build/modern/useMutation.cjs +77 -0
  214. package/build/modern/useMutation.cjs.map +1 -0
  215. package/build/modern/useMutation.d.cts +6 -0
  216. package/build/modern/useMutation.d.ts +6 -0
  217. package/build/modern/useMutation.js +43 -0
  218. package/build/modern/useMutation.js.map +1 -0
  219. package/build/modern/useMutationState.cjs +88 -0
  220. package/build/modern/useMutationState.cjs.map +1 -0
  221. package/build/modern/useMutationState.d.cts +10 -0
  222. package/build/modern/useMutationState.d.ts +10 -0
  223. package/build/modern/useMutationState.js +53 -0
  224. package/build/modern/useMutationState.js.map +1 -0
  225. package/build/modern/useQueries.cjs +125 -0
  226. package/build/modern/useQueries.cjs.map +1 -0
  227. package/build/modern/useQueries.d.cts +53 -0
  228. package/build/modern/useQueries.d.ts +53 -0
  229. package/build/modern/useQueries.js +100 -0
  230. package/build/modern/useQueries.js.map +1 -0
  231. package/build/modern/useQuery.cjs +36 -0
  232. package/build/modern/useQuery.cjs.map +1 -0
  233. package/build/modern/useQuery.d.cts +8 -0
  234. package/build/modern/useQuery.d.ts +8 -0
  235. package/build/modern/useQuery.js +12 -0
  236. package/build/modern/useQuery.js.map +1 -0
  237. package/build/modern/useSuspenseInfiniteQuery.cjs +46 -0
  238. package/build/modern/useSuspenseInfiniteQuery.cjs.map +1 -0
  239. package/build/modern/useSuspenseInfiniteQuery.d.cts +6 -0
  240. package/build/modern/useSuspenseInfiniteQuery.d.ts +6 -0
  241. package/build/modern/useSuspenseInfiniteQuery.js +22 -0
  242. package/build/modern/useSuspenseInfiniteQuery.js.map +1 -0
  243. package/build/modern/useSuspenseQuery.cjs +45 -0
  244. package/build/modern/useSuspenseQuery.cjs.map +1 -0
  245. package/build/modern/useSuspenseQuery.d.cts +6 -0
  246. package/build/modern/useSuspenseQuery.d.ts +6 -0
  247. package/build/modern/useSuspenseQuery.js +21 -0
  248. package/build/modern/useSuspenseQuery.js.map +1 -0
  249. package/build/modern/utils.cjs +36 -0
  250. package/build/modern/utils.cjs.map +1 -0
  251. package/build/modern/utils.d.cts +3 -0
  252. package/build/modern/utils.d.ts +3 -0
  253. package/build/modern/utils.js +11 -0
  254. package/build/modern/utils.js.map +1 -0
  255. package/package.json +29 -17
  256. package/src/HydrationBoundary.tsx +1 -1
  257. package/src/__tests__/HydrationBoundary.test.tsx +5 -5
  258. package/src/__tests__/QueryClientProvider.test.tsx +2 -2
  259. package/src/__tests__/QueryResetErrorBoundary.test.tsx +753 -621
  260. package/src/__tests__/ssr-hydration.test.tsx +4 -4
  261. package/src/__tests__/ssr.test.tsx +2 -2
  262. package/src/__tests__/suspense.test.tsx +8 -90
  263. package/src/__tests__/useInfiniteQuery.test.tsx +36 -74
  264. package/src/__tests__/useInfiniteQuery.type.test.tsx +2 -29
  265. package/src/__tests__/useIsFetching.test.tsx +1 -1
  266. package/src/__tests__/useMutation.test.tsx +22 -23
  267. package/src/__tests__/useMutationState.test.tsx +23 -0
  268. package/src/__tests__/useQueries.test.tsx +214 -91
  269. package/src/__tests__/useQuery.test.tsx +431 -453
  270. package/src/__tests__/useQuery.types.test.tsx +22 -1
  271. package/src/__tests__/utils.tsx +11 -5
  272. package/src/errorBoundaryUtils.ts +7 -7
  273. package/src/index.ts +4 -0
  274. package/src/infiniteQueryOptions.ts +93 -0
  275. package/src/queryOptions.ts +42 -0
  276. package/src/suspense.ts +9 -15
  277. package/src/types.ts +50 -8
  278. package/src/useBaseQuery.ts +14 -26
  279. package/src/useInfiniteQuery.ts +50 -7
  280. package/src/useIsFetching.ts +1 -1
  281. package/src/useMutation.ts +4 -4
  282. package/src/useMutationState.ts +8 -8
  283. package/src/useQueries.ts +53 -36
  284. package/src/useQuery.ts +6 -21
  285. package/src/useSuspenseInfiniteQuery.ts +47 -0
  286. package/src/useSuspenseQuery.ts +26 -0
  287. package/build/lib/HydrationBoundary.d.ts +0 -9
  288. package/build/lib/HydrationBoundary.esm.js +0 -29
  289. package/build/lib/HydrationBoundary.esm.js.map +0 -1
  290. package/build/lib/HydrationBoundary.js +0 -50
  291. package/build/lib/HydrationBoundary.js.map +0 -1
  292. package/build/lib/HydrationBoundary.mjs +0 -29
  293. package/build/lib/HydrationBoundary.mjs.map +0 -1
  294. package/build/lib/QueryClientProvider.d.ts +0 -9
  295. package/build/lib/QueryClientProvider.esm.js +0 -31
  296. package/build/lib/QueryClientProvider.esm.js.map +0 -1
  297. package/build/lib/QueryClientProvider.js +0 -54
  298. package/build/lib/QueryClientProvider.js.map +0 -1
  299. package/build/lib/QueryClientProvider.mjs +0 -31
  300. package/build/lib/QueryClientProvider.mjs.map +0 -1
  301. package/build/lib/QueryErrorResetBoundary.d.ts +0 -11
  302. package/build/lib/QueryErrorResetBoundary.esm.js +0 -38
  303. package/build/lib/QueryErrorResetBoundary.esm.js.map +0 -1
  304. package/build/lib/QueryErrorResetBoundary.js +0 -60
  305. package/build/lib/QueryErrorResetBoundary.js.map +0 -1
  306. package/build/lib/QueryErrorResetBoundary.mjs +0 -38
  307. package/build/lib/QueryErrorResetBoundary.mjs.map +0 -1
  308. package/build/lib/__tests__/HydrationBoundary.test.d.ts +0 -1
  309. package/build/lib/__tests__/QueryClientProvider.test.d.ts +0 -1
  310. package/build/lib/__tests__/QueryResetErrorBoundary.test.d.ts +0 -6
  311. package/build/lib/__tests__/ssr-hydration.test.d.ts +0 -1
  312. package/build/lib/__tests__/ssr.test.d.ts +0 -1
  313. package/build/lib/__tests__/suspense.test.d.ts +0 -1
  314. package/build/lib/__tests__/useInfiniteQuery.test.d.ts +0 -1
  315. package/build/lib/__tests__/useInfiniteQuery.type.test.d.ts +0 -1
  316. package/build/lib/__tests__/useIsFetching.test.d.ts +0 -1
  317. package/build/lib/__tests__/useMutation.test.d.ts +0 -1
  318. package/build/lib/__tests__/useMutationState.test.d.ts +0 -1
  319. package/build/lib/__tests__/useQueries.test.d.ts +0 -1
  320. package/build/lib/__tests__/useQuery.test.d.ts +0 -1
  321. package/build/lib/__tests__/useQuery.types.test.d.ts +0 -1
  322. package/build/lib/__tests__/utils.d.ts +0 -28
  323. package/build/lib/errorBoundaryUtils.d.ts +0 -10
  324. package/build/lib/errorBoundaryUtils.esm.js +0 -28
  325. package/build/lib/errorBoundaryUtils.esm.js.map +0 -1
  326. package/build/lib/errorBoundaryUtils.js +0 -51
  327. package/build/lib/errorBoundaryUtils.js.map +0 -1
  328. package/build/lib/errorBoundaryUtils.mjs +0 -28
  329. package/build/lib/errorBoundaryUtils.mjs.map +0 -1
  330. package/build/lib/index.d.ts +0 -16
  331. package/build/lib/index.esm.js +0 -12
  332. package/build/lib/index.esm.js.map +0 -1
  333. package/build/lib/index.js +0 -38
  334. package/build/lib/index.js.map +0 -1
  335. package/build/lib/index.mjs +0 -12
  336. package/build/lib/index.mjs.map +0 -1
  337. package/build/lib/isRestoring.d.ts +0 -3
  338. package/build/lib/isRestoring.esm.js +0 -9
  339. package/build/lib/isRestoring.esm.js.map +0 -1
  340. package/build/lib/isRestoring.js +0 -31
  341. package/build/lib/isRestoring.js.map +0 -1
  342. package/build/lib/isRestoring.mjs +0 -9
  343. package/build/lib/isRestoring.mjs.map +0 -1
  344. package/build/lib/suspense.d.ts +0 -9
  345. package/build/lib/suspense.esm.js +0 -24
  346. package/build/lib/suspense.esm.js.map +0 -1
  347. package/build/lib/suspense.js +0 -29
  348. package/build/lib/suspense.js.map +0 -1
  349. package/build/lib/suspense.mjs +0 -24
  350. package/build/lib/suspense.mjs.map +0 -1
  351. package/build/lib/types.d.ts +0 -26
  352. package/build/lib/useBaseQuery.d.ts +0 -3
  353. package/build/lib/useBaseQuery.esm.js +0 -63
  354. package/build/lib/useBaseQuery.esm.js.map +0 -1
  355. package/build/lib/useBaseQuery.js +0 -84
  356. package/build/lib/useBaseQuery.js.map +0 -1
  357. package/build/lib/useBaseQuery.mjs +0 -63
  358. package/build/lib/useBaseQuery.mjs.map +0 -1
  359. package/build/lib/useInfiniteQuery.d.ts +0 -3
  360. package/build/lib/useInfiniteQuery.esm.js +0 -13
  361. package/build/lib/useInfiniteQuery.esm.js.map +0 -1
  362. package/build/lib/useInfiniteQuery.js +0 -15
  363. package/build/lib/useInfiniteQuery.js.map +0 -1
  364. package/build/lib/useInfiniteQuery.mjs +0 -13
  365. package/build/lib/useInfiniteQuery.mjs.map +0 -1
  366. package/build/lib/useIsFetching.d.ts +0 -2
  367. package/build/lib/useIsFetching.esm.js +0 -13
  368. package/build/lib/useIsFetching.esm.js.map +0 -1
  369. package/build/lib/useIsFetching.js +0 -34
  370. package/build/lib/useIsFetching.js.map +0 -1
  371. package/build/lib/useIsFetching.mjs +0 -13
  372. package/build/lib/useIsFetching.mjs.map +0 -1
  373. package/build/lib/useMutation.d.ts +0 -3
  374. package/build/lib/useMutation.esm.js +0 -33
  375. package/build/lib/useMutation.esm.js.map +0 -1
  376. package/build/lib/useMutation.js +0 -54
  377. package/build/lib/useMutation.js.map +0 -1
  378. package/build/lib/useMutation.mjs +0 -33
  379. package/build/lib/useMutation.mjs.map +0 -1
  380. package/build/lib/useMutationState.d.ts +0 -8
  381. package/build/lib/useMutationState.esm.js +0 -38
  382. package/build/lib/useMutationState.esm.js.map +0 -1
  383. package/build/lib/useMutationState.js +0 -60
  384. package/build/lib/useMutationState.js.map +0 -1
  385. package/build/lib/useMutationState.mjs +0 -38
  386. package/build/lib/useMutationState.mjs.map +0 -1
  387. package/build/lib/useQueries.esm.js +0 -73
  388. package/build/lib/useQueries.esm.js.map +0 -1
  389. package/build/lib/useQueries.js +0 -94
  390. package/build/lib/useQueries.js.map +0 -1
  391. package/build/lib/useQueries.mjs +0 -70
  392. package/build/lib/useQueries.mjs.map +0 -1
  393. package/build/lib/useQuery.d.ts +0 -11
  394. package/build/lib/useQuery.esm.js +0 -12
  395. package/build/lib/useQuery.esm.js.map +0 -1
  396. package/build/lib/useQuery.js +0 -14
  397. package/build/lib/useQuery.js.map +0 -1
  398. package/build/lib/useQuery.mjs +0 -12
  399. package/build/lib/useQuery.mjs.map +0 -1
  400. package/build/lib/utils.d.ts +0 -1
  401. package/build/lib/utils.esm.js +0 -10
  402. package/build/lib/utils.esm.js.map +0 -1
  403. package/build/lib/utils.js +0 -12
  404. package/build/lib/utils.js.map +0 -1
  405. package/build/lib/utils.mjs +0 -10
  406. package/build/lib/utils.mjs.map +0 -1
  407. package/build/umd/index.development.js +0 -3040
  408. package/build/umd/index.development.js.map +0 -1
  409. package/build/umd/index.production.js +0 -2
  410. package/build/umd/index.production.js.map +0 -1
  411. /package/src/{isRestoring.tsx → isRestoring.ts} +0 -0
@@ -2,9 +2,9 @@ import { fireEvent, waitFor } from '@testing-library/react'
2
2
  import { ErrorBoundary } from 'react-error-boundary'
3
3
  import * as React from 'react'
4
4
 
5
- import { createQueryClient, queryKey, renderWithClient, sleep } from './utils'
6
- import { QueryCache, QueryErrorResetBoundary, useQuery } from '..'
7
5
  import { vi } from 'vitest'
6
+ import { QueryCache, QueryErrorResetBoundary, useQueries, useQuery } from '..'
7
+ import { createQueryClient, queryKey, renderWithClient, sleep } from './utils'
8
8
 
9
9
  // TODO: This should be removed with the types for react-error-boundary get updated.
10
10
  declare module 'react-error-boundary' {
@@ -17,647 +17,779 @@ describe('QueryErrorResetBoundary', () => {
17
17
  const queryCache = new QueryCache()
18
18
  const queryClient = createQueryClient({ queryCache })
19
19
 
20
- it('should retry fetch if the reset error boundary has been reset', async () => {
21
- const consoleMock = vi
22
- .spyOn(console, 'error')
23
- .mockImplementation(() => undefined)
24
- const key = queryKey()
25
-
26
- let succeed = false
27
-
28
- function Page() {
29
- const { data } = useQuery({
30
- queryKey: key,
31
- queryFn: async () => {
32
- await sleep(10)
33
- if (!succeed) {
34
- throw new Error('Error')
35
- } else {
36
- return 'data'
37
- }
38
- },
39
- retry: false,
40
- throwErrors: true,
41
- })
42
- return <div>{data}</div>
43
- }
44
-
45
- const rendered = renderWithClient(
46
- queryClient,
47
- <QueryErrorResetBoundary>
48
- {({ reset }) => (
49
- <ErrorBoundary
50
- onReset={reset}
51
- fallbackRender={({ resetErrorBoundary }) => (
52
- <div>
53
- <div>error boundary</div>
54
- <button
55
- onClick={() => {
56
- resetErrorBoundary()
57
- }}
58
- >
59
- retry
60
- </button>
61
- </div>
62
- )}
63
- >
64
- <Page />
65
- </ErrorBoundary>
66
- )}
67
- </QueryErrorResetBoundary>,
68
- )
69
-
70
- await waitFor(() => rendered.getByText('error boundary'))
71
- await waitFor(() => rendered.getByText('retry'))
72
- succeed = true
73
- fireEvent.click(rendered.getByText('retry'))
74
- await waitFor(() => rendered.getByText('data'))
75
- consoleMock.mockRestore()
76
- })
77
-
78
- it('should not throw error if query is disabled', async () => {
79
- const consoleMock = vi
80
- .spyOn(console, 'error')
81
- .mockImplementation(() => undefined)
82
- const key = queryKey()
83
-
84
- let succeed = false
85
-
86
- function Page() {
87
- const { data, status } = useQuery({
88
- queryKey: key,
89
- queryFn: async () => {
90
- await sleep(10)
91
- if (!succeed) {
92
- throw new Error('Error')
93
- } else {
94
- return 'data'
95
- }
96
- },
97
- retry: false,
98
- enabled: !succeed,
99
- throwErrors: true,
100
- })
101
- return (
102
- <div>
103
- <div>status: {status}</div>
104
- <div>{data}</div>
105
- </div>
20
+ describe('useQuery', () => {
21
+ it('should retry fetch if the reset error boundary has been reset', async () => {
22
+ const consoleMock = vi
23
+ .spyOn(console, 'error')
24
+ .mockImplementation(() => undefined)
25
+ const key = queryKey()
26
+
27
+ let succeed = false
28
+
29
+ function Page() {
30
+ const { data } = useQuery({
31
+ queryKey: key,
32
+ queryFn: async () => {
33
+ await sleep(10)
34
+ if (!succeed) {
35
+ throw new Error('Error')
36
+ } else {
37
+ return 'data'
38
+ }
39
+ },
40
+ retry: false,
41
+ throwOnError: true,
42
+ })
43
+ return <div>{data}</div>
44
+ }
45
+
46
+ const rendered = renderWithClient(
47
+ queryClient,
48
+ <QueryErrorResetBoundary>
49
+ {({ reset }) => (
50
+ <ErrorBoundary
51
+ onReset={reset}
52
+ fallbackRender={({ resetErrorBoundary }) => (
53
+ <div>
54
+ <div>error boundary</div>
55
+ <button
56
+ onClick={() => {
57
+ resetErrorBoundary()
58
+ }}
59
+ >
60
+ retry
61
+ </button>
62
+ </div>
63
+ )}
64
+ >
65
+ <Page />
66
+ </ErrorBoundary>
67
+ )}
68
+ </QueryErrorResetBoundary>,
106
69
  )
107
- }
108
-
109
- const rendered = renderWithClient(
110
- queryClient,
111
- <QueryErrorResetBoundary>
112
- {({ reset }) => (
113
- <ErrorBoundary
114
- onReset={reset}
115
- fallbackRender={({ resetErrorBoundary }) => (
116
- <div>
117
- <div>error boundary</div>
118
- <button
119
- onClick={() => {
120
- resetErrorBoundary()
121
- }}
122
- >
123
- retry
124
- </button>
125
- </div>
126
- )}
127
- >
128
- <Page />
129
- </ErrorBoundary>
130
- )}
131
- </QueryErrorResetBoundary>,
132
- )
133
-
134
- await waitFor(() => rendered.getByText('error boundary'))
135
- await waitFor(() => rendered.getByText('retry'))
136
- succeed = true
137
- fireEvent.click(rendered.getByText('retry'))
138
- await waitFor(() => rendered.getByText('status: error'))
139
- consoleMock.mockRestore()
140
- })
141
-
142
- it('should not throw error if query is disabled, and refetch if query becomes enabled again', async () => {
143
- const consoleMock = vi
144
- .spyOn(console, 'error')
145
- .mockImplementation(() => undefined)
146
-
147
- const key = queryKey()
148
-
149
- let succeed = false
150
70
 
151
- function Page() {
152
- const [enabled, setEnabled] = React.useState(false)
153
- const { data } = useQuery({
154
- queryKey: key,
155
- queryFn: async () => {
156
- await sleep(10)
157
- if (!succeed) {
158
- throw new Error('Error')
159
- } else {
160
- return 'data'
161
- }
162
- },
163
- retry: false,
164
- enabled,
165
- throwErrors: true,
166
- })
167
-
168
- React.useEffect(() => {
169
- setEnabled(true)
170
- }, [])
171
-
172
- return <div>{data}</div>
173
- }
174
-
175
- const rendered = renderWithClient(
176
- queryClient,
177
- <QueryErrorResetBoundary>
178
- {({ reset }) => (
179
- <ErrorBoundary
180
- onReset={reset}
181
- fallbackRender={({ resetErrorBoundary }) => (
182
- <div>
183
- <div>error boundary</div>
184
- <button
185
- onClick={() => {
186
- resetErrorBoundary()
187
- }}
188
- >
189
- retry
190
- </button>
191
- </div>
192
- )}
193
- >
194
- <Page />
195
- </ErrorBoundary>
196
- )}
197
- </QueryErrorResetBoundary>,
198
- )
199
-
200
- await waitFor(() => rendered.getByText('error boundary'))
201
- await waitFor(() => rendered.getByText('retry'))
202
- succeed = true
203
- fireEvent.click(rendered.getByText('retry'))
204
- await waitFor(() => rendered.getByText('data'))
205
- consoleMock.mockRestore()
206
- })
207
-
208
- it('should throw error if query is disabled and manually refetched', async () => {
209
- const consoleMock = vi
210
- .spyOn(console, 'error')
211
- .mockImplementation(() => undefined)
212
-
213
- const key = queryKey()
214
-
215
- function Page() {
216
- const { data, refetch, status, fetchStatus } = useQuery<string>({
217
- queryKey: key,
218
- queryFn: async () => {
219
- throw new Error('Error')
220
- },
221
- retry: false,
222
- enabled: false,
223
- throwErrors: true,
224
- })
225
-
226
- return (
227
- <div>
228
- <button onClick={() => refetch()}>refetch</button>
71
+ await waitFor(() => rendered.getByText('error boundary'))
72
+ await waitFor(() => rendered.getByText('retry'))
73
+ succeed = true
74
+ fireEvent.click(rendered.getByText('retry'))
75
+ await waitFor(() => rendered.getByText('data'))
76
+ consoleMock.mockRestore()
77
+ })
78
+
79
+ it('should not throw error if query is disabled', async () => {
80
+ const consoleMock = vi
81
+ .spyOn(console, 'error')
82
+ .mockImplementation(() => undefined)
83
+ const key = queryKey()
84
+
85
+ let succeed = false
86
+
87
+ function Page() {
88
+ const { data, status } = useQuery({
89
+ queryKey: key,
90
+ queryFn: async () => {
91
+ await sleep(10)
92
+ if (!succeed) {
93
+ throw new Error('Error')
94
+ } else {
95
+ return 'data'
96
+ }
97
+ },
98
+ retry: false,
99
+ enabled: !succeed,
100
+ throwOnError: true,
101
+ })
102
+ return (
229
103
  <div>
230
- status: {status}, fetchStatus: {fetchStatus}
104
+ <div>status: {status}</div>
105
+ <div>{data}</div>
231
106
  </div>
232
- <div>{data}</div>
233
- </div>
107
+ )
108
+ }
109
+
110
+ const rendered = renderWithClient(
111
+ queryClient,
112
+ <QueryErrorResetBoundary>
113
+ {({ reset }) => (
114
+ <ErrorBoundary
115
+ onReset={reset}
116
+ fallbackRender={({ resetErrorBoundary }) => (
117
+ <div>
118
+ <div>error boundary</div>
119
+ <button
120
+ onClick={() => {
121
+ resetErrorBoundary()
122
+ }}
123
+ >
124
+ retry
125
+ </button>
126
+ </div>
127
+ )}
128
+ >
129
+ <Page />
130
+ </ErrorBoundary>
131
+ )}
132
+ </QueryErrorResetBoundary>,
234
133
  )
235
- }
236
-
237
- const rendered = renderWithClient(
238
- queryClient,
239
- <QueryErrorResetBoundary>
240
- {({ reset }) => (
241
- <ErrorBoundary
242
- onReset={reset}
243
- fallbackRender={({ resetErrorBoundary }) => (
244
- <div>
245
- <div>error boundary</div>
246
- <button
247
- onClick={() => {
248
- resetErrorBoundary()
249
- }}
250
- >
251
- retry
252
- </button>
253
- </div>
254
- )}
255
- >
256
- <Page />
257
- </ErrorBoundary>
258
- )}
259
- </QueryErrorResetBoundary>,
260
- )
261
-
262
- await waitFor(() =>
263
- rendered.getByText('status: pending, fetchStatus: idle'),
264
- )
265
- fireEvent.click(rendered.getByRole('button', { name: /refetch/i }))
266
- await waitFor(() => rendered.getByText('error boundary'))
267
- consoleMock.mockRestore()
268
- })
269
-
270
- it('should not retry fetch if the reset error boundary has not been reset', async () => {
271
- const consoleMock = vi
272
- .spyOn(console, 'error')
273
- .mockImplementation(() => undefined)
274
134
 
275
- const key = queryKey()
276
-
277
- let succeed = false
135
+ await waitFor(() => rendered.getByText('error boundary'))
136
+ await waitFor(() => rendered.getByText('retry'))
137
+ succeed = true
138
+ fireEvent.click(rendered.getByText('retry'))
139
+ await waitFor(() => rendered.getByText('status: error'))
140
+ consoleMock.mockRestore()
141
+ })
142
+
143
+ it('should not throw error if query is disabled, and refetch if query becomes enabled again', async () => {
144
+ const consoleMock = vi
145
+ .spyOn(console, 'error')
146
+ .mockImplementation(() => undefined)
147
+
148
+ const key = queryKey()
149
+
150
+ let succeed = false
151
+
152
+ function Page() {
153
+ const [enabled, setEnabled] = React.useState(false)
154
+ const { data } = useQuery({
155
+ queryKey: key,
156
+ queryFn: async () => {
157
+ await sleep(10)
158
+ if (!succeed) {
159
+ throw new Error('Error')
160
+ } else {
161
+ return 'data'
162
+ }
163
+ },
164
+ retry: false,
165
+ enabled,
166
+ throwOnError: true,
167
+ })
168
+
169
+ React.useEffect(() => {
170
+ setEnabled(true)
171
+ }, [])
172
+
173
+ return <div>{data}</div>
174
+ }
175
+
176
+ const rendered = renderWithClient(
177
+ queryClient,
178
+ <QueryErrorResetBoundary>
179
+ {({ reset }) => (
180
+ <ErrorBoundary
181
+ onReset={reset}
182
+ fallbackRender={({ resetErrorBoundary }) => (
183
+ <div>
184
+ <div>error boundary</div>
185
+ <button
186
+ onClick={() => {
187
+ resetErrorBoundary()
188
+ }}
189
+ >
190
+ retry
191
+ </button>
192
+ </div>
193
+ )}
194
+ >
195
+ <Page />
196
+ </ErrorBoundary>
197
+ )}
198
+ </QueryErrorResetBoundary>,
199
+ )
278
200
 
279
- function Page() {
280
- const { data } = useQuery({
281
- queryKey: key,
282
- queryFn: async () => {
283
- await sleep(10)
284
- if (!succeed) {
201
+ await waitFor(() => rendered.getByText('error boundary'))
202
+ await waitFor(() => rendered.getByText('retry'))
203
+ succeed = true
204
+ fireEvent.click(rendered.getByText('retry'))
205
+ await waitFor(() => rendered.getByText('data'))
206
+ consoleMock.mockRestore()
207
+ })
208
+
209
+ it('should throw error if query is disabled and manually refetched', async () => {
210
+ const consoleMock = vi
211
+ .spyOn(console, 'error')
212
+ .mockImplementation(() => undefined)
213
+
214
+ const key = queryKey()
215
+
216
+ function Page() {
217
+ const { data, refetch, status, fetchStatus } = useQuery<string>({
218
+ queryKey: key,
219
+ queryFn: async () => {
285
220
  throw new Error('Error')
286
- } else {
287
- return 'data'
288
- }
289
- },
290
- retry: false,
291
- throwErrors: true,
292
- })
293
- return <div>{data}</div>
294
- }
295
-
296
- const rendered = renderWithClient(
297
- queryClient,
298
- <QueryErrorResetBoundary>
299
- {() => (
300
- <ErrorBoundary
301
- fallbackRender={({ resetErrorBoundary }) => (
302
- <div>
303
- <div>error boundary</div>
304
- <button
305
- onClick={() => {
306
- resetErrorBoundary()
307
- }}
308
- >
309
- retry
310
- </button>
311
- </div>
312
- )}
313
- >
314
- <Page />
315
- </ErrorBoundary>
316
- )}
317
- </QueryErrorResetBoundary>,
318
- )
319
-
320
- await waitFor(() => rendered.getByText('error boundary'))
321
- await waitFor(() => rendered.getByText('retry'))
322
- succeed = true
323
- fireEvent.click(rendered.getByText('retry'))
324
- await waitFor(() => rendered.getByText('error boundary'))
325
- consoleMock.mockRestore()
326
- })
327
-
328
- it('should retry fetch if the reset error boundary has been reset and the query contains data from a previous fetch', async () => {
329
- const consoleMock = vi
330
- .spyOn(console, 'error')
331
- .mockImplementation(() => undefined)
332
-
333
- const key = queryKey()
221
+ },
222
+ retry: false,
223
+ enabled: false,
224
+ throwOnError: true,
225
+ })
334
226
 
335
- let succeed = false
336
-
337
- function Page() {
338
- const { data } = useQuery({
339
- queryKey: key,
340
- queryFn: async () => {
341
- await sleep(10)
342
- if (!succeed) {
343
- throw new Error('Error')
344
- } else {
345
- return 'data'
346
- }
347
- },
348
- retry: false,
349
- throwErrors: true,
350
- initialData: 'initial',
351
- })
352
- return <div>{data}</div>
353
- }
354
-
355
- const rendered = renderWithClient(
356
- queryClient,
357
- <QueryErrorResetBoundary>
358
- {({ reset }) => (
359
- <ErrorBoundary
360
- onReset={reset}
361
- fallbackRender={({ resetErrorBoundary }) => (
362
- <div>
363
- <div>error boundary</div>
364
- <button
365
- onClick={() => {
366
- resetErrorBoundary()
367
- }}
368
- >
369
- retry
370
- </button>
371
- </div>
372
- )}
373
- >
374
- <Page />
375
- </ErrorBoundary>
376
- )}
377
- </QueryErrorResetBoundary>,
378
- )
379
-
380
- await waitFor(() => rendered.getByText('error boundary'))
381
- await waitFor(() => rendered.getByText('retry'))
382
- succeed = true
383
- fireEvent.click(rendered.getByText('retry'))
384
- await waitFor(() => rendered.getByText('data'))
385
- consoleMock.mockRestore()
386
- })
387
-
388
- it('should not retry fetch if the reset error boundary has not been reset after a previous reset', async () => {
389
- const consoleMock = vi
390
- .spyOn(console, 'error')
391
- .mockImplementation(() => undefined)
392
-
393
- const key = queryKey()
227
+ return (
228
+ <div>
229
+ <button onClick={() => refetch()}>refetch</button>
230
+ <div>
231
+ status: {status}, fetchStatus: {fetchStatus}
232
+ </div>
233
+ <div>{data}</div>
234
+ </div>
235
+ )
236
+ }
237
+
238
+ const rendered = renderWithClient(
239
+ queryClient,
240
+ <QueryErrorResetBoundary>
241
+ {({ reset }) => (
242
+ <ErrorBoundary
243
+ onReset={reset}
244
+ fallbackRender={({ resetErrorBoundary }) => (
245
+ <div>
246
+ <div>error boundary</div>
247
+ <button
248
+ onClick={() => {
249
+ resetErrorBoundary()
250
+ }}
251
+ >
252
+ retry
253
+ </button>
254
+ </div>
255
+ )}
256
+ >
257
+ <Page />
258
+ </ErrorBoundary>
259
+ )}
260
+ </QueryErrorResetBoundary>,
261
+ )
394
262
 
395
- let succeed = false
396
- let shouldReset = true
263
+ await waitFor(() =>
264
+ rendered.getByText('status: pending, fetchStatus: idle'),
265
+ )
266
+ fireEvent.click(rendered.getByRole('button', { name: /refetch/i }))
267
+ await waitFor(() => rendered.getByText('error boundary'))
268
+ consoleMock.mockRestore()
269
+ })
270
+
271
+ it('should not retry fetch if the reset error boundary has not been reset', async () => {
272
+ const consoleMock = vi
273
+ .spyOn(console, 'error')
274
+ .mockImplementation(() => undefined)
275
+
276
+ const key = queryKey()
277
+
278
+ let succeed = false
279
+
280
+ function Page() {
281
+ const { data } = useQuery({
282
+ queryKey: key,
283
+ queryFn: async () => {
284
+ await sleep(10)
285
+ if (!succeed) {
286
+ throw new Error('Error')
287
+ } else {
288
+ return 'data'
289
+ }
290
+ },
291
+ retry: false,
292
+ throwOnError: true,
293
+ })
294
+ return <div>{data}</div>
295
+ }
296
+
297
+ const rendered = renderWithClient(
298
+ queryClient,
299
+ <QueryErrorResetBoundary>
300
+ {() => (
301
+ <ErrorBoundary
302
+ fallbackRender={({ resetErrorBoundary }) => (
303
+ <div>
304
+ <div>error boundary</div>
305
+ <button
306
+ onClick={() => {
307
+ resetErrorBoundary()
308
+ }}
309
+ >
310
+ retry
311
+ </button>
312
+ </div>
313
+ )}
314
+ >
315
+ <Page />
316
+ </ErrorBoundary>
317
+ )}
318
+ </QueryErrorResetBoundary>,
319
+ )
397
320
 
398
- function Page() {
399
- const { data } = useQuery({
400
- queryKey: key,
401
- queryFn: async () => {
402
- await sleep(10)
403
- if (!succeed) {
404
- throw new Error('Error')
405
- } else {
406
- return 'data'
407
- }
408
- },
409
- retry: false,
410
- throwErrors: true,
411
- })
412
- return <div>{data}</div>
413
- }
414
-
415
- const rendered = renderWithClient(
416
- queryClient,
417
- <QueryErrorResetBoundary>
418
- {({ reset }) => (
419
- <ErrorBoundary
420
- onReset={() => {
421
- if (shouldReset) {
422
- reset()
423
- }
424
- }}
425
- fallbackRender={({ resetErrorBoundary }) => (
426
- <div>
427
- <div>error boundary</div>
428
- <button
429
- onClick={() => {
430
- resetErrorBoundary()
431
- }}
432
- >
433
- retry
434
- </button>
435
- </div>
436
- )}
437
- >
438
- <Page />
439
- </ErrorBoundary>
440
- )}
441
- </QueryErrorResetBoundary>,
442
- )
443
-
444
- await waitFor(() => rendered.getByText('error boundary'))
445
- await waitFor(() => rendered.getByText('retry'))
446
- shouldReset = true
447
- fireEvent.click(rendered.getByText('retry'))
448
- await waitFor(() => rendered.getByText('error boundary'))
449
- succeed = true
450
- shouldReset = false
451
- fireEvent.click(rendered.getByText('retry'))
452
- await waitFor(() => rendered.getByText('error boundary'))
453
- consoleMock.mockRestore()
454
- })
321
+ await waitFor(() => rendered.getByText('error boundary'))
322
+ await waitFor(() => rendered.getByText('retry'))
323
+ succeed = true
324
+ fireEvent.click(rendered.getByText('retry'))
325
+ await waitFor(() => rendered.getByText('error boundary'))
326
+ consoleMock.mockRestore()
327
+ })
328
+
329
+ it('should retry fetch if the reset error boundary has been reset and the query contains data from a previous fetch', async () => {
330
+ const consoleMock = vi
331
+ .spyOn(console, 'error')
332
+ .mockImplementation(() => undefined)
333
+
334
+ const key = queryKey()
335
+
336
+ let succeed = false
337
+
338
+ function Page() {
339
+ const { data } = useQuery({
340
+ queryKey: key,
341
+ queryFn: async () => {
342
+ await sleep(10)
343
+ if (!succeed) {
344
+ throw new Error('Error')
345
+ } else {
346
+ return 'data'
347
+ }
348
+ },
349
+ retry: false,
350
+ throwOnError: true,
351
+ initialData: 'initial',
352
+ })
353
+ return <div>{data}</div>
354
+ }
355
+
356
+ const rendered = renderWithClient(
357
+ queryClient,
358
+ <QueryErrorResetBoundary>
359
+ {({ reset }) => (
360
+ <ErrorBoundary
361
+ onReset={reset}
362
+ fallbackRender={({ resetErrorBoundary }) => (
363
+ <div>
364
+ <div>error boundary</div>
365
+ <button
366
+ onClick={() => {
367
+ resetErrorBoundary()
368
+ }}
369
+ >
370
+ retry
371
+ </button>
372
+ </div>
373
+ )}
374
+ >
375
+ <Page />
376
+ </ErrorBoundary>
377
+ )}
378
+ </QueryErrorResetBoundary>,
379
+ )
455
380
 
456
- it('should throw again on error after the reset error boundary has been reset', async () => {
457
- const consoleMock = vi
458
- .spyOn(console, 'error')
459
- .mockImplementation(() => undefined)
460
-
461
- const key = queryKey()
462
- let fetchCount = 0
463
-
464
- function Page() {
465
- const { data } = useQuery<string>({
466
- queryKey: key,
467
- queryFn: async () => {
468
- fetchCount++
469
- await sleep(10)
470
- throw new Error('Error')
471
- },
472
- retry: false,
473
- throwErrors: true,
474
- })
475
- return <div>{data}</div>
476
- }
477
-
478
- const rendered = renderWithClient(
479
- queryClient,
480
- <QueryErrorResetBoundary>
481
- {({ reset }) => (
482
- <ErrorBoundary
483
- onReset={reset}
484
- fallbackRender={({ resetErrorBoundary }) => (
485
- <div>
486
- <div>error boundary</div>
487
- <button
488
- onClick={() => {
489
- resetErrorBoundary()
490
- }}
491
- >
492
- retry
493
- </button>
494
- </div>
495
- )}
496
- >
497
- <Page />
498
- </ErrorBoundary>
499
- )}
500
- </QueryErrorResetBoundary>,
501
- )
502
-
503
- await waitFor(() => rendered.getByText('error boundary'))
504
- await waitFor(() => rendered.getByText('retry'))
505
- fireEvent.click(rendered.getByText('retry'))
506
- await waitFor(() => rendered.getByText('error boundary'))
507
- await waitFor(() => rendered.getByText('retry'))
508
- fireEvent.click(rendered.getByText('retry'))
509
- await waitFor(() => rendered.getByText('error boundary'))
510
- expect(fetchCount).toBe(3)
511
- consoleMock.mockRestore()
512
- })
381
+ await waitFor(() => rendered.getByText('error boundary'))
382
+ await waitFor(() => rendered.getByText('retry'))
383
+ succeed = true
384
+ fireEvent.click(rendered.getByText('retry'))
385
+ await waitFor(() => rendered.getByText('data'))
386
+ consoleMock.mockRestore()
387
+ })
388
+
389
+ it('should not retry fetch if the reset error boundary has not been reset after a previous reset', async () => {
390
+ const consoleMock = vi
391
+ .spyOn(console, 'error')
392
+ .mockImplementation(() => undefined)
393
+
394
+ const key = queryKey()
395
+
396
+ let succeed = false
397
+ let shouldReset = true
398
+
399
+ function Page() {
400
+ const { data } = useQuery({
401
+ queryKey: key,
402
+ queryFn: async () => {
403
+ await sleep(10)
404
+ if (!succeed) {
405
+ throw new Error('Error')
406
+ } else {
407
+ return 'data'
408
+ }
409
+ },
410
+ retry: false,
411
+ throwOnError: true,
412
+ })
413
+ return <div>{data}</div>
414
+ }
415
+
416
+ const rendered = renderWithClient(
417
+ queryClient,
418
+ <QueryErrorResetBoundary>
419
+ {({ reset }) => (
420
+ <ErrorBoundary
421
+ onReset={() => {
422
+ if (shouldReset) {
423
+ reset()
424
+ }
425
+ }}
426
+ fallbackRender={({ resetErrorBoundary }) => (
427
+ <div>
428
+ <div>error boundary</div>
429
+ <button
430
+ onClick={() => {
431
+ resetErrorBoundary()
432
+ }}
433
+ >
434
+ retry
435
+ </button>
436
+ </div>
437
+ )}
438
+ >
439
+ <Page />
440
+ </ErrorBoundary>
441
+ )}
442
+ </QueryErrorResetBoundary>,
443
+ )
513
444
 
514
- it('should never render the component while the query is in error state', async () => {
515
- const consoleMock = vi
516
- .spyOn(console, 'error')
517
- .mockImplementation(() => undefined)
518
-
519
- const key = queryKey()
520
- let fetchCount = 0
521
- let renders = 0
522
-
523
- function Page() {
524
- const { data } = useQuery({
525
- queryKey: key,
526
- queryFn: async () => {
527
- fetchCount++
528
- await sleep(10)
529
- if (fetchCount > 2) {
530
- return 'data'
531
- } else {
445
+ await waitFor(() => rendered.getByText('error boundary'))
446
+ await waitFor(() => rendered.getByText('retry'))
447
+ shouldReset = true
448
+ fireEvent.click(rendered.getByText('retry'))
449
+ await waitFor(() => rendered.getByText('error boundary'))
450
+ succeed = true
451
+ shouldReset = false
452
+ fireEvent.click(rendered.getByText('retry'))
453
+ await waitFor(() => rendered.getByText('error boundary'))
454
+ consoleMock.mockRestore()
455
+ })
456
+
457
+ it('should throw again on error after the reset error boundary has been reset', async () => {
458
+ const consoleMock = vi
459
+ .spyOn(console, 'error')
460
+ .mockImplementation(() => undefined)
461
+
462
+ const key = queryKey()
463
+ let fetchCount = 0
464
+
465
+ function Page() {
466
+ const { data } = useQuery<string>({
467
+ queryKey: key,
468
+ queryFn: async () => {
469
+ fetchCount++
470
+ await sleep(10)
532
471
  throw new Error('Error')
533
- }
534
- },
535
- retry: false,
536
- suspense: true,
537
- })
538
- renders++
539
- return <div>{data}</div>
540
- }
541
-
542
- const rendered = renderWithClient(
543
- queryClient,
544
- <QueryErrorResetBoundary>
545
- {({ reset }) => (
546
- <ErrorBoundary
547
- onReset={reset}
548
- fallbackRender={({ resetErrorBoundary }) => (
549
- <div>
550
- <div>error boundary</div>
551
- <button
552
- onClick={() => {
553
- resetErrorBoundary()
554
- }}
555
- >
556
- retry
557
- </button>
558
- </div>
559
- )}
560
- >
561
- <React.Suspense fallback={<div>loading</div>}>
472
+ },
473
+ retry: false,
474
+ throwOnError: true,
475
+ })
476
+ return <div>{data}</div>
477
+ }
478
+
479
+ const rendered = renderWithClient(
480
+ queryClient,
481
+ <QueryErrorResetBoundary>
482
+ {({ reset }) => (
483
+ <ErrorBoundary
484
+ onReset={reset}
485
+ fallbackRender={({ resetErrorBoundary }) => (
486
+ <div>
487
+ <div>error boundary</div>
488
+ <button
489
+ onClick={() => {
490
+ resetErrorBoundary()
491
+ }}
492
+ >
493
+ retry
494
+ </button>
495
+ </div>
496
+ )}
497
+ >
562
498
  <Page />
563
- </React.Suspense>
564
- </ErrorBoundary>
565
- )}
566
- </QueryErrorResetBoundary>,
567
- )
568
-
569
- await waitFor(() => rendered.getByText('error boundary'))
570
- await waitFor(() => rendered.getByText('retry'))
571
- fireEvent.click(rendered.getByText('retry'))
572
- await waitFor(() => rendered.getByText('error boundary'))
573
- await waitFor(() => rendered.getByText('retry'))
574
- fireEvent.click(rendered.getByText('retry'))
575
- await waitFor(() => rendered.getByText('data'))
576
- expect(fetchCount).toBe(3)
577
- expect(renders).toBe(1)
578
- consoleMock.mockRestore()
579
- })
499
+ </ErrorBoundary>
500
+ )}
501
+ </QueryErrorResetBoundary>,
502
+ )
580
503
 
581
- it('should render children', async () => {
582
- const consoleMock = vi
583
- .spyOn(console, 'error')
584
- .mockImplementation(() => undefined)
504
+ await waitFor(() => rendered.getByText('error boundary'))
505
+ await waitFor(() => rendered.getByText('retry'))
506
+ fireEvent.click(rendered.getByText('retry'))
507
+ await waitFor(() => rendered.getByText('error boundary'))
508
+ await waitFor(() => rendered.getByText('retry'))
509
+ fireEvent.click(rendered.getByText('retry'))
510
+ await waitFor(() => rendered.getByText('error boundary'))
511
+ expect(fetchCount).toBe(3)
512
+ consoleMock.mockRestore()
513
+ })
514
+
515
+ it('should never render the component while the query is in error state', async () => {
516
+ const consoleMock = vi
517
+ .spyOn(console, 'error')
518
+ .mockImplementation(() => undefined)
519
+
520
+ const key = queryKey()
521
+ let fetchCount = 0
522
+ let renders = 0
523
+
524
+ function Page() {
525
+ const { data } = useQuery({
526
+ queryKey: key,
527
+ queryFn: async () => {
528
+ fetchCount++
529
+ await sleep(10)
530
+ if (fetchCount > 2) {
531
+ return 'data'
532
+ } else {
533
+ throw new Error('Error')
534
+ }
535
+ },
536
+ retry: false,
537
+ suspense: true,
538
+ })
539
+ renders++
540
+ return <div>{data}</div>
541
+ }
542
+
543
+ const rendered = renderWithClient(
544
+ queryClient,
545
+ <QueryErrorResetBoundary>
546
+ {({ reset }) => (
547
+ <ErrorBoundary
548
+ onReset={reset}
549
+ fallbackRender={({ resetErrorBoundary }) => (
550
+ <div>
551
+ <div>error boundary</div>
552
+ <button
553
+ onClick={() => {
554
+ resetErrorBoundary()
555
+ }}
556
+ >
557
+ retry
558
+ </button>
559
+ </div>
560
+ )}
561
+ >
562
+ <React.Suspense fallback={<div>loading</div>}>
563
+ <Page />
564
+ </React.Suspense>
565
+ </ErrorBoundary>
566
+ )}
567
+ </QueryErrorResetBoundary>,
568
+ )
585
569
 
586
- function Page() {
587
- return (
588
- <div>
589
- <span>page</span>
590
- </div>
570
+ await waitFor(() => rendered.getByText('error boundary'))
571
+ await waitFor(() => rendered.getByText('retry'))
572
+ fireEvent.click(rendered.getByText('retry'))
573
+ await waitFor(() => rendered.getByText('error boundary'))
574
+ await waitFor(() => rendered.getByText('retry'))
575
+ fireEvent.click(rendered.getByText('retry'))
576
+ await waitFor(() => rendered.getByText('data'))
577
+ expect(fetchCount).toBe(3)
578
+ expect(renders).toBe(1)
579
+ consoleMock.mockRestore()
580
+ })
581
+
582
+ it('should render children', async () => {
583
+ const consoleMock = vi
584
+ .spyOn(console, 'error')
585
+ .mockImplementation(() => undefined)
586
+
587
+ function Page() {
588
+ return (
589
+ <div>
590
+ <span>page</span>
591
+ </div>
592
+ )
593
+ }
594
+
595
+ const rendered = renderWithClient(
596
+ queryClient,
597
+ <QueryErrorResetBoundary>
598
+ <Page />
599
+ </QueryErrorResetBoundary>,
591
600
  )
592
- }
593
601
 
594
- const rendered = renderWithClient(
595
- queryClient,
596
- <QueryErrorResetBoundary>
597
- <Page />
598
- </QueryErrorResetBoundary>,
599
- )
602
+ expect(rendered.queryByText('page')).not.toBeNull()
603
+ consoleMock.mockRestore()
604
+ })
605
+
606
+ it('should show error boundary when using tracked queries even though we do not track the error field', async () => {
607
+ const consoleMock = vi
608
+ .spyOn(console, 'error')
609
+ .mockImplementation(() => undefined)
610
+
611
+ const key = queryKey()
612
+
613
+ let succeed = false
614
+
615
+ function Page() {
616
+ const { data } = useQuery({
617
+ queryKey: key,
618
+ queryFn: async () => {
619
+ await sleep(10)
620
+ if (!succeed) {
621
+ throw new Error('Error')
622
+ } else {
623
+ return 'data'
624
+ }
625
+ },
626
+ retry: false,
627
+ throwOnError: true,
628
+ })
629
+ return <div>{data}</div>
630
+ }
631
+
632
+ const rendered = renderWithClient(
633
+ queryClient,
634
+ <QueryErrorResetBoundary>
635
+ {({ reset }) => (
636
+ <ErrorBoundary
637
+ onReset={reset}
638
+ fallbackRender={({ resetErrorBoundary }) => (
639
+ <div>
640
+ <div>error boundary</div>
641
+ <button
642
+ onClick={() => {
643
+ resetErrorBoundary()
644
+ }}
645
+ >
646
+ retry
647
+ </button>
648
+ </div>
649
+ )}
650
+ >
651
+ <Page />
652
+ </ErrorBoundary>
653
+ )}
654
+ </QueryErrorResetBoundary>,
655
+ )
600
656
 
601
- expect(rendered.queryByText('page')).not.toBeNull()
602
- consoleMock.mockRestore()
657
+ await waitFor(() => rendered.getByText('error boundary'))
658
+ await waitFor(() => rendered.getByText('retry'))
659
+ succeed = true
660
+ fireEvent.click(rendered.getByText('retry'))
661
+ await waitFor(() => rendered.getByText('data'))
662
+ consoleMock.mockRestore()
663
+ })
603
664
  })
665
+ describe('useQueries', () => {
666
+ it('should retry fetch if the reset error boundary has been reset', async () => {
667
+ const consoleMock = vi
668
+ .spyOn(console, 'error')
669
+ .mockImplementation(() => undefined)
670
+ const key = queryKey()
671
+
672
+ let succeed = false
673
+
674
+ function Page() {
675
+ const [{ data }] = useQueries({
676
+ queries: [
677
+ {
678
+ queryKey: key,
679
+ queryFn: async () => {
680
+ await sleep(10)
681
+ if (!succeed) {
682
+ throw new Error('Error')
683
+ } else {
684
+ return 'data'
685
+ }
686
+ },
687
+ retry: false,
688
+ throwOnError: true,
689
+ retryOnMount: true,
690
+ },
691
+ ],
692
+ })
693
+ return <div>{data}</div>
694
+ }
695
+
696
+ const rendered = renderWithClient(
697
+ queryClient,
698
+ <QueryErrorResetBoundary>
699
+ {({ reset }) => (
700
+ <ErrorBoundary
701
+ onReset={reset}
702
+ fallbackRender={({ resetErrorBoundary }) => (
703
+ <div>
704
+ <div>error boundary</div>
705
+ <button
706
+ onClick={() => {
707
+ resetErrorBoundary()
708
+ }}
709
+ >
710
+ retry
711
+ </button>
712
+ </div>
713
+ )}
714
+ >
715
+ <Page />
716
+ </ErrorBoundary>
717
+ )}
718
+ </QueryErrorResetBoundary>,
719
+ )
604
720
 
605
- it('should show error boundary when using tracked queries even though we do not track the error field', async () => {
606
- const consoleMock = vi
607
- .spyOn(console, 'error')
608
- .mockImplementation(() => undefined)
609
-
610
- const key = queryKey()
611
-
612
- let succeed = false
721
+ await waitFor(() => rendered.getByText('error boundary'))
722
+ await waitFor(() => rendered.getByText('retry'))
723
+ succeed = true
724
+ fireEvent.click(rendered.getByText('retry'))
725
+ await waitFor(() => rendered.getByText('data'))
726
+ consoleMock.mockRestore()
727
+ })
728
+
729
+ it('with suspense should retry fetch if the reset error boundary has been reset', async () => {
730
+ const key = queryKey()
731
+ const consoleMock = vi
732
+ .spyOn(console, 'error')
733
+ .mockImplementation(() => undefined)
734
+
735
+ let succeed = false
736
+
737
+ function Page() {
738
+ const [{ data }] = useQueries({
739
+ queries: [
740
+ {
741
+ queryKey: key,
742
+ queryFn: async () => {
743
+ await sleep(10)
744
+ if (!succeed) {
745
+ throw new Error('Error')
746
+ } else {
747
+ return 'data'
748
+ }
749
+ },
750
+ retry: false,
751
+ throwOnError: true,
752
+ retryOnMount: true,
753
+ suspense: true,
754
+ },
755
+ ],
756
+ })
757
+ return <div>{data}</div>
758
+ }
759
+
760
+ const rendered = renderWithClient(
761
+ queryClient,
762
+ <QueryErrorResetBoundary>
763
+ {({ reset }) => (
764
+ <ErrorBoundary
765
+ onReset={reset}
766
+ fallbackRender={({ resetErrorBoundary }) => (
767
+ <div>
768
+ <div>error boundary</div>
769
+ <button
770
+ onClick={() => {
771
+ resetErrorBoundary()
772
+ }}
773
+ >
774
+ retry
775
+ </button>
776
+ </div>
777
+ )}
778
+ >
779
+ <React.Suspense fallback="Loader">
780
+ <Page />
781
+ </React.Suspense>
782
+ </ErrorBoundary>
783
+ )}
784
+ </QueryErrorResetBoundary>,
785
+ )
613
786
 
614
- function Page() {
615
- const { data } = useQuery({
616
- queryKey: key,
617
- queryFn: async () => {
618
- await sleep(10)
619
- if (!succeed) {
620
- throw new Error('Error')
621
- } else {
622
- return 'data'
623
- }
624
- },
625
- retry: false,
626
- throwErrors: true,
627
- })
628
- return <div>{data}</div>
629
- }
630
-
631
- const rendered = renderWithClient(
632
- queryClient,
633
- <QueryErrorResetBoundary>
634
- {({ reset }) => (
635
- <ErrorBoundary
636
- onReset={reset}
637
- fallbackRender={({ resetErrorBoundary }) => (
638
- <div>
639
- <div>error boundary</div>
640
- <button
641
- onClick={() => {
642
- resetErrorBoundary()
643
- }}
644
- >
645
- retry
646
- </button>
647
- </div>
648
- )}
649
- >
650
- <Page />
651
- </ErrorBoundary>
652
- )}
653
- </QueryErrorResetBoundary>,
654
- )
655
-
656
- await waitFor(() => rendered.getByText('error boundary'))
657
- await waitFor(() => rendered.getByText('retry'))
658
- succeed = true
659
- fireEvent.click(rendered.getByText('retry'))
660
- await waitFor(() => rendered.getByText('data'))
661
- consoleMock.mockRestore()
787
+ await waitFor(() => rendered.getByText('error boundary'))
788
+ await waitFor(() => rendered.getByText('retry'))
789
+ succeed = true
790
+ fireEvent.click(rendered.getByText('retry'))
791
+ await waitFor(() => rendered.getByText('data'))
792
+ consoleMock.mockRestore()
793
+ })
662
794
  })
663
795
  })