@qiaopeng/tanstack-query-plus 0.5.8 → 0.5.10

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 (250) hide show
  1. package/README.md +155 -95
  2. package/dist/{types/base.d.ts → base-CHnwqfyz.d.cts} +12 -14
  3. package/dist/base-CHnwqfyz.d.ts +52 -0
  4. package/dist/chunk-52ZO6Y67.cjs +1121 -0
  5. package/dist/chunk-52ZO6Y67.cjs.map +1 -0
  6. package/dist/chunk-5J6OXSLW.cjs +36 -0
  7. package/dist/chunk-5J6OXSLW.cjs.map +1 -0
  8. package/dist/chunk-6MAYHLTE.cjs +310 -0
  9. package/dist/chunk-6MAYHLTE.cjs.map +1 -0
  10. package/dist/chunk-ADS2QTMP.js +144 -0
  11. package/dist/chunk-ADS2QTMP.js.map +1 -0
  12. package/dist/chunk-APXNNHBD.cjs +374 -0
  13. package/dist/chunk-APXNNHBD.cjs.map +1 -0
  14. package/dist/chunk-AXMWOGNX.js +134 -0
  15. package/dist/chunk-AXMWOGNX.js.map +1 -0
  16. package/dist/chunk-B4KO3K3E.cjs +521 -0
  17. package/dist/chunk-B4KO3K3E.cjs.map +1 -0
  18. package/dist/chunk-BK3OTIBD.cjs +15 -0
  19. package/dist/chunk-BK3OTIBD.cjs.map +1 -0
  20. package/dist/chunk-BYAOQALW.js +13 -0
  21. package/dist/chunk-BYAOQALW.js.map +1 -0
  22. package/dist/chunk-CRTVS7VI.cjs +162 -0
  23. package/dist/chunk-CRTVS7VI.cjs.map +1 -0
  24. package/dist/chunk-EXITP7QO.js +288 -0
  25. package/dist/chunk-EXITP7QO.js.map +1 -0
  26. package/dist/chunk-GMO3PRZZ.js +565 -0
  27. package/dist/chunk-GMO3PRZZ.js.map +1 -0
  28. package/dist/chunk-HRO2DWKZ.js +12 -0
  29. package/dist/chunk-HRO2DWKZ.js.map +1 -0
  30. package/dist/chunk-JHDKUQSB.js +1069 -0
  31. package/dist/chunk-JHDKUQSB.js.map +1 -0
  32. package/dist/chunk-JN2Y6RSY.js +23 -0
  33. package/dist/chunk-JN2Y6RSY.js.map +1 -0
  34. package/dist/chunk-JRJSKRZW.cjs +29 -0
  35. package/dist/chunk-JRJSKRZW.cjs.map +1 -0
  36. package/dist/chunk-KC62H4VJ.js +123 -0
  37. package/dist/chunk-KC62H4VJ.js.map +1 -0
  38. package/dist/chunk-LHEHSLD5.js +31 -0
  39. package/dist/chunk-LHEHSLD5.js.map +1 -0
  40. package/dist/chunk-N4264P7N.cjs +156 -0
  41. package/dist/chunk-N4264P7N.cjs.map +1 -0
  42. package/dist/chunk-NF5QYPYC.cjs +133 -0
  43. package/dist/chunk-NF5QYPYC.cjs.map +1 -0
  44. package/dist/chunk-OFLCHKKE.cjs +28 -0
  45. package/dist/chunk-OFLCHKKE.cjs.map +1 -0
  46. package/dist/chunk-PCNSWVA5.cjs +602 -0
  47. package/dist/chunk-PCNSWVA5.cjs.map +1 -0
  48. package/dist/chunk-STOMAA2X.js +85 -0
  49. package/dist/chunk-STOMAA2X.js.map +1 -0
  50. package/dist/chunk-UVF5S6LX.cjs +15 -0
  51. package/dist/chunk-UVF5S6LX.cjs.map +1 -0
  52. package/dist/chunk-WEIXCDCA.cjs +90 -0
  53. package/dist/chunk-WEIXCDCA.cjs.map +1 -0
  54. package/dist/chunk-X3ZTSLBQ.js +355 -0
  55. package/dist/chunk-X3ZTSLBQ.js.map +1 -0
  56. package/dist/chunk-YEV73J4J.js +504 -0
  57. package/dist/chunk-YEV73J4J.js.map +1 -0
  58. package/dist/chunk-YW5PNTRU.cjs +14 -0
  59. package/dist/chunk-YW5PNTRU.cjs.map +1 -0
  60. package/dist/chunk-ZNXSWUIS.js +12 -0
  61. package/dist/chunk-ZNXSWUIS.js.map +1 -0
  62. package/dist/chunk-ZUEMBY4W.js +21 -0
  63. package/dist/chunk-ZUEMBY4W.js.map +1 -0
  64. package/dist/components/index.cjs +60 -0
  65. package/dist/components/index.cjs.map +1 -0
  66. package/dist/components/index.d.cts +43 -0
  67. package/dist/components/index.d.ts +43 -4
  68. package/dist/components/index.js +3 -4
  69. package/dist/components/index.js.map +1 -0
  70. package/dist/core/devtools.cjs +25 -0
  71. package/dist/core/devtools.cjs.map +1 -0
  72. package/dist/core/devtools.d.cts +17 -0
  73. package/dist/core/devtools.d.ts +9 -7
  74. package/dist/core/devtools.js +4 -16
  75. package/dist/core/devtools.js.map +1 -0
  76. package/dist/core/index.cjs +220 -0
  77. package/dist/core/index.cjs.map +1 -0
  78. package/dist/core/index.d.cts +196 -0
  79. package/dist/core/index.d.ts +196 -9
  80. package/dist/core/index.js +7 -8
  81. package/dist/core/index.js.map +1 -0
  82. package/dist/features/index.cjs +76 -0
  83. package/dist/features/index.cjs.map +1 -0
  84. package/dist/features/index.d.cts +86 -0
  85. package/dist/features/index.d.ts +86 -4
  86. package/dist/features/index.js +7 -3
  87. package/dist/features/index.js.map +1 -0
  88. package/dist/hooks/index.cjs +209 -0
  89. package/dist/hooks/index.cjs.map +1 -0
  90. package/dist/hooks/index.d.cts +377 -0
  91. package/dist/hooks/index.d.ts +377 -10
  92. package/dist/hooks/index.js +8 -9
  93. package/dist/hooks/index.js.map +1 -0
  94. package/dist/hooks/useInViewPrefetch.cjs +33 -0
  95. package/dist/hooks/useInViewPrefetch.cjs.map +1 -0
  96. package/dist/hooks/useInViewPrefetch.d.cts +12 -0
  97. package/dist/hooks/useInViewPrefetch.d.ts +6 -4
  98. package/dist/hooks/useInViewPrefetch.js +30 -20
  99. package/dist/hooks/useInViewPrefetch.js.map +1 -0
  100. package/dist/index.cjs +811 -0
  101. package/dist/index.cjs.map +1 -0
  102. package/dist/index.d.cts +36 -0
  103. package/dist/index.d.ts +36 -8
  104. package/dist/index.js +89 -7
  105. package/dist/index.js.map +1 -0
  106. package/dist/{types/offline.d.ts → offline-DVPtgoAS.d.ts} +15 -13
  107. package/dist/offline-xxeA_-6V.d.cts +99 -0
  108. package/dist/persistence-MRtkmhqq.d.cts +216 -0
  109. package/dist/persistence-tIrEb0pR.d.ts +216 -0
  110. package/dist/react-query/index.cjs +52 -0
  111. package/dist/react-query/index.cjs.map +1 -0
  112. package/dist/react-query/index.d.cts +1 -0
  113. package/dist/react-query/index.d.ts +1 -3
  114. package/dist/react-query/index.js +3 -1
  115. package/dist/react-query/index.js.map +1 -0
  116. package/dist/types/index.cjs +43 -0
  117. package/dist/types/index.cjs.map +1 -0
  118. package/dist/types/index.d.cts +157 -0
  119. package/dist/types/index.d.ts +116 -12
  120. package/dist/types/index.js +6 -8
  121. package/dist/types/index.js.map +1 -0
  122. package/dist/utils/index.cjs +234 -0
  123. package/dist/utils/index.cjs.map +1 -0
  124. package/dist/utils/index.d.cts +272 -0
  125. package/dist/utils/index.d.ts +272 -10
  126. package/dist/utils/index.js +9 -9
  127. package/dist/utils/index.js.map +1 -0
  128. package/package.json +13 -3
  129. package/dist/PersistQueryClientProvider.d.ts +0 -22
  130. package/dist/PersistQueryClientProvider.d.ts.map +0 -1
  131. package/dist/PersistQueryClientProvider.js +0 -47
  132. package/dist/components/LoadingFallback.d.ts +0 -16
  133. package/dist/components/LoadingFallback.d.ts.map +0 -1
  134. package/dist/components/LoadingFallback.js +0 -27
  135. package/dist/components/QueryErrorBoundary.d.ts +0 -12
  136. package/dist/components/QueryErrorBoundary.d.ts.map +0 -1
  137. package/dist/components/QueryErrorBoundary.js +0 -9
  138. package/dist/components/SuspenseWrapper.d.ts +0 -14
  139. package/dist/components/SuspenseWrapper.d.ts.map +0 -1
  140. package/dist/components/SuspenseWrapper.js +0 -9
  141. package/dist/components/index.d.ts.map +0 -1
  142. package/dist/components/internal/ErrorBoundary.d.ts +0 -27
  143. package/dist/components/internal/ErrorBoundary.d.ts.map +0 -1
  144. package/dist/components/internal/ErrorBoundary.js +0 -37
  145. package/dist/core/config.d.ts +0 -80
  146. package/dist/core/config.d.ts.map +0 -1
  147. package/dist/core/config.js +0 -321
  148. package/dist/core/devtools.d.ts.map +0 -1
  149. package/dist/core/env.d.ts +0 -4
  150. package/dist/core/env.d.ts.map +0 -1
  151. package/dist/core/env.js +0 -26
  152. package/dist/core/focusManager.d.ts +0 -33
  153. package/dist/core/focusManager.d.ts.map +0 -1
  154. package/dist/core/focusManager.js +0 -122
  155. package/dist/core/index.d.ts.map +0 -1
  156. package/dist/core/keys.d.ts +0 -59
  157. package/dist/core/keys.d.ts.map +0 -1
  158. package/dist/core/keys.js +0 -107
  159. package/dist/core/queryOptions.d.ts +0 -19
  160. package/dist/core/queryOptions.d.ts.map +0 -1
  161. package/dist/core/queryOptions.js +0 -44
  162. package/dist/features/index.d.ts.map +0 -1
  163. package/dist/features/offline.d.ts +0 -48
  164. package/dist/features/offline.d.ts.map +0 -1
  165. package/dist/features/offline.js +0 -269
  166. package/dist/features/persistence.d.ts +0 -36
  167. package/dist/features/persistence.d.ts.map +0 -1
  168. package/dist/features/persistence.js +0 -186
  169. package/dist/hooks/batchQueries.d.ts +0 -129
  170. package/dist/hooks/batchQueries.d.ts.map +0 -1
  171. package/dist/hooks/batchQueries.js +0 -301
  172. package/dist/hooks/index.d.ts.map +0 -1
  173. package/dist/hooks/useDataGuardMutation.d.ts +0 -39
  174. package/dist/hooks/useDataGuardMutation.d.ts.map +0 -1
  175. package/dist/hooks/useDataGuardMutation.js +0 -151
  176. package/dist/hooks/useDataGuardQuery.d.ts +0 -28
  177. package/dist/hooks/useDataGuardQuery.d.ts.map +0 -1
  178. package/dist/hooks/useDataGuardQuery.js +0 -71
  179. package/dist/hooks/useFocusManager.d.ts +0 -41
  180. package/dist/hooks/useFocusManager.d.ts.map +0 -1
  181. package/dist/hooks/useFocusManager.js +0 -109
  182. package/dist/hooks/useInViewPrefetch.d.ts.map +0 -1
  183. package/dist/hooks/useInfiniteQuery.d.ts +0 -33
  184. package/dist/hooks/useInfiniteQuery.d.ts.map +0 -1
  185. package/dist/hooks/useInfiniteQuery.js +0 -61
  186. package/dist/hooks/useMutation.d.ts +0 -25
  187. package/dist/hooks/useMutation.d.ts.map +0 -1
  188. package/dist/hooks/useMutation.js +0 -180
  189. package/dist/hooks/usePrefetch.d.ts +0 -54
  190. package/dist/hooks/usePrefetch.d.ts.map +0 -1
  191. package/dist/hooks/usePrefetch.js +0 -229
  192. package/dist/hooks/useQuery.d.ts +0 -21
  193. package/dist/hooks/useQuery.d.ts.map +0 -1
  194. package/dist/hooks/useQuery.js +0 -46
  195. package/dist/hooks/useSuspenseQuery.d.ts +0 -11
  196. package/dist/hooks/useSuspenseQuery.d.ts.map +0 -1
  197. package/dist/hooks/useSuspenseQuery.js +0 -19
  198. package/dist/index.d.ts.map +0 -1
  199. package/dist/react-query/index.d.ts.map +0 -1
  200. package/dist/types/base.d.ts.map +0 -1
  201. package/dist/types/base.js +0 -26
  202. package/dist/types/dataGuard.d.ts +0 -69
  203. package/dist/types/dataGuard.d.ts.map +0 -1
  204. package/dist/types/dataGuard.js +0 -10
  205. package/dist/types/index.d.ts.map +0 -1
  206. package/dist/types/infinite.d.ts +0 -39
  207. package/dist/types/infinite.d.ts.map +0 -1
  208. package/dist/types/infinite.js +0 -1
  209. package/dist/types/offline.d.ts.map +0 -1
  210. package/dist/types/offline.js +0 -8
  211. package/dist/types/optimistic.d.ts +0 -126
  212. package/dist/types/optimistic.d.ts.map +0 -1
  213. package/dist/types/optimistic.js +0 -7
  214. package/dist/types/persistence.d.ts +0 -9
  215. package/dist/types/persistence.d.ts.map +0 -1
  216. package/dist/types/persistence.js +0 -1
  217. package/dist/types/selectors.d.ts +0 -11
  218. package/dist/types/selectors.d.ts.map +0 -1
  219. package/dist/types/selectors.js +0 -1
  220. package/dist/types/suspense.d.ts +0 -67
  221. package/dist/types/suspense.d.ts.map +0 -1
  222. package/dist/types/suspense.js +0 -1
  223. package/dist/utils/dataGuard.d.ts +0 -37
  224. package/dist/utils/dataGuard.d.ts.map +0 -1
  225. package/dist/utils/dataGuard.js +0 -257
  226. package/dist/utils/fieldMapper.d.ts +0 -9
  227. package/dist/utils/fieldMapper.d.ts.map +0 -1
  228. package/dist/utils/fieldMapper.js +0 -27
  229. package/dist/utils/index.d.ts.map +0 -1
  230. package/dist/utils/network.d.ts +0 -9
  231. package/dist/utils/network.d.ts.map +0 -1
  232. package/dist/utils/network.js +0 -43
  233. package/dist/utils/optimisticUtils.d.ts +0 -45
  234. package/dist/utils/optimisticUtils.d.ts.map +0 -1
  235. package/dist/utils/optimisticUtils.js +0 -116
  236. package/dist/utils/placeholderData.d.ts +0 -3
  237. package/dist/utils/placeholderData.d.ts.map +0 -1
  238. package/dist/utils/placeholderData.js +0 -28
  239. package/dist/utils/prefetchManager.d.ts +0 -111
  240. package/dist/utils/prefetchManager.d.ts.map +0 -1
  241. package/dist/utils/prefetchManager.js +0 -246
  242. package/dist/utils/queryKey.d.ts +0 -24
  243. package/dist/utils/queryKey.d.ts.map +0 -1
  244. package/dist/utils/queryKey.js +0 -77
  245. package/dist/utils/selectors.d.ts +0 -30
  246. package/dist/utils/selectors.d.ts.map +0 -1
  247. package/dist/utils/selectors.js +0 -18
  248. package/dist/utils/storage.d.ts +0 -7
  249. package/dist/utils/storage.d.ts.map +0 -1
  250. package/dist/utils/storage.js +0 -84
