@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,257 +0,0 @@
1
- /**
2
- * Check if a query key starts with a given prefix
3
- */
4
- function startsWithKeyPrefix(key, prefix) {
5
- const k = Array.isArray(key) ? key : [key];
6
- const p = Array.isArray(prefix) ? prefix : [prefix];
7
- if (p.length > k.length)
8
- return false;
9
- for (let i = 0; i < p.length; i++) {
10
- if (JSON.stringify(k[i]) !== JSON.stringify(p[i])) {
11
- return false;
12
- }
13
- }
14
- return true;
15
- }
16
- /**
17
- * 简单的字符串哈希函数(DJB2算法变体)
18
- */
19
- function simpleHash(str) {
20
- let hash = 0;
21
- for (let i = 0; i < str.length; i++) {
22
- const char = str.charCodeAt(i);
23
- hash = ((hash << 5) - hash) + char;
24
- hash = hash | 0; // 转换为32位整数
25
- }
26
- return Math.abs(hash).toString(36);
27
- }
28
- /**
29
- * 对象键排序(确保一致的哈希值)
30
- */
31
- function sortObjectKeys(obj) {
32
- if (obj === null || obj === undefined)
33
- return obj;
34
- if (typeof obj !== 'object')
35
- return obj;
36
- if (Array.isArray(obj))
37
- return obj.map(sortObjectKeys);
38
- const sorted = {};
39
- Object.keys(obj).sort().forEach(key => {
40
- sorted[key] = sortObjectKeys(obj[key]);
41
- });
42
- return sorted;
43
- }
44
- /**
45
- * 计算对象的哈希值(键排序后计算,确保一致性)
46
- */
47
- export function hashObject(obj) {
48
- try {
49
- const sorted = sortObjectKeys(obj);
50
- return simpleHash(JSON.stringify(sorted));
51
- }
52
- catch {
53
- return simpleHash(String(obj));
54
- }
55
- }
56
- /**
57
- * 自适应数据防护:根据数据特征自动选择最佳防护策略
58
- *
59
- * 策略优先级:
60
- * 1. version(版本号)- 最可靠
61
- * 2. updatedAt(时间戳)- 次优
62
- * 3. hash(内容哈希)- 兜底
63
- */
64
- export function applyDataGuard(newData, cached, queryKey, options = {}) {
65
- const { maxDataAge = 10000, enableVersionCheck = true, enableTimestampCheck = true, enableHashCheck = true } = options;
66
- // 如果没有缓存,接受新数据
67
- if (!cached) {
68
- return {
69
- shouldReject: false,
70
- reason: "No cached data",
71
- strategy: "none",
72
- guardDetails: {}
73
- };
74
- }
75
- let shouldReject = false;
76
- let reason = "";
77
- let strategy = "none";
78
- let guardDetails = {};
79
- // ============================================
80
- // 策略1:版本号比较(最可靠)
81
- // ============================================
82
- if (enableVersionCheck && cached.version !== undefined && newData.version !== undefined) {
83
- strategy = "version";
84
- if (newData.version < cached.version) {
85
- shouldReject = true;
86
- reason = `版本号回退:缓存版本 ${cached.version} > 新数据版本 ${newData.version}`;
87
- guardDetails = {
88
- cachedVersion: cached.version,
89
- newVersion: newData.version,
90
- diff: cached.version - newData.version
91
- };
92
- }
93
- else if (newData.version === cached.version) {
94
- guardDetails = {
95
- version: newData.version,
96
- status: "identical"
97
- };
98
- }
99
- else {
100
- guardDetails = {
101
- cachedVersion: cached.version,
102
- newVersion: newData.version,
103
- status: "updated"
104
- };
105
- }
106
- }
107
- // ============================================
108
- // 策略2:时间戳比较(次优)
109
- // ============================================
110
- else if (enableTimestampCheck && cached.updatedAt && newData.updatedAt) {
111
- strategy = "timestamp";
112
- try {
113
- const cachedTime = new Date(cached.updatedAt).getTime();
114
- const newTime = new Date(newData.updatedAt).getTime();
115
- const timeDiff = cachedTime - newTime;
116
- const dataAge = Date.now() - newTime;
117
- guardDetails = {
118
- cachedTime: cached.updatedAt,
119
- newTime: newData.updatedAt,
120
- timeDiff,
121
- dataAge
122
- };
123
- // 新数据的时间戳更旧
124
- if (newTime < cachedTime) {
125
- // 如果数据年龄超过阈值,拒绝
126
- if (dataAge > maxDataAge) {
127
- shouldReject = true;
128
- reason = `时间戳过期:新数据时间 ${newData.updatedAt} 早于缓存 ${cached.updatedAt},且数据年龄 ${dataAge}ms 超过阈值 ${maxDataAge}ms`;
129
- }
130
- else {
131
- // 数据年龄在可接受范围内,记录警告但接受
132
- guardDetails.warning = `时间戳略旧但在可接受范围内(${dataAge}ms < ${maxDataAge}ms)`;
133
- }
134
- }
135
- }
136
- catch (error) {
137
- guardDetails.error = `时间戳解析失败: ${error}`;
138
- // 时间戳解析失败,不使用时间戳策略
139
- // 将在下一个 else if 中尝试 hash 策略
140
- }
141
- }
142
- // ============================================
143
- // 策略3:内容哈希比较(兜底)
144
- // ============================================
145
- else if (enableHashCheck) {
146
- strategy = "hash";
147
- const newHash = hashObject(newData.items);
148
- const cachedHash = cached._hash;
149
- guardDetails = {
150
- cachedHash,
151
- newHash,
152
- identical: cachedHash === newHash
153
- };
154
- if (cachedHash && cachedHash === newHash) {
155
- // 内容完全相同,不需要更新
156
- shouldReject = true;
157
- reason = "内容哈希相同,数据未变化";
158
- }
159
- else if (cachedHash && cached._recentlyUpdatedIds && cached._recentlyUpdatedIds.size > 0) {
160
- // 检查最近更新的项是否被回退
161
- let hasRevert = false;
162
- for (const id of cached._recentlyUpdatedIds) {
163
- const cachedItem = cached.items.find(item => item.id === id);
164
- const newItem = newData.items.find(item => item.id === id);
165
- if (cachedItem && newItem) {
166
- const cachedItemHash = hashObject(cachedItem);
167
- const newItemHash = hashObject(newItem);
168
- if (cachedItemHash !== newItemHash) {
169
- // 简单启发式:如果缓存项有更多字段,可能是新的
170
- if (Object.keys(cachedItem).length > Object.keys(newItem).length) {
171
- hasRevert = true;
172
- guardDetails.revertedItem = { id, cachedItem, newItem };
173
- break;
174
- }
175
- }
176
- }
177
- }
178
- if (hasRevert) {
179
- shouldReject = true;
180
- reason = "检测到最近更新的项可能被回退";
181
- }
182
- }
183
- }
184
- return {
185
- shouldReject,
186
- reason,
187
- strategy,
188
- guardDetails
189
- };
190
- }
191
- /**
192
- * 为查询数据添加哈希标记
193
- */
194
- export function addHashToData(data) {
195
- return {
196
- ...data,
197
- _hash: hashObject(data.items)
198
- };
199
- }
200
- /**
201
- * 标记最近更新的项
202
- */
203
- export function markRecentlyUpdated(data, updatedId) {
204
- const recentlyUpdatedIds = new Set(data._recentlyUpdatedIds || []);
205
- recentlyUpdatedIds.add(updatedId);
206
- return {
207
- ...data,
208
- _recentlyUpdatedIds: recentlyUpdatedIds
209
- };
210
- }
211
- /**
212
- * 清理最近更新的标记
213
- */
214
- export function clearRecentlyUpdated(data, updatedId) {
215
- if (!data._recentlyUpdatedIds)
216
- return data;
217
- const recentlyUpdatedIds = new Set(data._recentlyUpdatedIds);
218
- recentlyUpdatedIds.delete(updatedId);
219
- return {
220
- ...data,
221
- _recentlyUpdatedIds: recentlyUpdatedIds.size > 0 ? recentlyUpdatedIds : undefined
222
- };
223
- }
224
- /**
225
- * 更新所有家族缓存的元数据(版本号、时间戳、哈希)
226
- */
227
- export function updateFamilyMetadata(queryClient, familyKey, response) {
228
- const cache = queryClient.getQueryCache();
229
- const queries = cache.findAll({
230
- predicate: (q) => startsWithKeyPrefix(q.queryKey, familyKey)
231
- });
232
- queries.forEach((q) => {
233
- const old = queryClient.getQueryData(q.queryKey);
234
- if (old) {
235
- const updated = { ...old };
236
- // 更新版本号
237
- if (response.version !== undefined) {
238
- updated.version = response.version;
239
- }
240
- else if (old.version !== undefined) {
241
- updated.version = old.version + 1;
242
- }
243
- // 更新时间戳
244
- if (response.updatedAt) {
245
- updated.updatedAt = response.updatedAt;
246
- }
247
- else if (old.updatedAt !== undefined) {
248
- updated.updatedAt = new Date().toISOString();
249
- }
250
- // 更新哈希(安全检查:确保 items 存在)
251
- if (old._hash !== undefined && updated.items) {
252
- updated._hash = hashObject(updated.items);
253
- }
254
- queryClient.setQueryData(q.queryKey, updated);
255
- }
256
- });
257
- }
@@ -1,9 +0,0 @@
1
- import type { QueryClient } from "@tanstack/react-query";
2
- export interface FieldMappingConfig {
3
- nameField: string;
4
- configKey: string;
5
- }
6
- export declare function createFieldEnricher<T = any>(queryKey: any, mappings: Record<string, FieldMappingConfig>): (data: T, queryClient: QueryClient) => T;
7
- export declare function createTempId(prefix?: string): string;
8
- export declare function createOptimisticBase(customFields?: Record<string, any>): Record<string, any>;
9
- //# sourceMappingURL=fieldMapper.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fieldMapper.d.ts","sourceRoot":"","sources":["../../src/utils/fieldMapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,MAAM,WAAW,kBAAkB;IAAG,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AAC5E,wBAAgB,mBAAmB,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,IAC9F,MAAM,CAAC,EAAE,aAAa,WAAW,KAAG,CAAC,CAe9C;AACD,wBAAgB,YAAY,CAAC,MAAM,SAAS,GAAG,MAAM,CAAgF;AACrI,wBAAgB,oBAAoB,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAG5F"}
@@ -1,27 +0,0 @@
1
- export function createFieldEnricher(queryKey, mappings) {
2
- return (data, queryClient) => {
3
- const config = queryClient.getQueryData(queryKey);
4
- if (!config)
5
- return data;
6
- const result = { ...data };
7
- Object.entries(mappings).forEach(([idField, { nameField, configKey }]) => {
8
- const idValue = data[idField];
9
- if (idValue == null)
10
- return;
11
- const options = config[configKey];
12
- if (!options?.length)
13
- return;
14
- const optionMap = new Map(options.map((item) => [String(item.value), item.label]));
15
- const label = optionMap.get(String(idValue));
16
- if (label) {
17
- result[nameField] = label;
18
- }
19
- });
20
- return result;
21
- };
22
- }
23
- export function createTempId(prefix = "temp") { return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`; }
24
- export function createOptimisticBase(customFields) {
25
- const now = new Date().toISOString();
26
- return { createTime: now, updateTime: now, createUser: "", updateUser: "", deleteStatus: 0, ...customFields };
27
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACpH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC3H,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,KAAK,sBAAsB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC1P,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACpO,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,oBAAoB,EAAE,KAAK,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACxN,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAChM,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -1,9 +0,0 @@
1
- import type { NetworkInformation } from "../types/base";
2
- export interface NavigatorWithConnection extends Navigator {
3
- connection?: NetworkInformation;
4
- }
5
- export declare function isSlowNetwork(): boolean;
6
- export declare function getNetworkInfo(): NetworkInformation | null;
7
- export declare function isFastNetwork(): boolean;
8
- export declare function getNetworkSpeed(): "fast" | "medium" | "slow" | "unknown";
9
- //# sourceMappingURL=network.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/utils/network.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,MAAM,WAAW,uBAAwB,SAAQ,SAAS;IAAG,UAAU,CAAC,EAAE,kBAAkB,CAAA;CAAE;AAE9F,wBAAgB,aAAa,IAAI,OAAO,CAMvC;AACD,wBAAgB,cAAc,IAAI,kBAAkB,GAAG,IAAI,CAI1D;AACD,wBAAgB,aAAa,IAAI,OAAO,CAIvC;AACD,wBAAgB,eAAe,IAAI,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAUxE"}
@@ -1,43 +0,0 @@
1
- function hasConnectionAPI(nav) { return "connection" in nav; }
2
- export function isSlowNetwork() {
3
- if (typeof navigator === "undefined") {
4
- return false;
5
- }
6
- if (!hasConnectionAPI(navigator)) {
7
- return false;
8
- }
9
- const connection = navigator.connection;
10
- if (!connection) {
11
- return false;
12
- }
13
- return connection.effectiveType === "slow-2g" || connection.effectiveType === "2g" || connection.saveData === true;
14
- }
15
- export function getNetworkInfo() {
16
- if (typeof navigator === "undefined") {
17
- return null;
18
- }
19
- if (!hasConnectionAPI(navigator)) {
20
- return null;
21
- }
22
- return navigator.connection || null;
23
- }
24
- export function isFastNetwork() {
25
- const networkInfo = getNetworkInfo();
26
- if (!networkInfo) {
27
- return true;
28
- }
29
- return networkInfo.effectiveType === "4g" && networkInfo.saveData !== true;
30
- }
31
- export function getNetworkSpeed() {
32
- const networkInfo = getNetworkInfo();
33
- if (!networkInfo || !networkInfo.effectiveType) {
34
- return "unknown";
35
- }
36
- switch (networkInfo.effectiveType) {
37
- case "4g": return "fast";
38
- case "3g": return "medium";
39
- case "2g":
40
- case "slow-2g": return "slow";
41
- default: return "unknown";
42
- }
43
- }
@@ -1,45 +0,0 @@
1
- import type { QueryKey } from "@tanstack/react-query";
2
- import type { ListOperationConfig, OptimisticUpdateConfig } from "../types/optimistic";
3
- import type { EntityWithId } from "../types/selectors";
4
- import { ListOperationType } from "../types/optimistic.js";
5
- /**
6
- * Loose equality check for IDs (string vs number)
7
- */
8
- export declare function idsAreEqual(a: unknown, b: unknown): boolean;
9
- export declare const listUpdater: {
10
- add: <T extends EntityWithId>(items: T[] | undefined, newItem: T) => T[];
11
- update: <T extends EntityWithId>(items: T[] | undefined, updatedItem: Partial<T> & {
12
- id: T["id"];
13
- }) => T[];
14
- remove: <T extends EntityWithId>(items: T[] | undefined, itemId: T["id"]) => T[];
15
- };
16
- export declare function createAddItemConfig<T extends EntityWithId>(queryKey: QueryKey, options?: {
17
- addToTop?: boolean;
18
- onRollback?: (error: Error) => void;
19
- }): OptimisticUpdateConfig<T[], T>;
20
- export declare function createUpdateItemConfig<T extends EntityWithId>(queryKey: QueryKey, options?: {
21
- onRollback?: (error: Error) => void;
22
- }): OptimisticUpdateConfig<T[], Partial<T> & {
23
- id: T["id"];
24
- }>;
25
- export declare function createRemoveItemConfig<T extends EntityWithId>(queryKey: QueryKey, options?: {
26
- onRollback?: (error: Error) => void;
27
- }): OptimisticUpdateConfig<T[], T["id"]>;
28
- export type ListOperationVariables<T extends EntityWithId, TOperation extends ListOperationType> = TOperation extends ListOperationType.ADD ? T : TOperation extends ListOperationType.UPDATE ? Partial<T> & {
29
- id: T["id"];
30
- } : TOperation extends ListOperationType.REMOVE ? T["id"] : never;
31
- export declare function createListOperationConfig<T extends EntityWithId, TOperation extends ListOperationType = ListOperationType>(config: ListOperationConfig<T>): OptimisticUpdateConfig<T[], ListOperationVariables<T, TOperation>>;
32
- export declare function batchUpdateItems<T extends EntityWithId>(items: T[] | undefined | null, updates: Array<Partial<T> & {
33
- id: T["id"];
34
- }>): T[];
35
- export declare function batchRemoveItems<T extends EntityWithId>(items: T[] | undefined | null, itemIds: Array<T["id"]>): T[];
36
- export declare function reorderItems<T extends EntityWithId>(items: T[] | undefined | null, fromIndex: number, toIndex: number): T[];
37
- export declare function conditionalUpdateItems<T extends EntityWithId>(items: T[] | undefined | null, predicate: (item: T) => boolean, updater: (item: T) => Partial<T>): T[];
38
- export declare function applyListOperationToPaginated<T extends EntityWithId>(data: {
39
- items: T[];
40
- total?: number;
41
- }, operation: ListOperationType, payload: Partial<T>): {
42
- items: T[];
43
- total?: number;
44
- };
45
- //# sourceMappingURL=optimisticUtils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"optimisticUtils.d.ts","sourceRoot":"","sources":["../../src/utils/optimisticUtils.ts"],"names":[],"mappings":"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"}
@@ -1,116 +0,0 @@
1
- import { ListOperationType } from "../types/optimistic.js";
2
- /**
3
- * Loose equality check for IDs (string vs number)
4
- */
5
- export function idsAreEqual(a, b) {
6
- if (a === b)
7
- return true;
8
- if (a === undefined || a === null || b === undefined || b === null)
9
- return false;
10
- return String(a) === String(b);
11
- }
12
- export const listUpdater = {
13
- add: (items, newItem) => {
14
- const currentItems = items || [];
15
- const existingIndex = currentItems.findIndex((item) => idsAreEqual(item.id, newItem.id));
16
- if (existingIndex >= 0) {
17
- const updatedItems = [...currentItems];
18
- updatedItems[existingIndex] = newItem;
19
- return updatedItems;
20
- }
21
- return [newItem, ...currentItems];
22
- },
23
- update: (items, updatedItem) => {
24
- const currentItems = items || [];
25
- return currentItems.map((item) => (idsAreEqual(item.id, updatedItem.id) ? { ...item, ...updatedItem } : item));
26
- },
27
- remove: (items, itemId) => {
28
- const currentItems = items || [];
29
- return currentItems.filter((item) => !idsAreEqual(item.id, itemId));
30
- }
31
- };
32
- export function createAddItemConfig(queryKey, options) {
33
- return { queryKey, updater: (oldData, newItem) => { const currentItems = oldData || []; if (options?.addToTop !== false) {
34
- return [newItem, ...currentItems];
35
- } return [...currentItems, newItem]; }, rollback: options?.onRollback ? (_previousData, error) => { options.onRollback(error); } : undefined, enabled: true };
36
- }
37
- export function createUpdateItemConfig(queryKey, options) {
38
- return { queryKey, updater: (oldData, updatedItem) => { return listUpdater.update(oldData, updatedItem); }, rollback: options?.onRollback ? (_previousData, error) => { options.onRollback(error); } : undefined, enabled: true };
39
- }
40
- export function createRemoveItemConfig(queryKey, options) {
41
- return { queryKey, updater: (oldData, itemId) => { return listUpdater.remove(oldData, itemId); }, rollback: options?.onRollback ? (_previousData, error) => { options.onRollback(error); } : undefined, enabled: true };
42
- }
43
- export function createListOperationConfig(config) {
44
- return {
45
- queryKey: config.queryKey,
46
- updater: (oldData, variables) => {
47
- switch (config.operation) {
48
- case ListOperationType.ADD:
49
- return listUpdater.add(oldData, variables);
50
- case ListOperationType.UPDATE:
51
- return listUpdater.update(oldData, variables);
52
- case ListOperationType.REMOVE:
53
- return listUpdater.remove(oldData, variables);
54
- default:
55
- return oldData || [];
56
- }
57
- },
58
- rollback: config.onRollback
59
- ? (previousData, error) => {
60
- const opType = config.operation === ListOperationType.ADD
61
- ? "create"
62
- : config.operation === ListOperationType.REMOVE
63
- ? "delete"
64
- : "update";
65
- config.onRollback(error, { previousData, timestamp: Date.now(), operationType: opType });
66
- }
67
- : undefined,
68
- enabled: true
69
- };
70
- }
71
- export function batchUpdateItems(items, updates) {
72
- let currentItems = items || [];
73
- updates.forEach((update) => { currentItems = listUpdater.update(currentItems, update); });
74
- return currentItems;
75
- }
76
- export function batchRemoveItems(items, itemIds) {
77
- let currentItems = items || [];
78
- itemIds.forEach((itemId) => { currentItems = listUpdater.remove(currentItems, itemId); });
79
- return currentItems;
80
- }
81
- export function reorderItems(items, fromIndex, toIndex) {
82
- const currentItems = [...(items || [])];
83
- if (fromIndex < 0 || fromIndex >= currentItems.length || toIndex < 0 || toIndex >= currentItems.length) {
84
- return currentItems;
85
- }
86
- const [movedItem] = currentItems.splice(fromIndex, 1);
87
- currentItems.splice(toIndex, 0, movedItem);
88
- return currentItems;
89
- }
90
- export function conditionalUpdateItems(items, predicate, updater) {
91
- const currentItems = items || [];
92
- return currentItems.map((item) => { if (predicate(item)) {
93
- return { ...item, ...updater(item) };
94
- } return item; });
95
- }
96
- export function applyListOperationToPaginated(data, operation, payload) {
97
- let items = data.items || [];
98
- if (operation === ListOperationType.ADD) {
99
- items = listUpdater.add(items, payload);
100
- }
101
- else if (operation === ListOperationType.UPDATE) {
102
- items = listUpdater.update(items, payload);
103
- }
104
- else if (operation === ListOperationType.REMOVE) {
105
- const id = payload?.id;
106
- items = listUpdater.remove(items, id);
107
- }
108
- const total = typeof data.total === "number"
109
- ? operation === ListOperationType.ADD
110
- ? data.total + 1
111
- : operation === ListOperationType.REMOVE
112
- ? Math.max(0, data.total - 1)
113
- : data.total
114
- : data.total;
115
- return { ...data, items, total };
116
- }
@@ -1,3 +0,0 @@
1
- export { keepPreviousData } from "@tanstack/react-query";
2
- export declare function stableListPlaceholder<T = any>(previousData: T | undefined): T | undefined;
3
- //# sourceMappingURL=placeholderData.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"placeholderData.d.ts","sourceRoot":"","sources":["../../src/utils/placeholderData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,wBAAgB,qBAAqB,CAAC,CAAC,GAAG,GAAG,EAAE,YAAY,EAAE,CAAC,GAAG,SAAS,GAAG,CAAC,GAAG,SAAS,CAuBzF"}
@@ -1,28 +0,0 @@
1
- export { keepPreviousData } from "@tanstack/react-query";
2
- export function stableListPlaceholder(previousData) {
3
- if (previousData === undefined || previousData === null)
4
- return previousData;
5
- if (Array.isArray(previousData)) {
6
- return [];
7
- }
8
- if (typeof previousData === "object") {
9
- const obj = { ...previousData };
10
- if (Array.isArray(obj.Rows)) {
11
- obj.Rows = [];
12
- if (typeof obj.Total === "number")
13
- obj.Total = obj.Total;
14
- return obj;
15
- }
16
- if (Array.isArray(obj.items)) {
17
- obj.items = [];
18
- if (typeof obj.total === "number")
19
- obj.total = obj.total;
20
- return obj;
21
- }
22
- if (Array.isArray(obj.data)) {
23
- obj.data = [];
24
- return obj;
25
- }
26
- }
27
- return previousData;
28
- }