@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
@@ -0,0 +1,565 @@
1
+ import { getNetworkInfo, getNetworkSpeed } from './chunk-X3ZTSLBQ.js';
2
+ import { DEFAULT_STALE_TIME } from './chunk-EXITP7QO.js';
3
+ export { keepPreviousData } from '@tanstack/react-query';
4
+
5
+ // src/utils/fieldMapper.ts
6
+ function createFieldEnricher(queryKey, mappings) {
7
+ return (data, queryClient) => {
8
+ const config = queryClient.getQueryData(queryKey);
9
+ if (!config) return data;
10
+ const result = { ...data };
11
+ Object.entries(mappings).forEach(([idField, { nameField, configKey }]) => {
12
+ const idValue = data[idField];
13
+ if (idValue == null) return;
14
+ const options = config[configKey];
15
+ if (!options?.length) return;
16
+ const optionMap = new Map(options.map((item) => [String(item.value), item.label]));
17
+ const label = optionMap.get(String(idValue));
18
+ if (label) {
19
+ result[nameField] = label;
20
+ }
21
+ });
22
+ return result;
23
+ };
24
+ }
25
+ function createTempId(prefix = "temp") {
26
+ return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
27
+ }
28
+ function createOptimisticBase(customFields) {
29
+ const now = (/* @__PURE__ */ new Date()).toISOString();
30
+ return { createTime: now, updateTime: now, createUser: "", updateUser: "", deleteStatus: 0, ...customFields };
31
+ }
32
+
33
+ // src/utils/optimisticUtils.ts
34
+ function idsAreEqual(a, b) {
35
+ if (a === b) return true;
36
+ if (a === void 0 || a === null || b === void 0 || b === null) return false;
37
+ return String(a) === String(b);
38
+ }
39
+ var listUpdater = {
40
+ add: (items, newItem) => {
41
+ const currentItems = items || [];
42
+ const existingIndex = currentItems.findIndex((item) => idsAreEqual(item.id, newItem.id));
43
+ if (existingIndex >= 0) {
44
+ const updatedItems = [...currentItems];
45
+ updatedItems[existingIndex] = newItem;
46
+ return updatedItems;
47
+ }
48
+ return [newItem, ...currentItems];
49
+ },
50
+ update: (items, updatedItem) => {
51
+ const currentItems = items || [];
52
+ return currentItems.map((item) => idsAreEqual(item.id, updatedItem.id) ? { ...item, ...updatedItem } : item);
53
+ },
54
+ remove: (items, itemId) => {
55
+ const currentItems = items || [];
56
+ return currentItems.filter((item) => !idsAreEqual(item.id, itemId));
57
+ }
58
+ };
59
+ function createAddItemConfig(queryKey, options) {
60
+ return { queryKey, updater: (oldData, newItem) => {
61
+ const currentItems = oldData || [];
62
+ if (options?.addToTop !== false) {
63
+ return [newItem, ...currentItems];
64
+ }
65
+ return [...currentItems, newItem];
66
+ }, rollback: options?.onRollback ? (_previousData, error) => {
67
+ options.onRollback(error);
68
+ } : void 0, enabled: true };
69
+ }
70
+ function createUpdateItemConfig(queryKey, options) {
71
+ return { queryKey, updater: (oldData, updatedItem) => {
72
+ return listUpdater.update(oldData, updatedItem);
73
+ }, rollback: options?.onRollback ? (_previousData, error) => {
74
+ options.onRollback(error);
75
+ } : void 0, enabled: true };
76
+ }
77
+ function createRemoveItemConfig(queryKey, options) {
78
+ return { queryKey, updater: (oldData, itemId) => {
79
+ return listUpdater.remove(oldData, itemId);
80
+ }, rollback: options?.onRollback ? (_previousData, error) => {
81
+ options.onRollback(error);
82
+ } : void 0, enabled: true };
83
+ }
84
+ function createListOperationConfig(config) {
85
+ return {
86
+ queryKey: config.queryKey,
87
+ updater: (oldData, variables) => {
88
+ switch (config.operation) {
89
+ case "add" /* ADD */:
90
+ return listUpdater.add(oldData, variables);
91
+ case "update" /* UPDATE */:
92
+ return listUpdater.update(oldData, variables);
93
+ case "remove" /* REMOVE */:
94
+ return listUpdater.remove(oldData, variables);
95
+ default:
96
+ return oldData || [];
97
+ }
98
+ },
99
+ rollback: config.onRollback ? (previousData, error) => {
100
+ const opType = config.operation === "add" /* ADD */ ? "create" : config.operation === "remove" /* REMOVE */ ? "delete" : "update";
101
+ config.onRollback(error, { previousData, timestamp: Date.now(), operationType: opType });
102
+ } : void 0,
103
+ enabled: true
104
+ };
105
+ }
106
+ function batchUpdateItems(items, updates) {
107
+ let currentItems = items || [];
108
+ updates.forEach((update) => {
109
+ currentItems = listUpdater.update(currentItems, update);
110
+ });
111
+ return currentItems;
112
+ }
113
+ function batchRemoveItems(items, itemIds) {
114
+ let currentItems = items || [];
115
+ itemIds.forEach((itemId) => {
116
+ currentItems = listUpdater.remove(currentItems, itemId);
117
+ });
118
+ return currentItems;
119
+ }
120
+ function reorderItems(items, fromIndex, toIndex) {
121
+ const currentItems = [...items || []];
122
+ if (fromIndex < 0 || fromIndex >= currentItems.length || toIndex < 0 || toIndex >= currentItems.length) {
123
+ return currentItems;
124
+ }
125
+ const [movedItem] = currentItems.splice(fromIndex, 1);
126
+ currentItems.splice(toIndex, 0, movedItem);
127
+ return currentItems;
128
+ }
129
+ function conditionalUpdateItems(items, predicate, updater) {
130
+ const currentItems = items || [];
131
+ return currentItems.map((item) => {
132
+ if (predicate(item)) {
133
+ return { ...item, ...updater(item) };
134
+ }
135
+ return item;
136
+ });
137
+ }
138
+ function stableListPlaceholder(previousData) {
139
+ if (previousData === void 0 || previousData === null) return previousData;
140
+ if (Array.isArray(previousData)) {
141
+ return [];
142
+ }
143
+ if (typeof previousData === "object") {
144
+ const obj = { ...previousData };
145
+ if (Array.isArray(obj.Rows)) {
146
+ obj.Rows = [];
147
+ if (typeof obj.Total === "number") obj.Total = obj.Total;
148
+ return obj;
149
+ }
150
+ if (Array.isArray(obj.items)) {
151
+ obj.items = [];
152
+ if (typeof obj.total === "number") obj.total = obj.total;
153
+ return obj;
154
+ }
155
+ if (Array.isArray(obj.data)) {
156
+ obj.data = [];
157
+ return obj;
158
+ }
159
+ }
160
+ return previousData;
161
+ }
162
+
163
+ // src/utils/prefetchManager.ts
164
+ var SmartPrefetchManager = class {
165
+ constructor(queryClient) {
166
+ this.prefetchQueue = /* @__PURE__ */ new Map();
167
+ this.prefetchHistory = /* @__PURE__ */ new Set();
168
+ this.networkSpeed = "fast";
169
+ this.isProcessing = false;
170
+ this.maxQueueSize = 10;
171
+ this.maxHistorySize = 100;
172
+ this.totalPrefetches = 0;
173
+ this.successfulPrefetches = 0;
174
+ this.failedPrefetches = 0;
175
+ this.skippedPrefetches = 0;
176
+ this.prefetchTimes = [];
177
+ this.maxPrefetchTimesSize = 50;
178
+ this.interactionHistory = [];
179
+ this.maxInteractionHistorySize = 100;
180
+ this.queryAccessCounts = /* @__PURE__ */ new Map();
181
+ this.querySequences = [];
182
+ this.maxSequenceSize = 50;
183
+ this.queryClient = queryClient;
184
+ this.initNetworkMonitoring();
185
+ }
186
+ initNetworkMonitoring() {
187
+ const networkInfo = getNetworkInfo();
188
+ if (!networkInfo) {
189
+ return;
190
+ }
191
+ this.updateNetworkSpeed();
192
+ if (typeof navigator !== "undefined" && "connection" in navigator) {
193
+ const navWithConnection = navigator;
194
+ const connection = navWithConnection.connection || navWithConnection.mozConnection || navWithConnection.webkitConnection;
195
+ const handleNetworkChange = () => {
196
+ this.updateNetworkSpeed();
197
+ };
198
+ connection?.addEventListener?.("change", handleNetworkChange);
199
+ this.networkCleanup = () => {
200
+ connection?.removeEventListener("change", handleNetworkChange);
201
+ };
202
+ }
203
+ }
204
+ updateNetworkSpeed() {
205
+ this.networkSpeed = getNetworkSpeed();
206
+ }
207
+ getNetworkSpeed() {
208
+ return this.networkSpeed;
209
+ }
210
+ isSlowNetwork() {
211
+ return this.networkSpeed === "slow" || this.networkSpeed === "unknown";
212
+ }
213
+ shouldPrefetch(queryKey, config = {}) {
214
+ const key = this.getQueryKeyString(queryKey);
215
+ if (this.prefetchQueue.has(key)) return false;
216
+ if (this.prefetchHistory.has(key)) return false;
217
+ const cachedData = this.queryClient.getQueryData(queryKey);
218
+ if (cachedData) return false;
219
+ if (this.isSlowNetwork() && !config.allowSlowNetwork) return false;
220
+ if (this.prefetchQueue.size >= this.maxQueueSize) return false;
221
+ return true;
222
+ }
223
+ addPrefetchTask(queryKey, queryFn, config = {}) {
224
+ if (!this.shouldPrefetch(queryKey, config)) {
225
+ this.skippedPrefetches++;
226
+ return false;
227
+ }
228
+ const key = this.getQueryKeyString(queryKey);
229
+ const task = { id: `${key}-${Date.now()}`, queryKey, queryFn, config: { priority: "medium", delay: 0, staleTime: DEFAULT_STALE_TIME, allowSlowNetwork: false, ...config }, timestamp: Date.now() };
230
+ this.prefetchQueue.set(key, task);
231
+ this.processQueue();
232
+ return true;
233
+ }
234
+ async processQueue() {
235
+ if (this.isProcessing || this.prefetchQueue.size === 0) {
236
+ return;
237
+ }
238
+ this.isProcessing = true;
239
+ try {
240
+ const sortedTasks = this.getSortedTasks();
241
+ for (const task of sortedTasks) {
242
+ const key = this.getQueryKeyString(task.queryKey);
243
+ const startTime = Date.now();
244
+ if (task.config.delay && task.config.delay > 0) {
245
+ await this.delay(task.config.delay);
246
+ }
247
+ try {
248
+ this.totalPrefetches++;
249
+ await this.queryClient.prefetchQuery({ queryKey: task.queryKey, queryFn: task.queryFn, staleTime: task.config.staleTime });
250
+ this.successfulPrefetches++;
251
+ const duration = Date.now() - startTime;
252
+ this.recordPrefetchTime(duration);
253
+ this.addToHistory(key);
254
+ } catch {
255
+ this.failedPrefetches++;
256
+ }
257
+ this.prefetchQueue.delete(key);
258
+ }
259
+ } finally {
260
+ this.isProcessing = false;
261
+ }
262
+ }
263
+ getSortedTasks() {
264
+ const tasks = Array.from(this.prefetchQueue.values());
265
+ const priorityOrder = { high: 0, medium: 1, low: 2 };
266
+ return tasks.sort((a, b) => {
267
+ const priorityA = priorityOrder[a.config.priority || "medium"];
268
+ const priorityB = priorityOrder[b.config.priority || "medium"];
269
+ if (priorityA !== priorityB) return priorityA - priorityB;
270
+ if (a.predictionScore !== void 0 && b.predictionScore !== void 0) {
271
+ if (a.predictionScore !== b.predictionScore) {
272
+ return b.predictionScore - a.predictionScore;
273
+ }
274
+ }
275
+ return a.timestamp - b.timestamp;
276
+ });
277
+ }
278
+ async prefetchNow(queryKey, queryFn, config = {}) {
279
+ const key = this.getQueryKeyString(queryKey);
280
+ const startTime = Date.now();
281
+ try {
282
+ this.totalPrefetches++;
283
+ await this.queryClient.prefetchQuery({ queryKey, queryFn, staleTime: config.staleTime || DEFAULT_STALE_TIME });
284
+ this.successfulPrefetches++;
285
+ const duration = Date.now() - startTime;
286
+ this.recordPrefetchTime(duration);
287
+ this.addToHistory(key);
288
+ } catch (error) {
289
+ this.failedPrefetches++;
290
+ throw error;
291
+ }
292
+ }
293
+ addToHistory(key) {
294
+ this.prefetchHistory.add(key);
295
+ if (this.prefetchHistory.size > this.maxHistorySize) {
296
+ const firstKey = this.prefetchHistory.values().next().value;
297
+ if (firstKey) {
298
+ this.prefetchHistory.delete(firstKey);
299
+ }
300
+ }
301
+ }
302
+ clearHistory() {
303
+ this.prefetchHistory.clear();
304
+ }
305
+ clearQueue() {
306
+ this.prefetchQueue.clear();
307
+ }
308
+ reset() {
309
+ this.clearQueue();
310
+ this.clearHistory();
311
+ this.clearInteractionHistory();
312
+ this.resetStats();
313
+ }
314
+ destroy() {
315
+ if (this.networkCleanup) {
316
+ this.networkCleanup();
317
+ this.networkCleanup = void 0;
318
+ }
319
+ this.reset();
320
+ }
321
+ recordInteraction(queryKey, type = "view") {
322
+ const interaction = { queryKey, timestamp: Date.now(), type };
323
+ this.interactionHistory.push(interaction);
324
+ if (this.interactionHistory.length > this.maxInteractionHistorySize) {
325
+ this.interactionHistory.shift();
326
+ }
327
+ const key = this.getQueryKeyString(queryKey);
328
+ this.queryAccessCounts.set(key, (this.queryAccessCounts.get(key) || 0) + 1);
329
+ if (this.interactionHistory.length >= 2) {
330
+ const prevInteraction = this.interactionHistory[this.interactionHistory.length - 2];
331
+ const prevKey = this.getQueryKeyString(prevInteraction.queryKey);
332
+ const existingSequence = this.querySequences.find((s) => s.from === prevKey && s.to === key);
333
+ if (existingSequence) {
334
+ existingSequence.count++;
335
+ } else {
336
+ this.querySequences.push({ from: prevKey, to: key, count: 1 });
337
+ if (this.querySequences.length > this.maxSequenceSize) {
338
+ this.querySequences.shift();
339
+ }
340
+ }
341
+ }
342
+ }
343
+ getPredictions(currentQueryKey, limit = 5) {
344
+ const predictions = [];
345
+ if (currentQueryKey) {
346
+ const currentKey = this.getQueryKeyString(currentQueryKey);
347
+ const sequences = this.querySequences.filter((s) => s.from === currentKey).sort((a, b) => b.count - a.count).slice(0, limit);
348
+ sequences.forEach((seq) => {
349
+ try {
350
+ const queryKey = JSON.parse(seq.to);
351
+ predictions.push({ queryKey, score: Math.min(seq.count / 10, 1), reason: `Frequently accessed after current query (${seq.count} times)` });
352
+ } catch {
353
+ }
354
+ });
355
+ }
356
+ const frequentQueries = Array.from(this.queryAccessCounts.entries()).sort((a, b) => b[1] - a[1]).slice(0, limit);
357
+ frequentQueries.forEach(([key, count]) => {
358
+ try {
359
+ const queryKey = JSON.parse(key);
360
+ if (!predictions.some((p) => this.getQueryKeyString(p.queryKey) === key)) {
361
+ predictions.push({ queryKey, score: Math.min(count / 20, 1), reason: `Frequently accessed (${count} times)` });
362
+ }
363
+ } catch {
364
+ }
365
+ });
366
+ const recentInteractions = this.interactionHistory.slice(-10).reverse();
367
+ recentInteractions.forEach((interaction, index) => {
368
+ const key = this.getQueryKeyString(interaction.queryKey);
369
+ if (!predictions.some((p) => this.getQueryKeyString(p.queryKey) === key)) {
370
+ predictions.push({ queryKey: interaction.queryKey, score: Math.max(0.3 - index * 0.03, 0.1), reason: `Recently accessed (${index + 1} queries ago)` });
371
+ }
372
+ });
373
+ return predictions.sort((a, b) => b.score - a.score).slice(0, limit);
374
+ }
375
+ async prefetchPredicted(currentQueryKey, queryFnMap, config = {}) {
376
+ const predictions = this.getPredictions(currentQueryKey);
377
+ for (const prediction of predictions) {
378
+ const key = this.getQueryKeyString(prediction.queryKey);
379
+ const queryFn = queryFnMap.get(key);
380
+ if (queryFn) {
381
+ const taskConfig = { ...config, priority: prediction.score > 0.7 ? "high" : prediction.score > 0.4 ? "medium" : "low" };
382
+ const added = this.addPrefetchTask(prediction.queryKey, queryFn, taskConfig);
383
+ if (added) {
384
+ const task = this.prefetchQueue.get(key);
385
+ if (task) {
386
+ task.predictionScore = prediction.score;
387
+ }
388
+ }
389
+ }
390
+ }
391
+ }
392
+ clearInteractionHistory() {
393
+ this.interactionHistory = [];
394
+ this.queryAccessCounts.clear();
395
+ this.querySequences = [];
396
+ }
397
+ recordPrefetchTime(duration) {
398
+ this.prefetchTimes.push(duration);
399
+ if (this.prefetchTimes.length > this.maxPrefetchTimesSize) {
400
+ this.prefetchTimes.shift();
401
+ }
402
+ }
403
+ getAveragePrefetchTime() {
404
+ if (this.prefetchTimes.length === 0) {
405
+ return 0;
406
+ }
407
+ const sum = this.prefetchTimes.reduce((acc, time) => acc + time, 0);
408
+ return Math.round(sum / this.prefetchTimes.length);
409
+ }
410
+ getStats() {
411
+ return { queueSize: this.prefetchQueue.size, historySize: this.prefetchHistory.size, networkSpeed: this.networkSpeed, isProcessing: this.isProcessing, totalPrefetches: this.totalPrefetches, successfulPrefetches: this.successfulPrefetches, failedPrefetches: this.failedPrefetches, averagePrefetchTime: this.getAveragePrefetchTime(), skippedPrefetches: this.skippedPrefetches };
412
+ }
413
+ getPerformanceReport() {
414
+ const stats = this.getStats();
415
+ const successRate = stats.totalPrefetches > 0 ? Math.round(stats.successfulPrefetches / stats.totalPrefetches * 100) : 0;
416
+ const queueTasks = Array.from(this.prefetchQueue.values());
417
+ const byPriority = { high: queueTasks.filter((t) => t.config.priority === "high").length, medium: queueTasks.filter((t) => t.config.priority === "medium").length, low: queueTasks.filter((t) => t.config.priority === "low").length };
418
+ return { stats, successRate, predictions: { totalInteractions: this.interactionHistory.length, uniqueQueries: this.queryAccessCounts.size, sequencePatterns: this.querySequences.length }, queue: { size: this.prefetchQueue.size, byPriority } };
419
+ }
420
+ resetStats() {
421
+ this.totalPrefetches = 0;
422
+ this.successfulPrefetches = 0;
423
+ this.failedPrefetches = 0;
424
+ this.skippedPrefetches = 0;
425
+ this.prefetchTimes = [];
426
+ }
427
+ getQueryKeyString(queryKey) {
428
+ return JSON.stringify(queryKey);
429
+ }
430
+ delay(ms) {
431
+ return new Promise((resolve) => setTimeout(resolve, ms));
432
+ }
433
+ setMaxQueueSize(size) {
434
+ this.maxQueueSize = size;
435
+ }
436
+ setMaxHistorySize(size) {
437
+ this.maxHistorySize = size;
438
+ }
439
+ getQueuedTasks() {
440
+ return Array.from(this.prefetchQueue.values());
441
+ }
442
+ removeTask(queryKey) {
443
+ const key = this.getQueryKeyString(queryKey);
444
+ return this.prefetchQueue.delete(key);
445
+ }
446
+ hasTask(queryKey) {
447
+ const key = this.getQueryKeyString(queryKey);
448
+ return this.prefetchQueue.has(key);
449
+ }
450
+ updateTaskPriority(queryKey, priority) {
451
+ const key = this.getQueryKeyString(queryKey);
452
+ const task = this.prefetchQueue.get(key);
453
+ if (task) {
454
+ task.config.priority = priority;
455
+ return true;
456
+ }
457
+ return false;
458
+ }
459
+ pauseQueue() {
460
+ this.isProcessing = true;
461
+ }
462
+ resumeQueue() {
463
+ this.isProcessing = false;
464
+ this.processQueue();
465
+ }
466
+ };
467
+ var prefetchManagerInstance = null;
468
+ function getPrefetchManager(queryClient) {
469
+ if (!prefetchManagerInstance) {
470
+ prefetchManagerInstance = new SmartPrefetchManager(queryClient);
471
+ }
472
+ return prefetchManagerInstance;
473
+ }
474
+ function resetPrefetchManager() {
475
+ prefetchManagerInstance = null;
476
+ }
477
+
478
+ // src/utils/selectors.ts
479
+ function selectById(id) {
480
+ return (data) => {
481
+ return data?.find((item) => item.id === id);
482
+ };
483
+ }
484
+ function selectByIds(ids) {
485
+ return (data) => {
486
+ if (!data) return [];
487
+ return data.filter((item) => ids.includes(item.id));
488
+ };
489
+ }
490
+ function selectFirst(data) {
491
+ return data?.[0];
492
+ }
493
+ function selectLast(data) {
494
+ if (!data || data.length === 0) return void 0;
495
+ return data[data.length - 1];
496
+ }
497
+ function selectCount(data) {
498
+ return data?.length ?? 0;
499
+ }
500
+ function selectTotal(data) {
501
+ return data?.total ?? 0;
502
+ }
503
+ function selectItems(data) {
504
+ return data?.items ?? [];
505
+ }
506
+ function selectWhere(predicate) {
507
+ return (data) => {
508
+ if (!data) return [];
509
+ return data.filter(predicate);
510
+ };
511
+ }
512
+ function selectMap(mapper) {
513
+ return (data) => {
514
+ if (!data) return [];
515
+ return data.map(mapper);
516
+ };
517
+ }
518
+ function selectField(field) {
519
+ return (data) => {
520
+ return data?.[field];
521
+ };
522
+ }
523
+ function selectFields(fields) {
524
+ return (data) => {
525
+ if (!data) return void 0;
526
+ const result = {};
527
+ fields.forEach((field) => {
528
+ result[field] = data[field];
529
+ });
530
+ return result;
531
+ };
532
+ }
533
+ function compose(selector1, selector2) {
534
+ return (data) => {
535
+ return selector2(selector1(data));
536
+ };
537
+ }
538
+ var selectors = { byId: selectById, byIds: selectByIds, first: selectFirst, last: selectLast, count: selectCount, total: selectTotal, items: selectItems, where: selectWhere, map: selectMap, field: selectField, fields: selectFields, compose };
539
+
540
+ // src/utils/queryClientUtils.ts
541
+ function invalidateQueriesBatch(queryClient, tasks) {
542
+ tasks.forEach((task) => {
543
+ if (Array.isArray(task) || typeof task === "string") {
544
+ queryClient.invalidateQueries({ queryKey: task });
545
+ } else {
546
+ queryClient.invalidateQueries(task);
547
+ }
548
+ });
549
+ }
550
+ function cancelQueriesBatch(queryClient, tasks) {
551
+ tasks.forEach((task) => {
552
+ if (Array.isArray(task) || typeof task === "string") {
553
+ queryClient.cancelQueries({ queryKey: task });
554
+ } else {
555
+ queryClient.cancelQueries(task);
556
+ }
557
+ });
558
+ }
559
+ function setQueryDataBatch(queryClient, tasks) {
560
+ tasks.forEach((task) => queryClient.setQueryData(task.queryKey, task.data));
561
+ }
562
+
563
+ export { SmartPrefetchManager, batchRemoveItems, batchUpdateItems, cancelQueriesBatch, compose, conditionalUpdateItems, createAddItemConfig, createFieldEnricher, createListOperationConfig, createOptimisticBase, createRemoveItemConfig, createTempId, createUpdateItemConfig, getPrefetchManager, invalidateQueriesBatch, listUpdater, reorderItems, resetPrefetchManager, selectById, selectByIds, selectCount, selectField, selectFields, selectFirst, selectItems, selectLast, selectMap, selectTotal, selectWhere, selectors, setQueryDataBatch, stableListPlaceholder };
564
+ //# sourceMappingURL=chunk-GMO3PRZZ.js.map
565
+ //# sourceMappingURL=chunk-GMO3PRZZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/fieldMapper.ts","../src/utils/optimisticUtils.ts","../src/utils/placeholderData.ts","../src/utils/prefetchManager.ts","../src/utils/selectors.ts","../src/utils/queryClientUtils.ts"],"names":[],"mappings":"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","file":"chunk-GMO3PRZZ.js","sourcesContent":["import type { QueryClient } from \"@tanstack/react-query\";\nexport interface FieldMappingConfig { nameField: string; configKey: string }\nexport function createFieldEnricher<T = any>(queryKey: any, mappings: Record<string, FieldMappingConfig>) {\n return (data: T, queryClient: QueryClient): T => {\n const config = queryClient.getQueryData<any>(queryKey);\n if (!config) return data as T;\n const result: any = { ...(data as any) };\n Object.entries(mappings).forEach(([idField, { nameField, configKey }]) => {\n const idValue = (data as any)[idField];\n if (idValue == null) return;\n const options = config[configKey];\n if (!options?.length) return;\n const optionMap = new Map(options.map((item: any) => [String(item.value), item.label]));\n const label = optionMap.get(String(idValue));\n if (label) { result[nameField] = label; }\n });\n return result as T;\n };\n}\nexport function createTempId(prefix = \"temp\"): string { return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`; }\nexport function createOptimisticBase(customFields?: Record<string, any>): Record<string, any> {\n const now = new Date().toISOString();\n return { createTime: now, updateTime: now, createUser: \"\", updateUser: \"\", deleteStatus: 0, ...customFields };\n}","import type { QueryKey } from \"@tanstack/react-query\";\nimport type { ListOperationConfig, OptimisticUpdateConfig, OptimisticOperationTypeValue } from \"../types/optimistic\";\nimport type { EntityWithId } from \"../types/selectors\";\nimport { ListOperationType } from \"../types/optimistic.js\";\n/**\n * Loose equality check for IDs (string vs number)\n */\nexport function idsAreEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === undefined || a === null || b === undefined || b === null) return false;\n return String(a) === String(b);\n}\n\nexport const listUpdater = {\n add: <T extends EntityWithId>(items: T[] | undefined, newItem: T): T[] => {\n const currentItems = items || [];\n const existingIndex = currentItems.findIndex((item) => idsAreEqual(item.id, newItem.id));\n if (existingIndex >= 0) {\n const updatedItems = [...currentItems];\n updatedItems[existingIndex] = newItem;\n return updatedItems;\n }\n return [newItem, ...currentItems];\n },\n update: <T extends EntityWithId>(items: T[] | undefined, updatedItem: Partial<T> & { id: T[\"id\"] }): T[] => {\n const currentItems = items || [];\n return currentItems.map((item) => (idsAreEqual(item.id, updatedItem.id) ? { ...item, ...updatedItem } : item));\n },\n remove: <T extends EntityWithId>(items: T[] | undefined, itemId: T[\"id\"]): T[] => {\n const currentItems = items || [];\n return currentItems.filter((item) => !idsAreEqual(item.id, itemId));\n }\n};\nexport function createAddItemConfig<T extends EntityWithId>(queryKey: QueryKey, options?: { addToTop?: boolean; onRollback?: (error: Error) => void }): OptimisticUpdateConfig<T[], T> {\n return { queryKey, updater: (oldData: T[] | undefined, newItem: T) => { const currentItems = oldData || []; if (options?.addToTop !== false) { return [newItem, ...currentItems]; } return [...currentItems, newItem]; }, rollback: options?.onRollback ? (_previousData: T[], error: Error) => { options.onRollback!(error); } : undefined, enabled: true };\n}\nexport function createUpdateItemConfig<T extends EntityWithId>(queryKey: QueryKey, options?: { onRollback?: (error: Error) => void }): OptimisticUpdateConfig<T[], Partial<T> & { id: T[\"id\"] }> {\n return { queryKey, updater: (oldData: T[] | undefined, updatedItem: Partial<T> & { id: T[\"id\"] }) => { return listUpdater.update(oldData, updatedItem); }, rollback: options?.onRollback ? (_previousData: T[], error: Error) => { options.onRollback!(error); } : undefined, enabled: true };\n}\nexport function createRemoveItemConfig<T extends EntityWithId>(queryKey: QueryKey, options?: { onRollback?: (error: Error) => void }): OptimisticUpdateConfig<T[], T[\"id\"]> {\n return { queryKey, updater: (oldData: T[] | undefined, itemId: T[\"id\"]) => { return listUpdater.remove(oldData, itemId); }, rollback: options?.onRollback ? (_previousData: T[], error: Error) => { options.onRollback!(error); } : undefined, enabled: true };\n}\nexport type ListOperationVariables<T extends EntityWithId, TOperation extends ListOperationType> = TOperation extends ListOperationType.ADD ? T : TOperation extends ListOperationType.UPDATE ? Partial<T> & { id: T[\"id\"] } : TOperation extends ListOperationType.REMOVE ? T[\"id\"] : never;\nexport function createListOperationConfig<T extends EntityWithId, TOperation extends ListOperationType = ListOperationType>(config: ListOperationConfig<T>): OptimisticUpdateConfig<T[], ListOperationVariables<T, TOperation>> {\n return {\n queryKey: config.queryKey,\n updater: (oldData: T[] | undefined, variables: ListOperationVariables<T, TOperation>) => {\n switch (config.operation) {\n case ListOperationType.ADD:\n return listUpdater.add(oldData, variables as T);\n case ListOperationType.UPDATE:\n return listUpdater.update(oldData, variables as Partial<T> & { id: T[\"id\"] });\n case ListOperationType.REMOVE:\n return listUpdater.remove(oldData, variables as T[\"id\"]);\n default:\n return oldData || [];\n }\n },\n rollback: config.onRollback\n ? (previousData: T[], error: Error) => {\n const opType: OptimisticOperationTypeValue = config.operation === ListOperationType.ADD\n ? \"create\"\n : config.operation === ListOperationType.REMOVE\n ? \"delete\"\n : \"update\";\n config.onRollback!(error, { previousData, timestamp: Date.now(), operationType: opType });\n }\n : undefined,\n enabled: true\n };\n}\nexport function batchUpdateItems<T extends EntityWithId>(items: T[] | undefined | null, updates: Array<Partial<T> & { id: T[\"id\"] }>): T[] {\n let currentItems = items || [];\n updates.forEach((update) => { currentItems = listUpdater.update(currentItems, update); });\n return currentItems;\n}\nexport function batchRemoveItems<T extends EntityWithId>(items: T[] | undefined | null, itemIds: Array<T[\"id\"]>): T[] {\n let currentItems = items || [];\n itemIds.forEach((itemId) => { currentItems = listUpdater.remove(currentItems, itemId); });\n return currentItems;\n}\nexport function reorderItems<T extends EntityWithId>(items: T[] | undefined | null, fromIndex: number, toIndex: number): T[] {\n const currentItems = [...(items || [])];\n if (fromIndex < 0 || fromIndex >= currentItems.length || toIndex < 0 || toIndex >= currentItems.length) { return currentItems; }\n const [movedItem] = currentItems.splice(fromIndex, 1);\n currentItems.splice(toIndex, 0, movedItem);\n return currentItems;\n}\nexport function conditionalUpdateItems<T extends EntityWithId>(items: T[] | undefined | null, predicate: (item: T) => boolean, updater: (item: T) => Partial<T>): T[] {\n const currentItems = items || [];\n return currentItems.map((item) => { if (predicate(item)) { return { ...item, ...updater(item) }; } return item; });\n}\nexport function applyListOperationToPaginated<T extends EntityWithId>(data: { items: T[]; total?: number }, operation: ListOperationType, payload: Partial<T>): { items: T[]; total?: number } {\n let items = data.items || [];\n if (operation === ListOperationType.ADD) { items = listUpdater.add(items, payload as T); }\n else if (operation === ListOperationType.UPDATE) { items = listUpdater.update(items, payload as Partial<T> & { id: T[\"id\"] }); }\n else if (operation === ListOperationType.REMOVE) { const id = (payload as any)?.id; items = listUpdater.remove(items, id); }\n const total = typeof data.total === \"number\"\n ? operation === ListOperationType.ADD\n ? data.total + 1\n : operation === ListOperationType.REMOVE\n ? Math.max(0, data.total - 1)\n : data.total\n : data.total;\n return { ...data, items, total };\n}\n","export { keepPreviousData } from \"@tanstack/react-query\";\n\nexport function stableListPlaceholder<T = any>(previousData: T | undefined): T | undefined {\n if (previousData === undefined || previousData === null) return previousData as any;\n if (Array.isArray(previousData)) {\n return [] as any;\n }\n if (typeof previousData === \"object\") {\n const obj = { ...(previousData as any) };\n if (Array.isArray(obj.Rows)) {\n obj.Rows = [];\n if (typeof obj.Total === \"number\") obj.Total = obj.Total;\n return obj as T;\n }\n if (Array.isArray(obj.items)) {\n obj.items = [];\n if (typeof obj.total === \"number\") obj.total = obj.total;\n return obj as T;\n }\n if (Array.isArray(obj.data)) {\n obj.data = [];\n return obj as T;\n }\n }\n return previousData as any;\n}\n","import type { QueryClient, QueryFunction, QueryKey } from \"@tanstack/react-query\";\nimport { DEFAULT_STALE_TIME } from \"../core/config.js\";\nimport { getNetworkInfo, getNetworkSpeed } from \"./network.js\";\n\ninterface NetworkInformation extends EventTarget { effectiveType?: string; downlink?: number; rtt?: number; saveData?: boolean }\ninterface NavigatorWithConnection extends Navigator { connection?: NetworkInformation; mozConnection?: NetworkInformation; webkitConnection?: NetworkInformation }\nexport interface PrefetchConfig { priority?: \"high\" | \"medium\" | \"low\"; delay?: number; staleTime?: number; allowSlowNetwork?: boolean }\nexport interface PrefetchTask { queryKey: QueryKey; queryFn: QueryFunction<any>; config: PrefetchConfig; timestamp: number; id: string; predictionScore?: number }\nexport type NetworkSpeed = \"slow\" | \"medium\" | \"fast\" | \"unknown\";\nexport interface PrefetchStats { queueSize: number; historySize: number; networkSpeed: NetworkSpeed; isProcessing: boolean; totalPrefetches: number; successfulPrefetches: number; failedPrefetches: number; averagePrefetchTime: number; skippedPrefetches: number }\nexport interface InteractionRecord { queryKey: QueryKey; timestamp: number; type: \"view\" | \"hover\" | \"click\" | \"focus\" }\nexport interface PredictionResult { queryKey: QueryKey; score: number; reason: string }\n\nexport class SmartPrefetchManager {\n private queryClient: QueryClient;\n private prefetchQueue: Map<string, PrefetchTask> = new Map();\n private prefetchHistory: Set<string> = new Set();\n private networkSpeed: NetworkSpeed = \"fast\";\n private isProcessing = false;\n private maxQueueSize = 10;\n private maxHistorySize = 100;\n private totalPrefetches = 0;\n private successfulPrefetches = 0;\n private failedPrefetches = 0;\n private skippedPrefetches = 0;\n private prefetchTimes: number[] = [];\n private maxPrefetchTimesSize = 50;\n private interactionHistory: InteractionRecord[] = [];\n private maxInteractionHistorySize = 100;\n private queryAccessCounts: Map<string, number> = new Map();\n private querySequences: Array<{ from: string; to: string; count: number }> = [];\n private maxSequenceSize = 50;\n private networkCleanup?: () => void;\n constructor(queryClient: QueryClient) { this.queryClient = queryClient; this.initNetworkMonitoring(); }\n private initNetworkMonitoring() {\n const networkInfo = getNetworkInfo();\n if (!networkInfo) { return; }\n this.updateNetworkSpeed();\n if (typeof navigator !== \"undefined\" && \"connection\" in navigator) {\n const navWithConnection = navigator as NavigatorWithConnection;\n const connection = navWithConnection.connection || navWithConnection.mozConnection || navWithConnection.webkitConnection;\n const handleNetworkChange = () => { this.updateNetworkSpeed(); };\n connection?.addEventListener?.(\"change\", handleNetworkChange);\n this.networkCleanup = () => { connection?.removeEventListener(\"change\", handleNetworkChange); };\n }\n }\n private updateNetworkSpeed() { this.networkSpeed = getNetworkSpeed(); }\n public getNetworkSpeed(): NetworkSpeed { return this.networkSpeed; }\n public isSlowNetwork(): boolean { return this.networkSpeed === \"slow\" || this.networkSpeed === \"unknown\"; }\n public shouldPrefetch(queryKey: QueryKey, config: PrefetchConfig = {}): boolean {\n const key = this.getQueryKeyString(queryKey);\n if (this.prefetchQueue.has(key)) return false;\n if (this.prefetchHistory.has(key)) return false;\n const cachedData = this.queryClient.getQueryData(queryKey);\n if (cachedData) return false;\n if (this.isSlowNetwork() && !config.allowSlowNetwork) return false;\n if (this.prefetchQueue.size >= this.maxQueueSize) return false;\n return true;\n }\n public addPrefetchTask(queryKey: QueryKey, queryFn: QueryFunction<any>, config: PrefetchConfig = {}): boolean {\n if (!this.shouldPrefetch(queryKey, config)) { this.skippedPrefetches++; return false; }\n const key = this.getQueryKeyString(queryKey);\n const task: PrefetchTask = { id: `${key}-${Date.now()}`, queryKey, queryFn, config: { priority: \"medium\", delay: 0, staleTime: DEFAULT_STALE_TIME, allowSlowNetwork: false, ...config }, timestamp: Date.now() };\n this.prefetchQueue.set(key, task);\n this.processQueue();\n return true;\n }\n private async processQueue() {\n if (this.isProcessing || this.prefetchQueue.size === 0) { return; }\n this.isProcessing = true;\n try {\n const sortedTasks = this.getSortedTasks();\n for (const task of sortedTasks) {\n const key = this.getQueryKeyString(task.queryKey);\n const startTime = Date.now();\n if (task.config.delay && task.config.delay > 0) { await this.delay(task.config.delay); }\n try {\n this.totalPrefetches++;\n await this.queryClient.prefetchQuery({ queryKey: task.queryKey, queryFn: task.queryFn, staleTime: task.config.staleTime });\n this.successfulPrefetches++;\n const duration = Date.now() - startTime;\n this.recordPrefetchTime(duration);\n this.addToHistory(key);\n } catch {\n this.failedPrefetches++;\n }\n this.prefetchQueue.delete(key);\n }\n } finally { this.isProcessing = false; }\n }\n private getSortedTasks(): PrefetchTask[] {\n const tasks = Array.from(this.prefetchQueue.values());\n const priorityOrder = { high: 0, medium: 1, low: 2 } as const;\n return tasks.sort((a, b) => {\n const priorityA = priorityOrder[a.config.priority || \"medium\"]; const priorityB = priorityOrder[b.config.priority || \"medium\"]; if (priorityA !== priorityB) return priorityA - priorityB;\n if (a.predictionScore !== undefined && b.predictionScore !== undefined) { if (a.predictionScore !== b.predictionScore) { return b.predictionScore - a.predictionScore; } }\n return a.timestamp - b.timestamp;\n });\n }\n public async prefetchNow<TData = unknown>(queryKey: QueryKey, queryFn: QueryFunction<TData>, config: PrefetchConfig = {}): Promise<void> {\n const key = this.getQueryKeyString(queryKey);\n const startTime = Date.now();\n try {\n this.totalPrefetches++;\n await this.queryClient.prefetchQuery({ queryKey, queryFn, staleTime: config.staleTime || DEFAULT_STALE_TIME });\n this.successfulPrefetches++;\n const duration = Date.now() - startTime;\n this.recordPrefetchTime(duration);\n this.addToHistory(key);\n } catch (error) { this.failedPrefetches++; throw error; }\n }\n private addToHistory(key: string) { this.prefetchHistory.add(key); if (this.prefetchHistory.size > this.maxHistorySize) { const firstKey = this.prefetchHistory.values().next().value as string | undefined; if (firstKey) { this.prefetchHistory.delete(firstKey); } } }\n public clearHistory() { this.prefetchHistory.clear(); }\n public clearQueue() { this.prefetchQueue.clear(); }\n public reset(): void { this.clearQueue(); this.clearHistory(); this.clearInteractionHistory(); this.resetStats(); }\n public destroy(): void { if (this.networkCleanup) { this.networkCleanup(); this.networkCleanup = undefined; } this.reset(); }\n public recordInteraction(queryKey: QueryKey, type: \"view\" | \"hover\" | \"click\" | \"focus\" = \"view\"): void {\n const interaction: InteractionRecord = { queryKey, timestamp: Date.now(), type };\n this.interactionHistory.push(interaction);\n if (this.interactionHistory.length > this.maxInteractionHistorySize) { this.interactionHistory.shift(); }\n const key = this.getQueryKeyString(queryKey);\n this.queryAccessCounts.set(key, (this.queryAccessCounts.get(key) || 0) + 1);\n if (this.interactionHistory.length >= 2) {\n const prevInteraction = this.interactionHistory[this.interactionHistory.length - 2];\n const prevKey = this.getQueryKeyString(prevInteraction.queryKey);\n const existingSequence = this.querySequences.find((s) => s.from === prevKey && s.to === key);\n if (existingSequence) { existingSequence.count++; } else { this.querySequences.push({ from: prevKey, to: key, count: 1 }); if (this.querySequences.length > this.maxSequenceSize) { this.querySequences.shift(); } }\n }\n }\n public getPredictions(currentQueryKey?: QueryKey, limit = 5): PredictionResult[] {\n const predictions: PredictionResult[] = [];\n if (currentQueryKey) {\n const currentKey = this.getQueryKeyString(currentQueryKey);\n const sequences = this.querySequences.filter((s) => s.from === currentKey).sort((a, b) => b.count - a.count).slice(0, limit);\n sequences.forEach((seq) => { try { const queryKey = JSON.parse(seq.to); predictions.push({ queryKey, score: Math.min(seq.count / 10, 1), reason: `Frequently accessed after current query (${seq.count} times)` }); } catch {} });\n }\n const frequentQueries = Array.from(this.queryAccessCounts.entries()).sort((a, b) => b[1] - a[1]).slice(0, limit);\n frequentQueries.forEach(([key, count]) => { try { const queryKey = JSON.parse(key); if (!predictions.some((p) => this.getQueryKeyString(p.queryKey) === key)) { predictions.push({ queryKey, score: Math.min(count / 20, 1), reason: `Frequently accessed (${count} times)` }); } } catch {} });\n const recentInteractions = this.interactionHistory.slice(-10).reverse();\n recentInteractions.forEach((interaction, index) => {\n const key = this.getQueryKeyString(interaction.queryKey);\n if (!predictions.some((p) => this.getQueryKeyString(p.queryKey) === key)) {\n predictions.push({ queryKey: interaction.queryKey, score: Math.max(0.3 - index * 0.03, 0.1), reason: `Recently accessed (${index + 1} queries ago)` });\n }\n });\n return predictions.sort((a, b) => b.score - a.score).slice(0, limit);\n }\n public async prefetchPredicted(currentQueryKey: QueryKey | undefined, queryFnMap: Map<string, QueryFunction<any>>, config: PrefetchConfig = {}): Promise<void> {\n const predictions = this.getPredictions(currentQueryKey);\n for (const prediction of predictions) {\n const key = this.getQueryKeyString(prediction.queryKey);\n const queryFn = queryFnMap.get(key);\n if (queryFn) {\n const taskConfig = { ...config, priority: prediction.score > 0.7 ? \"high\" : prediction.score > 0.4 ? \"medium\" : \"low\" } as PrefetchConfig;\n const added = this.addPrefetchTask(prediction.queryKey, queryFn, taskConfig);\n if (added) { const task = this.prefetchQueue.get(key); if (task) { task.predictionScore = prediction.score; } }\n }\n }\n }\n public clearInteractionHistory(): void { this.interactionHistory = []; this.queryAccessCounts.clear(); this.querySequences = []; }\n private recordPrefetchTime(duration: number): void { this.prefetchTimes.push(duration); if (this.prefetchTimes.length > this.maxPrefetchTimesSize) { this.prefetchTimes.shift(); } }\n private getAveragePrefetchTime(): number { if (this.prefetchTimes.length === 0) { return 0; } const sum = this.prefetchTimes.reduce((acc, time) => acc + time, 0); return Math.round(sum / this.prefetchTimes.length); }\n public getStats(): PrefetchStats { return { queueSize: this.prefetchQueue.size, historySize: this.prefetchHistory.size, networkSpeed: this.networkSpeed, isProcessing: this.isProcessing, totalPrefetches: this.totalPrefetches, successfulPrefetches: this.successfulPrefetches, failedPrefetches: this.failedPrefetches, averagePrefetchTime: this.getAveragePrefetchTime(), skippedPrefetches: this.skippedPrefetches }; }\n public getPerformanceReport(): { stats: PrefetchStats; successRate: number; predictions: { totalInteractions: number; uniqueQueries: number; sequencePatterns: number }; queue: { size: number; byPriority: { high: number; medium: number; low: number } } } {\n const stats = this.getStats();\n const successRate = stats.totalPrefetches > 0 ? Math.round((stats.successfulPrefetches / stats.totalPrefetches) * 100) : 0;\n const queueTasks = Array.from(this.prefetchQueue.values());\n const byPriority = { high: queueTasks.filter((t) => t.config.priority === \"high\").length, medium: queueTasks.filter((t) => t.config.priority === \"medium\").length, low: queueTasks.filter((t) => t.config.priority === \"low\").length };\n return { stats, successRate, predictions: { totalInteractions: this.interactionHistory.length, uniqueQueries: this.queryAccessCounts.size, sequencePatterns: this.querySequences.length }, queue: { size: this.prefetchQueue.size, byPriority } };\n }\n public resetStats(): void { this.totalPrefetches = 0; this.successfulPrefetches = 0; this.failedPrefetches = 0; this.skippedPrefetches = 0; this.prefetchTimes = []; }\n private getQueryKeyString(queryKey: QueryKey): string { return JSON.stringify(queryKey); }\n private delay(ms: number): Promise<void> { return new Promise((resolve) => setTimeout(resolve, ms)); }\n public setMaxQueueSize(size: number): void { this.maxQueueSize = size; }\n public setMaxHistorySize(size: number): void { this.maxHistorySize = size; }\n public getQueuedTasks(): PrefetchTask[] { return Array.from(this.prefetchQueue.values()); }\n public removeTask(queryKey: QueryKey): boolean { const key = this.getQueryKeyString(queryKey); return this.prefetchQueue.delete(key); }\n public hasTask(queryKey: QueryKey): boolean { const key = this.getQueryKeyString(queryKey); return this.prefetchQueue.has(key); }\n public updateTaskPriority(queryKey: QueryKey, priority: \"high\" | \"medium\" | \"low\"): boolean { const key = this.getQueryKeyString(queryKey); const task = this.prefetchQueue.get(key); if (task) { task.config.priority = priority; return true; } return false; }\n public pauseQueue(): void { this.isProcessing = true; }\n public resumeQueue(): void { this.isProcessing = false; this.processQueue(); }\n}\nlet prefetchManagerInstance: SmartPrefetchManager | null = null;\nexport function getPrefetchManager(queryClient: QueryClient): SmartPrefetchManager { if (!prefetchManagerInstance) { prefetchManagerInstance = new SmartPrefetchManager(queryClient); } return prefetchManagerInstance; }\nexport function resetPrefetchManager() { prefetchManagerInstance = null; }","import type { EntityWithId, PaginatedData } from \"../types/selectors\";\nexport function selectById<T extends EntityWithId>(id: T[\"id\"]) { return (data: T[] | undefined): T | undefined => { return data?.find((item) => item.id === id); }; }\nexport function selectByIds<T extends EntityWithId>(ids: T[\"id\"][]) { return (data: T[] | undefined): T[] => { if (!data) return []; return data.filter((item) => ids.includes(item.id)); }; }\nexport function selectFirst<T>(data: T[] | undefined): T | undefined { return data?.[0]; }\nexport function selectLast<T>(data: T[] | undefined): T | undefined { if (!data || data.length === 0) return undefined; return data[data.length - 1]; }\nexport function selectCount<T>(data: T[] | undefined): number { return data?.length ?? 0; }\nexport function selectTotal<T extends { total?: number }>(data: T | undefined): number { return data?.total ?? 0; }\nexport function selectItems<TItem, T extends PaginatedData<TItem>>(data: T | undefined): TItem[] { return data?.items ?? []; }\nexport function selectWhere<T>(predicate: (item: T) => boolean) { return (data: T[] | undefined): T[] => { if (!data) return []; return data.filter(predicate); }; }\nexport function selectMap<T, R>(mapper: (item: T) => R) { return (data: T[] | undefined): R[] => { if (!data) return []; return data.map(mapper); }; }\nexport function selectField<T, K extends keyof T>(field: K) { return (data: T | undefined): T[K] | undefined => { return data?.[field]; }; }\nexport function selectFields<T, K extends keyof T>(fields: K[]) { return (data: T | undefined): Pick<T, K> | undefined => { if (!data) return undefined; const result = {} as Pick<T, K>; fields.forEach((field) => { result[field] = data[field]; }); return result; }; }\nexport function compose<T, R1, R2>(selector1: (data: T) => R1, selector2: (data: R1) => R2) { return (data: T): R2 => { return selector2(selector1(data)); }; }\nexport const selectors = { byId: selectById, byIds: selectByIds, first: selectFirst, last: selectLast, count: selectCount, total: selectTotal, items: selectItems, where: selectWhere, map: selectMap, field: selectField, fields: selectFields, compose };","import type { QueryClient, QueryKey } from \"@tanstack/react-query\";\n\nexport interface BatchTask {\n queryKey: QueryKey;\n data?: any;\n exact?: boolean;\n}\n\nexport function invalidateQueriesBatch(queryClient: QueryClient, tasks: BatchTask[] | QueryKey[]) {\n tasks.forEach(task => {\n if (Array.isArray(task) || typeof task === 'string') {\n queryClient.invalidateQueries({ queryKey: task as QueryKey });\n } else {\n queryClient.invalidateQueries(task as any);\n }\n });\n}\n\nexport function cancelQueriesBatch(queryClient: QueryClient, tasks: BatchTask[] | QueryKey[]) {\n tasks.forEach(task => {\n if (Array.isArray(task) || typeof task === 'string') {\n queryClient.cancelQueries({ queryKey: task as QueryKey });\n } else {\n queryClient.cancelQueries(task as any);\n }\n });\n}\n\nexport function setQueryDataBatch(queryClient: QueryClient, tasks: { queryKey: QueryKey; data: any }[]) {\n tasks.forEach(task => queryClient.setQueryData(task.queryKey, task.data));\n}\n"]}