@@ -1,186 +0,0 @@
1
- function isSerializable(data) {
2
- try {
3
- JSON.stringify(data);
4
- return true;
5
- }
6
- catch {
7
- return false;
8
- }
9
- }
10
- function handleStorageQuotaError(error, key) {
11
- if (error instanceof Error && error.name === "QuotaExceededError") {
12
- try {
13
- window.localStorage.removeItem(key);
14
- }
15
- catch { }
16
- }
17
- }
18
- function createSafeStorage(storage, key) {
19
- return {
20
- getItem: (storageKey) => { try {
21
- return storage.getItem(storageKey);
22
- }
23
- catch {
24
- return null;
25
- } },
26
- setItem: (storageKey, value) => { try {
27
- storage.setItem(storageKey, value);
28
- }
29
- catch (error) {
30
- handleStorageQuotaError(error, key);
31
- } },
32
- removeItem: (storageKey) => { try {
33
- storage.removeItem(storageKey);
34
- }
35
- catch { } },
36
- clear: () => { try {
37
- storage.clear();
38
- }
39
- catch { } },
40
- key: (index) => { try {
41
- return storage.key(index);
42
- }
43
- catch {
44
- return null;
45
- } },
46
- get length() {
47
- try {
48
- return storage.length;
49
- }
50
- catch {
51
- return 0;
52
- }
53
- }
54
- };
55
- }
56
- export function createPersistOptions(config = {}) {
57
- const { maxAge = 1000 * 60 * 60 * 24, onlyPersistSuccess = true, dehydrateOptions } = config;
58
- return {
59
- maxAge,
60
- dehydrateOptions: {
61
- ...dehydrateOptions,
62
- shouldDehydrateQuery: dehydrateOptions?.shouldDehydrateQuery ||
63
- (onlyPersistSuccess
64
- ? (query) => {
65
- if (query.state.status !== "success")
66
- return false;
67
- if (!isSerializable(query.state.data))
68
- return false;
69
- return true;
70
- }
71
- : undefined)
72
- }
73
- };
74
- }
75
- export function createPersister(storageKey = "tanstack-query-cache", storage, onError) {
76
- if (typeof window === "undefined") {
77
- return undefined;
78
- }
79
- const targetStorage = storage || window.localStorage;
80
- if (!targetStorage) {
81
- return undefined;
82
- }
83
- try {
84
- const safeStorage = createSafeStorage(targetStorage, storageKey);
85
- const persister = {
86
- persistClient: async (client) => { try {
87
- safeStorage.setItem(storageKey, JSON.stringify(client));
88
- }
89
- catch (e) {
90
- if (onError && e instanceof Error) {
91
- onError(e);
92
- }
93
- } },
94
- restoreClient: async () => { try {
95
- const raw = safeStorage.getItem(storageKey);
96
- return raw ? JSON.parse(raw) : undefined;
97
- }
98
- catch (e) {
99
- if (onError && e instanceof Error) {
100
- onError(e);
101
- }
102
- return undefined;
103
- } },
104
- removeClient: async () => { try {
105
- safeStorage.removeItem(storageKey);
106
- }
107
- catch (e) {
108
- if (onError && e instanceof Error) {
109
- onError(e);
110
- }
111
- } }
112
- };
113
- return persister;
114
- }
115
- catch {
116
- return undefined;
117
- }
118
- }
119
- export function clearCache(key = "tanstack-query-cache") { try {
120
- window.localStorage.removeItem(key);
121
- }
122
- catch { } }
123
- export function clearExpiredCache(key = "tanstack-query-cache", maxAge = 1000 * 60 * 60 * 24) {
124
- try {
125
- const stored = window.localStorage.getItem(key);
126
- if (!stored)
127
- return;
128
- const parsed = JSON.parse(stored);
129
- const now = Date.now();
130
- if (parsed.timestamp && now - parsed.timestamp > maxAge) {
131
- window.localStorage.removeItem(key);
132
- }
133
- }
134
- catch { }
135
- }
136
- export async function migrateToIndexedDB(localStorageKey = "tanstack-query-cache", indexedDBKey = "tanstack-query-cache", indexedDBStorage) {
137
- try {
138
- const localData = window.localStorage.getItem(localStorageKey);
139
- if (!localData) {
140
- return true;
141
- }
142
- const parsed = JSON.parse(localData);
143
- if (!parsed.clientState) {
144
- return false;
145
- }
146
- const setItemResult = indexedDBStorage.setItem(indexedDBKey, localData);
147
- if (setItemResult instanceof Promise) {
148
- await setItemResult;
149
- }
150
- window.localStorage.removeItem(localStorageKey);
151
- return true;
152
- }
153
- catch {
154
- return false;
155
- }
156
- }
157
- export function checkStorageSize(key = "tanstack-query-cache") {
158
- try {
159
- const data = window.localStorage.getItem(key);
160
- if (!data) {
161
- return { sizeInBytes: 0, sizeInMB: 0, shouldMigrate: false, message: "No cache data found" };
162
- }
163
- const sizeInBytes = new Blob([data]).size;
164
- const sizeInMB = sizeInBytes / (1024 * 1024);
165
- const shouldMigrate = sizeInMB > 5;
166
- return { sizeInBytes, sizeInMB: Math.round(sizeInMB * 100) / 100, shouldMigrate, message: shouldMigrate ? `Cache size (${sizeInMB.toFixed(2)}MB) exceeds recommended limit. Consider migrating to IndexedDB.` : `Cache size (${sizeInMB.toFixed(2)}MB) is within acceptable range.` };
167
- }
168
- catch {
169
- return { sizeInBytes: 0, sizeInMB: 0, shouldMigrate: false, message: "Failed to check storage size" };
170
- }
171
- }
172
- export function getStorageStats(key = "tanstack-query-cache") {
173
- try {
174
- const data = window.localStorage.getItem(key);
175
- if (!data) {
176
- return { exists: false, sizeInfo: checkStorageSize(key) };
177
- }
178
- const parsed = JSON.parse(data);
179
- const now = Date.now();
180
- const age = parsed.timestamp ? now - parsed.timestamp : undefined;
181
- return { exists: true, age, queriesCount: parsed.clientState?.queries?.length, mutationsCount: parsed.clientState?.mutations?.length, sizeInfo: checkStorageSize(key) };
182
- }
183
- catch {
184
- return { exists: false, sizeInfo: checkStorageSize(key) };
185
- }
186
- }
@@ -1,129 +0,0 @@
1
- import type { QueryClient, UseQueryOptions, UseQueryResult, UseSuspenseQueryOptions, UseSuspenseQueryResult, DefaultError } from "@tanstack/react-query";
2
- import type { BatchErrorAggregate, BatchOperationReport, BatchQueryConfig, BatchQueryOperations, BatchQueryStats } from "../types/optimistic";
3
- interface InternalBatchQueryOperations extends BatchQueryOperations {
4
- _queryClient: QueryClient;
5
- _queries: UseQueryOptions[];
6
- _results: UseQueryResult[] | UseSuspenseQueryResult[];
7
- }
8
- export declare function calculateBatchStats(results: UseQueryResult[] | UseSuspenseQueryResult[]): BatchQueryStats;
9
- export declare function useEnhancedQueries(queries: UseQueryOptions[], config?: BatchQueryConfig): {
10
- data: UseQueryResult<unknown, Error>[];
11
- stats: BatchQueryStats;
12
- operations: InternalBatchQueryOperations;
13
- config: BatchQueryConfig<unknown, Error>;
14
- };
15
- export declare function useEnhancedSuspenseQueries(queries: UseSuspenseQueryOptions[], config?: BatchQueryConfig): {
16
- data: UseSuspenseQueryResult<unknown, Error>[];
17
- stats: BatchQueryStats;
18
- operations: InternalBatchQueryOperations;
19
- config: BatchQueryConfig<unknown, Error>;
20
- };
21
- export declare function createBatchQueryConfig(config?: Partial<BatchQueryConfig>): BatchQueryConfig;
22
- export declare const batchQueryUtils: {
23
- isAllLoading: (results: UseQueryResult[] | UseSuspenseQueryResult[]) => boolean;
24
- isAllSuccess: (results: UseQueryResult[] | UseSuspenseQueryResult[]) => boolean;
25
- hasError: (results: UseQueryResult[] | UseSuspenseQueryResult[]) => boolean;
26
- hasStale: (results: UseQueryResult[] | UseSuspenseQueryResult[]) => boolean;
27
- getAllErrors: (results: UseQueryResult[] | UseSuspenseQueryResult[]) => Error[];
28
- getAllData: (results: UseQueryResult[] | UseSuspenseQueryResult[]) => unknown[];
29
- isAllPending: (results: UseQueryResult[] | UseSuspenseQueryResult[]) => boolean;
30
- isAnyFetching: (results: UseQueryResult[] | UseSuspenseQueryResult[]) => boolean;
31
- getSuccessData: <T>(results: UseQueryResult<T>[]) => T[];
32
- getFirstError: (results: UseQueryResult[] | UseSuspenseQueryResult[]) => Error | null;
33
- createErrorAggregate: <TError = Error>(results: UseQueryResult[] | UseSuspenseQueryResult[], queries: UseQueryOptions[]) => BatchErrorAggregate<TError>;
34
- createOperationReport: <TData = unknown, TError = Error>(results: UseQueryResult[] | UseSuspenseQueryResult[], queries: UseQueryOptions[], startTime: number, retryCount?: number) => BatchOperationReport<TData, TError>;
35
- };
36
- export declare function useCombinedQueries<TCombinedResult = UseQueryResult[]>(options: {
37
- queries: UseQueryOptions[];
38
- combine?: (results: UseQueryResult[]) => TCombinedResult;
39
- }): TCombinedResult;
40
- export declare function useDynamicBatchQueries<TItem, TData = unknown>(options: {
41
- items: TItem[];
42
- queryKeyPrefix: unknown[];
43
- queryFn: (item: TItem) => Promise<TData>;
44
- enabled?: boolean;
45
- staleTime?: number;
46
- gcTime?: number;
47
- config?: BatchQueryConfig;
48
- }): {
49
- data: UseQueryResult<unknown, Error>[];
50
- stats: BatchQueryStats;
51
- operations: InternalBatchQueryOperations;
52
- config: BatchQueryConfig<unknown, Error>;
53
- };
54
- export declare function useDependentBatchQueries<TPrimaryData>(options: {
55
- primaryQuery: UseQueryOptions<TPrimaryData>;
56
- dependentQueries: (data: TPrimaryData) => UseQueryOptions[];
57
- config?: BatchQueryConfig;
58
- }): DependentBatchQueriesResult<TPrimaryData>;
59
- export interface DependentBatchQueriesResult<TPrimaryData> {
60
- primaryResult: UseQueryResult<TPrimaryData, DefaultError>;
61
- results: UseQueryResult[];
62
- stats: BatchQueryStats;
63
- operations: InternalBatchQueryOperations;
64
- }
65
- export declare function useAutoRefreshBatchQueries(options: {
66
- queries: UseQueryOptions[];
67
- refreshInterval?: number;
68
- enabled?: boolean;
69
- config?: BatchQueryConfig;
70
- }): {
71
- data: UseQueryResult<unknown, Error>[];
72
- stats: BatchQueryStats;
73
- operations: InternalBatchQueryOperations;
74
- config: BatchQueryConfig<unknown, Error>;
75
- };
76
- export declare function useDashboardQueries<T extends Record<string, UseQueryOptions>>(queriesMap: T): {
77
- data: { [K in keyof T]: T[K] extends UseQueryOptions<infer TData, Error, infer TData, readonly unknown[]> ? TData : unknown; };
78
- results: UseQueryResult<unknown, Error>[];
79
- stats: BatchQueryStats;
80
- isLoading: boolean;
81
- isError: boolean;
82
- isSuccess: boolean;
83
- };
84
- export declare function usePaginatedBatchQueries<TData = unknown>(options: {
85
- pageNumbers: number[];
86
- queryKeyPrefix: unknown[];
87
- queryFn: (page: number) => Promise<TData>;
88
- staleTime?: number;
89
- config?: BatchQueryConfig;
90
- }): {
91
- data: UseQueryResult<unknown, Error>[];
92
- stats: BatchQueryStats;
93
- operations: InternalBatchQueryOperations;
94
- config: BatchQueryConfig<unknown, Error>;
95
- };
96
- export declare function useConditionalBatchQueries(queries: (UseQueryOptions & {
97
- enabled?: boolean;
98
- })[]): {
99
- data: UseQueryResult<unknown, Error>[];
100
- stats: BatchQueryStats;
101
- operations: InternalBatchQueryOperations;
102
- config: BatchQueryConfig<unknown, Error>;
103
- };
104
- export declare function useRetryBatchQueries(options: {
105
- queries: UseQueryOptions[];
106
- retry?: number | ((failureCount: number, error: Error) => boolean);
107
- retryDelay?: number | ((attemptIndex: number) => number);
108
- config?: BatchQueryConfig;
109
- }): {
110
- data: UseQueryResult<unknown, Error>[];
111
- stats: BatchQueryStats;
112
- operations: InternalBatchQueryOperations;
113
- config: BatchQueryConfig<unknown, Error>;
114
- };
115
- export declare function useBatchQueryPerformance(results: UseQueryResult[] | UseSuspenseQueryResult[]): {
116
- avgFetchTime: number;
117
- totalQueries: number;
118
- activeQueries: number;
119
- cachedQueries: number;
120
- total: number;
121
- loading: number;
122
- success: number;
123
- error: number;
124
- stale: number;
125
- successRate: number;
126
- errorRate: number;
127
- };
128
- export {};
129
- //# sourceMappingURL=batchQueries.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"batchQueries.d.ts","sourceRoot":"","sources":["../../src/hooks/batchQueries.ts"],"names":[],"mappings":"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"}
@@ -1,301 +0,0 @@
1
- import { useQueries, useQuery, useQueryClient, useSuspenseQueries } from "@tanstack/react-query";
2
- import { useEffect, useMemo, useRef } from "react";
3
- function createErrorAggregate(results, queries) {
4
- const errors = [];
5
- const errorsByType = new Map();
6
- results.forEach((result, index) => {
7
- if (result.isError && result.error) {
8
- const error = result.error;
9
- const queryKey = queries[index]?.queryKey;
10
- errors.push({ index, error, queryKey });
11
- const errorType = error instanceof Error ? error.constructor.name : "Unknown";
12
- if (!errorsByType.has(errorType)) {
13
- errorsByType.set(errorType, []);
14
- }
15
- errorsByType.get(errorType).push(error);
16
- }
17
- });
18
- const firstError = errors.length > 0 ? errors[0].error : null;
19
- const lastError = errors.length > 0 ? errors[errors.length - 1].error : null;
20
- const errorSummary = errors.length === 0 ? "No errors" : errors.length === 1 ? `1 error: ${firstError instanceof Error ? firstError.message : String(firstError)}` : `${errors.length} errors: ${Array.from(errorsByType.entries()).map(([type, errs]) => `${type}(${errs.length})`).join(", ")}`;
21
- return { totalErrors: errors.length, errors, errorsByType, firstError, lastError, errorSummary };
22
- }
23
- function createOperationReport(results, queries, startTime, retryCount = 0) {
24
- const total = results.length;
25
- const successResults = [];
26
- const failureErrors = [];
27
- results.forEach((result, index) => {
28
- if (result.isSuccess && result.data !== undefined) {
29
- successResults.push({ index, data: result.data });
30
- }
31
- else if (result.isError && result.error) {
32
- failureErrors.push({ index, error: result.error, queryKey: queries[index]?.queryKey });
33
- }
34
- });
35
- const successful = successResults.length;
36
- const failed = failureErrors.length;
37
- const isFullSuccess = successful === total && failed === 0;
38
- const isFullFailure = failed === total && successful === 0;
39
- const isPartialSuccess = successful > 0 && failed > 0;
40
- return { total, successful, failed, successResults, failureErrors, isPartialSuccess, isFullSuccess, isFullFailure, duration: Date.now() - startTime, retryCount };
41
- }
42
- async function executeBatchOperationWithRetry(operation, retryConfig) {
43
- const maxRetries = retryConfig?.maxRetries ?? 0;
44
- const retryDelay = retryConfig?.retryDelay ?? 1000;
45
- const shouldRetry = retryConfig?.shouldRetry;
46
- let retryCount = 0;
47
- let results = await operation();
48
- if (maxRetries === 0) {
49
- return { results, retryCount };
50
- }
51
- while (retryCount < maxRetries) {
52
- const hasFailures = results.some((r) => r.status === "rejected");
53
- if (!hasFailures)
54
- break;
55
- if (shouldRetry) {
56
- const firstError = results.find((r) => r.status === "rejected");
57
- if (firstError && firstError.status === "rejected") {
58
- const error = firstError.reason instanceof Error ? firstError.reason : new Error(String(firstError.reason));
59
- if (!shouldRetry(error, retryCount + 1)) {
60
- break;
61
- }
62
- }
63
- }
64
- const delay = typeof retryDelay === "function" ? retryDelay(retryCount) : retryDelay;
65
- await new Promise((resolve) => setTimeout(resolve, delay));
66
- retryCount++;
67
- results = await operation();
68
- }
69
- return { results, retryCount };
70
- }
71
- export function calculateBatchStats(results) {
72
- const total = results.length;
73
- const loading = results.filter((result) => result.isLoading).length;
74
- const success = results.filter((result) => result.isSuccess).length;
75
- const error = results.filter((result) => result.isError).length;
76
- const stale = results.filter((result) => result.isStale).length;
77
- return { total, loading, success, error, stale, successRate: total > 0 ? (success / total) * 100 : 0, errorRate: total > 0 ? (error / total) * 100 : 0 };
78
- }
79
- export function useEnhancedQueries(queries, config = {}) {
80
- const queryClient = useQueryClient();
81
- const { results, stats } = useQueries({ queries, combine: (results) => ({ results, stats: calculateBatchStats(results) }) });
82
- const retryCountRef = useRef(0);
83
- const operations = {
84
- _queryClient: queryClient,
85
- _queries: queries,
86
- _results: results,
87
- refetchAll: async () => {
88
- const operation = () => {
89
- const promises = queries.map((query) => queryClient.refetchQueries({ queryKey: query.queryKey, exact: true }));
90
- return Promise.allSettled(promises);
91
- };
92
- const { results: settledResults, retryCount } = await executeBatchOperationWithRetry(operation, config.retryConfig);
93
- retryCountRef.current = retryCount;
94
- if (config.enablePartialSuccess) {
95
- const report = operations.getOperationReport();
96
- if (report.isPartialSuccess && config.onPartialSuccess) {
97
- config.onPartialSuccess(report);
98
- }
99
- }
100
- return settledResults;
101
- },
102
- invalidateAll: async () => {
103
- const operation = () => {
104
- const promises = queries.map((query) => queryClient.invalidateQueries({ queryKey: query.queryKey, exact: true }));
105
- return Promise.allSettled(promises);
106
- };
107
- const { results: settledResults, retryCount } = await executeBatchOperationWithRetry(operation, config.retryConfig);
108
- retryCountRef.current = retryCount;
109
- return settledResults;
110
- },
111
- cancelAll: async () => {
112
- const promises = queries.map((query) => queryClient.cancelQueries({ queryKey: query.queryKey, exact: true }));
113
- return Promise.allSettled(promises);
114
- },
115
- resetAll: async () => {
116
- const operation = () => {
117
- const promises = queries.map((query) => queryClient.resetQueries({ queryKey: query.queryKey, exact: true }));
118
- return Promise.allSettled(promises);
119
- };
120
- const { results: settledResults, retryCount } = await executeBatchOperationWithRetry(operation, config.retryConfig);
121
- retryCountRef.current = retryCount;
122
- return settledResults;
123
- },
124
- removeAll: () => {
125
- queries.forEach((query) => { queryClient.removeQueries({ queryKey: query.queryKey, exact: true }); });
126
- },
127
- retryFailed: async () => {
128
- const failedIndices = results.map((result, index) => (result.isError ? index : -1)).filter((index) => index !== -1);
129
- if (failedIndices.length === 0) {
130
- return createOperationReport(results, queries, 0, 0);
131
- }
132
- const retryPromises = failedIndices.map((index) => {
133
- const query = queries[index];
134
- return queryClient.refetchQueries({ queryKey: query.queryKey, exact: true });
135
- });
136
- await Promise.allSettled(retryPromises);
137
- retryCountRef.current++;
138
- return operations.getOperationReport();
139
- },
140
- getErrorAggregate: () => { return createErrorAggregate(results, queries); },
141
- getOperationReport: () => { return createOperationReport(results, queries, 0, retryCountRef.current); }
142
- };
143
- return { data: results, stats, operations, config };
144
- }
145
- export function useEnhancedSuspenseQueries(queries, config = {}) {
146
- const queryClient = useQueryClient();
147
- const { results, stats } = useSuspenseQueries({ queries, combine: (results) => ({ results, stats: calculateBatchStats(results) }) });
148
- const retryCountRef = useRef(0);
149
- const operations = {
150
- _queryClient: queryClient,
151
- _queries: queries,
152
- _results: results,
153
- refetchAll: async () => {
154
- const operation = () => {
155
- const promises = queries.map((query) => queryClient.refetchQueries({ queryKey: query.queryKey, exact: true }));
156
- return Promise.allSettled(promises);
157
- };
158
- const { results: settledResults, retryCount } = await executeBatchOperationWithRetry(operation, config.retryConfig);
159
- retryCountRef.current = retryCount;
160
- if (config.enablePartialSuccess) {
161
- const report = operations.getOperationReport();
162
- if (report.isPartialSuccess && config.onPartialSuccess) {
163
- config.onPartialSuccess(report);
164
- }
165
- }
166
- return settledResults;
167
- },
168
- invalidateAll: async () => {
169
- const operation = () => {
170
- const promises = queries.map((query) => queryClient.invalidateQueries({ queryKey: query.queryKey, exact: true }));
171
- return Promise.allSettled(promises);
172
- };
173
- const { results: settledResults, retryCount } = await executeBatchOperationWithRetry(operation, config.retryConfig);
174
- retryCountRef.current = retryCount;
175
- return settledResults;
176
- },
177
- cancelAll: async () => {
178
- const promises = queries.map((query) => queryClient.cancelQueries({ queryKey: query.queryKey, exact: true }));
179
- return Promise.allSettled(promises);
180
- },
181
- resetAll: async () => {
182
- const operation = () => {
183
- const promises = queries.map((query) => queryClient.resetQueries({ queryKey: query.queryKey, exact: true }));
184
- return Promise.allSettled(promises);
185
- };
186
- const { results: settledResults, retryCount } = await executeBatchOperationWithRetry(operation, config.retryConfig);
187
- retryCountRef.current = retryCount;
188
- return settledResults;
189
- },
190
- removeAll: () => {
191
- queries.forEach((query) => { queryClient.removeQueries({ queryKey: query.queryKey, exact: true }); });
192
- },
193
- retryFailed: async () => {
194
- const failedIndices = results.map((result, index) => (result.isError ? index : -1)).filter((index) => index !== -1);
195
- if (failedIndices.length === 0) {
196
- return createOperationReport(results, queries, 0, 0);
197
- }
198
- const retryPromises = failedIndices.map((index) => {
199
- const query = queries[index];
200
- return queryClient.refetchQueries({ queryKey: query.queryKey, exact: true });
201
- });
202
- await Promise.allSettled(retryPromises);
203
- retryCountRef.current++;
204
- return operations.getOperationReport();
205
- },
206
- getErrorAggregate: () => { return createErrorAggregate(results, queries); },
207
- getOperationReport: () => { return createOperationReport(results, queries, 0, retryCountRef.current); }
208
- };
209
- return { data: results, stats, operations, config };
210
- }
211
- export function createBatchQueryConfig(config = {}) {
212
- return { enableStats: true, enableBatchOperations: true, autoRefreshInterval: undefined, onBatchSuccess: undefined, onBatchError: undefined, onBatchSettled: undefined, enablePartialSuccess: false, onPartialSuccess: undefined, retryConfig: undefined, ...config };
213
- }
214
- export const batchQueryUtils = {
215
- isAllLoading: (results) => results.every((result) => result.isLoading),
216
- isAllSuccess: (results) => results.every((result) => result.isSuccess),
217
- hasError: (results) => results.some((result) => result.isError),
218
- hasStale: (results) => results.some((result) => result.isStale),
219
- getAllErrors: (results) => results.filter((result) => result.isError).map((result) => result.error).filter((error) => error instanceof Error),
220
- getAllData: (results) => results.filter((result) => result.isSuccess).map((result) => result.data),
221
- isAllPending: (results) => results.every((result) => result.isPending),
222
- isAnyFetching: (results) => results.some((result) => result.isFetching),
223
- getSuccessData: (results) => results.filter((result) => result.isSuccess && result.data !== undefined).map((result) => result.data),
224
- getFirstError: (results) => { const errorResult = results.find((result) => result.isError); return errorResult?.error instanceof Error ? errorResult.error : null; },
225
- createErrorAggregate: (results, queries) => createErrorAggregate(results, queries),
226
- createOperationReport: (results, queries, startTime, retryCount = 0) => createOperationReport(results, queries, startTime, retryCount)
227
- };
228
- export function useCombinedQueries(options) {
229
- return useQueries(options);
230
- }
231
- export function useDynamicBatchQueries(options) {
232
- const { items, queryKeyPrefix, queryFn, enabled = true, staleTime, gcTime, config = {} } = options;
233
- const queries = useMemo(() => {
234
- if (!enabled || items.length === 0)
235
- return [];
236
- return items.map((item) => ({ queryKey: [...queryKeyPrefix, item], queryFn: () => queryFn(item), staleTime, gcTime, enabled }));
237
- }, [items, queryKeyPrefix, queryFn, enabled, staleTime, gcTime]);
238
- return useEnhancedQueries(queries, config);
239
- }
240
- export function useDependentBatchQueries(options) {
241
- const { primaryQuery, dependentQueries, config = {} } = options;
242
- const primaryResult = useQuery(primaryQuery);
243
- const queries = useMemo(() => {
244
- try {
245
- if (!primaryResult.data) {
246
- return [];
247
- }
248
- return dependentQueries(primaryResult.data);
249
- }
250
- catch {
251
- return [];
252
- }
253
- }, [primaryResult.data, dependentQueries]);
254
- const enhancedQueriesResult = useEnhancedQueries(queries, config);
255
- return { primaryResult: primaryResult, results: enhancedQueriesResult.data, stats: enhancedQueriesResult.stats, operations: enhancedQueriesResult.operations };
256
- }
257
- export function useAutoRefreshBatchQueries(options) {
258
- const { queries, refreshInterval = 30000, enabled = true, config = {} } = options;
259
- const result = useEnhancedQueries(queries, config);
260
- useEffect(() => {
261
- if (!enabled || !refreshInterval || !result.operations)
262
- return;
263
- const intervalId = setInterval(() => { result.operations?.refetchAll(); }, refreshInterval);
264
- return () => clearInterval(intervalId);
265
- }, [enabled, refreshInterval, result.operations]);
266
- return result;
267
- }
268
- export function useDashboardQueries(queriesMap) {
269
- const queries = useMemo(() => { return Object.values(queriesMap); }, [queriesMap]);
270
- const { results, combinedData, stats } = useQueries({ queries, combine: (results) => {
271
- const keys = Object.keys(queriesMap);
272
- const data = {};
273
- keys.forEach((key, index) => { data[key] = results[index].data; });
274
- return { results, combinedData: data, stats: calculateBatchStats(results) };
275
- } });
276
- const isLoading = results.some((r) => r.isLoading);
277
- const isError = results.some((r) => r.isError);
278
- const isSuccess = results.every((r) => r.isSuccess);
279
- return { data: combinedData, results, stats, isLoading, isError, isSuccess };
280
- }
281
- export function usePaginatedBatchQueries(options) {
282
- const { pageNumbers, queryKeyPrefix, queryFn, staleTime, config } = options;
283
- return useDynamicBatchQueries({ items: pageNumbers, queryKeyPrefix, queryFn, staleTime, config });
284
- }
285
- export function useConditionalBatchQueries(queries) {
286
- const enabledQueries = useMemo(() => { return queries.filter((q) => q.enabled !== false); }, [queries]);
287
- return useEnhancedQueries(enabledQueries);
288
- }
289
- export function useRetryBatchQueries(options) {
290
- const { queries, retry, retryDelay, config } = options;
291
- const queriesWithRetry = useMemo(() => { return queries.map((query) => ({ ...query, retry: query.retry ?? retry, retryDelay: query.retryDelay ?? retryDelay })); }, [queries, retry, retryDelay]);
292
- return useEnhancedQueries(queriesWithRetry, config);
293
- }
294
- export function useBatchQueryPerformance(results) {
295
- return useMemo(() => {
296
- const stats = calculateBatchStats(results);
297
- const fetchTimes = results.filter((r) => r.dataUpdatedAt > 0).map((r) => r.dataUpdatedAt);
298
- const avgFetchTime = fetchTimes.length > 0 ? fetchTimes.reduce((a, b) => a + b, 0) / fetchTimes.length : 0;
299
- return { ...stats, avgFetchTime, totalQueries: results.length, activeQueries: results.filter((r) => r.isFetching).length, cachedQueries: results.filter((r) => !r.isStale).length };
300
- }, [results]);
301
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,EAC1B,wBAAwB,EACxB,kBAAkB,EAClB,0BAA0B,EAC1B,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,kBAAkB,EAClB,0BAA0B,EAC1B,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,EAChB,eAAe,EACf,KAAK,sBAAsB,EAC3B,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,KAAK,oBAAoB,EACzB,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,6BAA6B,EAAE,0BAA0B,EAAE,6BAA6B,EAAE,iCAAiC,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAC9L,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACjH,OAAO,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,gCAAgC,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACrJ,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,KAAK,wBAAwB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -1,39 +0,0 @@
1
- import type { QueryKey, UseMutationResult } from "@tanstack/react-query";
2
- import type { MutationOptions } from "../types/index.js";
3
- import type { VersionedEntity } from "../types/dataGuard.js";
4
- export interface DataGuardMutationOptions<TData, TError, TVariables, TContext> extends MutationOptions<TData, TError, TVariables, TContext> {
5
- /** 冲突错误回调 */
6
- onConflict?: (error: any) => void;
7
- }
8
- /**
9
- * 带数据防护的 Mutation Hook
10
- *
11
- * 自动处理:
12
- * 1. 乐观更新时递增版本号和更新时间戳
13
- * 2. 标记最近更新的项
14
- * 3. 成功后更新所有家族缓存的元数据
15
- * 4. 冲突检测(409 错误)
16
- * 5. 延迟清理更新标记
17
- *
18
- * @example
19
- * ```typescript
20
- * const mutation = useDataGuardMutation(
21
- * (updated) => api.updateProduct(updated.id, updated),
22
- * ['products', 'list', { page: 1, pageSize: 20 }],
23
- * {
24
- * optimistic: {
25
- * queryKey: ['products', 'list', { page: 1, pageSize: 20 }],
26
- * updater: (old, updated) => ({
27
- * ...old,
28
- * items: old?.items?.map(p => p.id === updated.id ? updated : p)
29
- * })
30
- * },
31
- * onConflict: (error) => {
32
- * toast.error('数据冲突,请刷新')
33
- * }
34
- * }
35
- * )
36
- * ```
37
- */
38
- export declare function useDataGuardMutation<TData extends VersionedEntity = VersionedEntity, TError = Error, TVariables extends VersionedEntity = VersionedEntity, TContext = unknown>(mutationFn: (data: TVariables) => Promise<TData>, queryKey: QueryKey, options?: DataGuardMutationOptions<TData, TError, TVariables, TContext>): UseMutationResult<TData, TError, TVariables, TContext>;
39
- //# sourceMappingURL=useDataGuardMutation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useDataGuardMutation.d.ts","sourceRoot":"","sources":["../../src/hooks/useDataGuardMutation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAA8B,MAAM,uBAAuB,CAAC;AAuBzF,MAAM,WAAW,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAE,SAAQ,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC;IACzI,aAAa;IACb,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,SAAS,eAAe,GAAG,eAAe,EAC/C,MAAM,GAAG,KAAK,EACd,UAAU,SAAS,eAAe,GAAG,eAAe,EACpD,QAAQ,GAAG,OAAO,EAElB,UAAU,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC,KAAK,CAAC,EAChD,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,GACtE,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAkHxD"}