@qiaopeng/tanstack-query-plus 0.5.9 → 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.
- package/README.md +86 -55
- package/dist/{types/base.d.ts → base-CHnwqfyz.d.cts} +12 -14
- package/dist/base-CHnwqfyz.d.ts +52 -0
- package/dist/chunk-52ZO6Y67.cjs +1121 -0
- package/dist/chunk-52ZO6Y67.cjs.map +1 -0
- package/dist/chunk-5J6OXSLW.cjs +36 -0
- package/dist/chunk-5J6OXSLW.cjs.map +1 -0
- package/dist/chunk-6MAYHLTE.cjs +310 -0
- package/dist/chunk-6MAYHLTE.cjs.map +1 -0
- package/dist/chunk-ADS2QTMP.js +144 -0
- package/dist/chunk-ADS2QTMP.js.map +1 -0
- package/dist/chunk-APXNNHBD.cjs +374 -0
- package/dist/chunk-APXNNHBD.cjs.map +1 -0
- package/dist/chunk-AXMWOGNX.js +134 -0
- package/dist/chunk-AXMWOGNX.js.map +1 -0
- package/dist/chunk-B4KO3K3E.cjs +521 -0
- package/dist/chunk-B4KO3K3E.cjs.map +1 -0
- package/dist/chunk-BK3OTIBD.cjs +15 -0
- package/dist/chunk-BK3OTIBD.cjs.map +1 -0
- package/dist/chunk-BYAOQALW.js +13 -0
- package/dist/chunk-BYAOQALW.js.map +1 -0
- package/dist/chunk-CRTVS7VI.cjs +162 -0
- package/dist/chunk-CRTVS7VI.cjs.map +1 -0
- package/dist/chunk-EXITP7QO.js +288 -0
- package/dist/chunk-EXITP7QO.js.map +1 -0
- package/dist/chunk-GMO3PRZZ.js +565 -0
- package/dist/chunk-GMO3PRZZ.js.map +1 -0
- package/dist/chunk-HRO2DWKZ.js +12 -0
- package/dist/chunk-HRO2DWKZ.js.map +1 -0
- package/dist/chunk-JHDKUQSB.js +1069 -0
- package/dist/chunk-JHDKUQSB.js.map +1 -0
- package/dist/chunk-JN2Y6RSY.js +23 -0
- package/dist/chunk-JN2Y6RSY.js.map +1 -0
- package/dist/chunk-JRJSKRZW.cjs +29 -0
- package/dist/chunk-JRJSKRZW.cjs.map +1 -0
- package/dist/chunk-KC62H4VJ.js +123 -0
- package/dist/chunk-KC62H4VJ.js.map +1 -0
- package/dist/chunk-LHEHSLD5.js +31 -0
- package/dist/chunk-LHEHSLD5.js.map +1 -0
- package/dist/chunk-N4264P7N.cjs +156 -0
- package/dist/chunk-N4264P7N.cjs.map +1 -0
- package/dist/chunk-NF5QYPYC.cjs +133 -0
- package/dist/chunk-NF5QYPYC.cjs.map +1 -0
- package/dist/chunk-OFLCHKKE.cjs +28 -0
- package/dist/chunk-OFLCHKKE.cjs.map +1 -0
- package/dist/chunk-PCNSWVA5.cjs +602 -0
- package/dist/chunk-PCNSWVA5.cjs.map +1 -0
- package/dist/chunk-STOMAA2X.js +85 -0
- package/dist/chunk-STOMAA2X.js.map +1 -0
- package/dist/chunk-UVF5S6LX.cjs +15 -0
- package/dist/chunk-UVF5S6LX.cjs.map +1 -0
- package/dist/chunk-WEIXCDCA.cjs +90 -0
- package/dist/chunk-WEIXCDCA.cjs.map +1 -0
- package/dist/chunk-X3ZTSLBQ.js +355 -0
- package/dist/chunk-X3ZTSLBQ.js.map +1 -0
- package/dist/chunk-YEV73J4J.js +504 -0
- package/dist/chunk-YEV73J4J.js.map +1 -0
- package/dist/chunk-YW5PNTRU.cjs +14 -0
- package/dist/chunk-YW5PNTRU.cjs.map +1 -0
- package/dist/chunk-ZNXSWUIS.js +12 -0
- package/dist/chunk-ZNXSWUIS.js.map +1 -0
- package/dist/chunk-ZUEMBY4W.js +21 -0
- package/dist/chunk-ZUEMBY4W.js.map +1 -0
- package/dist/components/index.cjs +60 -0
- package/dist/components/index.cjs.map +1 -0
- package/dist/components/index.d.cts +43 -0
- package/dist/components/index.d.ts +43 -4
- package/dist/components/index.js +3 -4
- package/dist/components/index.js.map +1 -0
- package/dist/core/devtools.cjs +25 -0
- package/dist/core/devtools.cjs.map +1 -0
- package/dist/core/devtools.d.cts +17 -0
- package/dist/core/devtools.d.ts +9 -7
- package/dist/core/devtools.js +4 -16
- package/dist/core/devtools.js.map +1 -0
- package/dist/core/index.cjs +220 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +196 -0
- package/dist/core/index.d.ts +196 -9
- package/dist/core/index.js +7 -8
- package/dist/core/index.js.map +1 -0
- package/dist/features/index.cjs +76 -0
- package/dist/features/index.cjs.map +1 -0
- package/dist/features/index.d.cts +86 -0
- package/dist/features/index.d.ts +86 -4
- package/dist/features/index.js +7 -3
- package/dist/features/index.js.map +1 -0
- package/dist/hooks/index.cjs +209 -0
- package/dist/hooks/index.cjs.map +1 -0
- package/dist/hooks/index.d.cts +377 -0
- package/dist/hooks/index.d.ts +377 -10
- package/dist/hooks/index.js +8 -9
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useInViewPrefetch.cjs +33 -0
- package/dist/hooks/useInViewPrefetch.cjs.map +1 -0
- package/dist/hooks/useInViewPrefetch.d.cts +12 -0
- package/dist/hooks/useInViewPrefetch.d.ts +6 -4
- package/dist/hooks/useInViewPrefetch.js +30 -20
- package/dist/hooks/useInViewPrefetch.js.map +1 -0
- package/dist/index.cjs +811 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +36 -0
- package/dist/index.d.ts +36 -8
- package/dist/index.js +89 -7
- package/dist/index.js.map +1 -0
- package/dist/{types/offline.d.ts → offline-DVPtgoAS.d.ts} +15 -13
- package/dist/offline-xxeA_-6V.d.cts +99 -0
- package/dist/persistence-MRtkmhqq.d.cts +216 -0
- package/dist/persistence-tIrEb0pR.d.ts +216 -0
- package/dist/react-query/index.cjs +52 -0
- package/dist/react-query/index.cjs.map +1 -0
- package/dist/react-query/index.d.cts +1 -0
- package/dist/react-query/index.d.ts +1 -3
- package/dist/react-query/index.js +3 -1
- package/dist/react-query/index.js.map +1 -0
- package/dist/types/index.cjs +43 -0
- package/dist/types/index.cjs.map +1 -0
- package/dist/types/index.d.cts +157 -0
- package/dist/types/index.d.ts +116 -12
- package/dist/types/index.js +6 -8
- package/dist/types/index.js.map +1 -0
- package/dist/utils/index.cjs +234 -0
- package/dist/utils/index.cjs.map +1 -0
- package/dist/utils/index.d.cts +272 -0
- package/dist/utils/index.d.ts +272 -10
- package/dist/utils/index.js +9 -9
- package/dist/utils/index.js.map +1 -0
- package/package.json +13 -3
- package/dist/PersistQueryClientProvider.d.ts +0 -22
- package/dist/PersistQueryClientProvider.d.ts.map +0 -1
- package/dist/PersistQueryClientProvider.js +0 -57
- package/dist/components/LoadingFallback.d.ts +0 -16
- package/dist/components/LoadingFallback.d.ts.map +0 -1
- package/dist/components/LoadingFallback.js +0 -27
- package/dist/components/QueryErrorBoundary.d.ts +0 -12
- package/dist/components/QueryErrorBoundary.d.ts.map +0 -1
- package/dist/components/QueryErrorBoundary.js +0 -9
- package/dist/components/SuspenseWrapper.d.ts +0 -14
- package/dist/components/SuspenseWrapper.d.ts.map +0 -1
- package/dist/components/SuspenseWrapper.js +0 -9
- package/dist/components/index.d.ts.map +0 -1
- package/dist/components/internal/ErrorBoundary.d.ts +0 -27
- package/dist/components/internal/ErrorBoundary.d.ts.map +0 -1
- package/dist/components/internal/ErrorBoundary.js +0 -37
- package/dist/core/config.d.ts +0 -80
- package/dist/core/config.d.ts.map +0 -1
- package/dist/core/config.js +0 -327
- package/dist/core/devtools.d.ts.map +0 -1
- package/dist/core/env.d.ts +0 -4
- package/dist/core/env.d.ts.map +0 -1
- package/dist/core/env.js +0 -26
- package/dist/core/focusManager.d.ts +0 -33
- package/dist/core/focusManager.d.ts.map +0 -1
- package/dist/core/focusManager.js +0 -122
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/keys.d.ts +0 -59
- package/dist/core/keys.d.ts.map +0 -1
- package/dist/core/keys.js +0 -107
- package/dist/core/queryOptions.d.ts +0 -19
- package/dist/core/queryOptions.d.ts.map +0 -1
- package/dist/core/queryOptions.js +0 -32
- package/dist/features/index.d.ts.map +0 -1
- package/dist/features/offline.d.ts +0 -49
- package/dist/features/offline.d.ts.map +0 -1
- package/dist/features/offline.js +0 -300
- package/dist/features/persistence.d.ts +0 -36
- package/dist/features/persistence.d.ts.map +0 -1
- package/dist/features/persistence.js +0 -187
- package/dist/hooks/batchQueries.d.ts +0 -129
- package/dist/hooks/batchQueries.d.ts.map +0 -1
- package/dist/hooks/batchQueries.js +0 -301
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/useDataGuardMutation.d.ts +0 -39
- package/dist/hooks/useDataGuardMutation.d.ts.map +0 -1
- package/dist/hooks/useDataGuardMutation.js +0 -137
- package/dist/hooks/useDataGuardQuery.d.ts +0 -28
- package/dist/hooks/useDataGuardQuery.d.ts.map +0 -1
- package/dist/hooks/useDataGuardQuery.js +0 -71
- package/dist/hooks/useFocusManager.d.ts +0 -41
- package/dist/hooks/useFocusManager.d.ts.map +0 -1
- package/dist/hooks/useFocusManager.js +0 -109
- package/dist/hooks/useInViewPrefetch.d.ts.map +0 -1
- package/dist/hooks/useInfiniteQuery.d.ts +0 -33
- package/dist/hooks/useInfiniteQuery.d.ts.map +0 -1
- package/dist/hooks/useInfiniteQuery.js +0 -61
- package/dist/hooks/useMutation.d.ts +0 -25
- package/dist/hooks/useMutation.d.ts.map +0 -1
- package/dist/hooks/useMutation.js +0 -180
- package/dist/hooks/usePrefetch.d.ts +0 -54
- package/dist/hooks/usePrefetch.d.ts.map +0 -1
- package/dist/hooks/usePrefetch.js +0 -229
- package/dist/hooks/useQuery.d.ts +0 -21
- package/dist/hooks/useQuery.d.ts.map +0 -1
- package/dist/hooks/useQuery.js +0 -46
- package/dist/hooks/useSuspenseQuery.d.ts +0 -11
- package/dist/hooks/useSuspenseQuery.d.ts.map +0 -1
- package/dist/hooks/useSuspenseQuery.js +0 -19
- package/dist/index.d.ts.map +0 -1
- package/dist/react-query/index.d.ts.map +0 -1
- package/dist/types/base.d.ts.map +0 -1
- package/dist/types/base.js +0 -26
- package/dist/types/dataGuard.d.ts +0 -69
- package/dist/types/dataGuard.d.ts.map +0 -1
- package/dist/types/dataGuard.js +0 -10
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/infinite.d.ts +0 -39
- package/dist/types/infinite.d.ts.map +0 -1
- package/dist/types/infinite.js +0 -1
- package/dist/types/offline.d.ts.map +0 -1
- package/dist/types/offline.js +0 -8
- package/dist/types/optimistic.d.ts +0 -126
- package/dist/types/optimistic.d.ts.map +0 -1
- package/dist/types/optimistic.js +0 -7
- package/dist/types/persistence.d.ts +0 -9
- package/dist/types/persistence.d.ts.map +0 -1
- package/dist/types/persistence.js +0 -1
- package/dist/types/selectors.d.ts +0 -11
- package/dist/types/selectors.d.ts.map +0 -1
- package/dist/types/selectors.js +0 -1
- package/dist/types/suspense.d.ts +0 -67
- package/dist/types/suspense.d.ts.map +0 -1
- package/dist/types/suspense.js +0 -1
- package/dist/utils/dataGuard.d.ts +0 -37
- package/dist/utils/dataGuard.d.ts.map +0 -1
- package/dist/utils/dataGuard.js +0 -251
- package/dist/utils/fieldMapper.d.ts +0 -9
- package/dist/utils/fieldMapper.d.ts.map +0 -1
- package/dist/utils/fieldMapper.js +0 -27
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/network.d.ts +0 -9
- package/dist/utils/network.d.ts.map +0 -1
- package/dist/utils/network.js +0 -43
- package/dist/utils/optimisticUtils.d.ts +0 -45
- package/dist/utils/optimisticUtils.d.ts.map +0 -1
- package/dist/utils/optimisticUtils.js +0 -116
- package/dist/utils/placeholderData.d.ts +0 -3
- package/dist/utils/placeholderData.d.ts.map +0 -1
- package/dist/utils/placeholderData.js +0 -28
- package/dist/utils/prefetchManager.d.ts +0 -111
- package/dist/utils/prefetchManager.d.ts.map +0 -1
- package/dist/utils/prefetchManager.js +0 -246
- package/dist/utils/queryKey.d.ts +0 -26
- package/dist/utils/queryKey.d.ts.map +0 -1
- package/dist/utils/queryKey.js +0 -89
- package/dist/utils/selectors.d.ts +0 -30
- package/dist/utils/selectors.d.ts.map +0 -1
- package/dist/utils/selectors.js +0 -18
- package/dist/utils/storage.d.ts +0 -7
- package/dist/utils/storage.d.ts.map +0 -1
- package/dist/utils/storage.js +0 -84
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
import { useQueryClient, useMutation as useTanStackMutation } from "@tanstack/react-query";
|
|
2
|
-
import { DEFAULT_MUTATION_CONFIG } from "../core/config.js";
|
|
3
|
-
function deriveFamilyKey(queryKey) {
|
|
4
|
-
const arr = Array.isArray(queryKey) ? [...queryKey] : [queryKey];
|
|
5
|
-
while (arr.length > 1) {
|
|
6
|
-
const last = arr[arr.length - 1];
|
|
7
|
-
if (last && typeof last === "object" && !Array.isArray(last)) {
|
|
8
|
-
arr.pop();
|
|
9
|
-
continue;
|
|
10
|
-
}
|
|
11
|
-
if (typeof last === "string" && (last === "paginated" || last === "filtered" || last === "sorted" || last === "search" || last === "complex")) {
|
|
12
|
-
arr.pop();
|
|
13
|
-
continue;
|
|
14
|
-
}
|
|
15
|
-
break;
|
|
16
|
-
}
|
|
17
|
-
return arr;
|
|
18
|
-
}
|
|
19
|
-
function isListFamilyKey(queryKey) {
|
|
20
|
-
const parts = Array.isArray(queryKey) ? queryKey : [queryKey];
|
|
21
|
-
return parts.includes("list") || parts.includes("paginated");
|
|
22
|
-
}
|
|
23
|
-
export function invalidateQueriesBatch(queryClient, tasks) {
|
|
24
|
-
tasks.forEach(task => queryClient.invalidateQueries(task));
|
|
25
|
-
}
|
|
26
|
-
export function cancelQueriesBatch(queryClient, tasks) {
|
|
27
|
-
tasks.forEach(task => queryClient.cancelQueries(task));
|
|
28
|
-
}
|
|
29
|
-
export function setQueryDataBatch(queryClient, tasks) {
|
|
30
|
-
tasks.forEach(task => queryClient.setQueryData(task.queryKey, task.data));
|
|
31
|
-
}
|
|
32
|
-
export function useMutation(options) {
|
|
33
|
-
const queryClient = useQueryClient();
|
|
34
|
-
const { optimistic, onMutate, onError, onSuccess, onSettled, ...restOptions } = options;
|
|
35
|
-
const mutationConfig = {
|
|
36
|
-
...restOptions,
|
|
37
|
-
retry: restOptions.retry ?? DEFAULT_MUTATION_CONFIG.retry,
|
|
38
|
-
retryDelay: restOptions.retryDelay ?? DEFAULT_MUTATION_CONFIG.retryDelay,
|
|
39
|
-
gcTime: restOptions.gcTime ?? DEFAULT_MUTATION_CONFIG.gcTime
|
|
40
|
-
};
|
|
41
|
-
if (!optimistic) {
|
|
42
|
-
if (onMutate) {
|
|
43
|
-
mutationConfig.onMutate = onMutate;
|
|
44
|
-
}
|
|
45
|
-
if (onError) {
|
|
46
|
-
mutationConfig.onError = onError;
|
|
47
|
-
}
|
|
48
|
-
if (onSuccess) {
|
|
49
|
-
mutationConfig.onSuccess = onSuccess;
|
|
50
|
-
}
|
|
51
|
-
if (onSettled) {
|
|
52
|
-
mutationConfig.onSettled = onSettled;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
mutationConfig.onMutate = async (variables) => {
|
|
57
|
-
if (optimistic.enabled === false) {
|
|
58
|
-
const mutateCallback = onMutate;
|
|
59
|
-
const userContext = onMutate ? await mutateCallback(variables) : undefined;
|
|
60
|
-
return { userContext };
|
|
61
|
-
}
|
|
62
|
-
try {
|
|
63
|
-
// Derive family key (e.g., ['products', 'list'] from ['products', 'list', { page: 1, pageSize: 10 }])
|
|
64
|
-
const familyKey = optimistic.familyKey ?? deriveFamilyKey(optimistic.queryKey);
|
|
65
|
-
// Cancel all queries in the family to prevent race conditions
|
|
66
|
-
await queryClient.cancelQueries({ queryKey: familyKey });
|
|
67
|
-
// Save snapshots of all queries in the family
|
|
68
|
-
const previousData = queryClient.getQueriesData({ queryKey: familyKey });
|
|
69
|
-
// Apply field mapping if specified
|
|
70
|
-
let mappedVariables = variables;
|
|
71
|
-
if (optimistic.fieldMapping && typeof variables === "object" && variables !== null) {
|
|
72
|
-
mappedVariables = { ...variables };
|
|
73
|
-
const sourceObj = variables;
|
|
74
|
-
const targetObj = mappedVariables;
|
|
75
|
-
Object.entries(optimistic.fieldMapping).forEach(([sourceField, targetField]) => {
|
|
76
|
-
if (sourceField in sourceObj) {
|
|
77
|
-
targetObj[targetField] = sourceObj[sourceField];
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
// ✅ Official approach: Update all cached query variants using setQueriesData
|
|
82
|
-
queryClient.setQueriesData({ queryKey: familyKey }, (oldData) => {
|
|
83
|
-
if (!oldData)
|
|
84
|
-
return oldData;
|
|
85
|
-
return optimistic.updater(oldData, mappedVariables);
|
|
86
|
-
});
|
|
87
|
-
const mutateCallback = onMutate;
|
|
88
|
-
const userContext = onMutate ? await mutateCallback(variables) : undefined;
|
|
89
|
-
return { previousData, userContext };
|
|
90
|
-
}
|
|
91
|
-
catch (error) {
|
|
92
|
-
return { userContext: undefined };
|
|
93
|
-
}
|
|
94
|
-
};
|
|
95
|
-
mutationConfig.onError = (error, variables, context) => {
|
|
96
|
-
// Rollback all query variants
|
|
97
|
-
if (context?.previousData) {
|
|
98
|
-
context.previousData.forEach(([queryKey, data]) => {
|
|
99
|
-
queryClient.setQueryData(queryKey, data);
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
if (optimistic.rollback && context?.previousData) {
|
|
103
|
-
try {
|
|
104
|
-
// Call rollback with the first snapshot (usually the current query)
|
|
105
|
-
const firstSnapshot = context.previousData[0]?.[1];
|
|
106
|
-
if (firstSnapshot) {
|
|
107
|
-
optimistic.rollback(firstSnapshot, error);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
catch { }
|
|
111
|
-
}
|
|
112
|
-
if (onError) {
|
|
113
|
-
const errorCallback = onError;
|
|
114
|
-
errorCallback(error, variables, context?.userContext);
|
|
115
|
-
}
|
|
116
|
-
};
|
|
117
|
-
mutationConfig.onSuccess = (data, variables, context) => {
|
|
118
|
-
// Determine invalidation scope
|
|
119
|
-
const scope = optimistic.invalidateScope ?? (isListFamilyKey(optimistic.queryKey) ? "family" : "exact");
|
|
120
|
-
const invalidations = [];
|
|
121
|
-
if (scope !== "none") {
|
|
122
|
-
if (scope === "family") {
|
|
123
|
-
const familyKey = optimistic.familyKey ?? deriveFamilyKey(optimistic.queryKey);
|
|
124
|
-
invalidations.push({ queryKey: familyKey });
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
invalidations.push({ queryKey: optimistic.queryKey });
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
// Add related keys
|
|
131
|
-
if (Array.isArray(optimistic.relatedKeys) && optimistic.relatedKeys.length > 0) {
|
|
132
|
-
optimistic.relatedKeys.forEach((k) => invalidations.push({ queryKey: k }));
|
|
133
|
-
}
|
|
134
|
-
if (Array.isArray(optimistic.invalidates) && optimistic.invalidates.length > 0) {
|
|
135
|
-
optimistic.invalidates.forEach((k) => invalidations.push({ queryKey: k }));
|
|
136
|
-
}
|
|
137
|
-
// Execute invalidations (deduplicated)
|
|
138
|
-
if (invalidations.length > 0) {
|
|
139
|
-
const seen = new Set();
|
|
140
|
-
const tasks = invalidations
|
|
141
|
-
.map((cfg) => ({ ...cfg, exact: false }))
|
|
142
|
-
.filter((cfg) => {
|
|
143
|
-
const key = JSON.stringify(cfg.queryKey);
|
|
144
|
-
if (seen.has(key))
|
|
145
|
-
return false;
|
|
146
|
-
seen.add(key);
|
|
147
|
-
return true;
|
|
148
|
-
});
|
|
149
|
-
tasks.forEach(task => queryClient.invalidateQueries(task));
|
|
150
|
-
}
|
|
151
|
-
if (onSuccess) {
|
|
152
|
-
const successCallback = onSuccess;
|
|
153
|
-
successCallback(data, variables, context?.userContext);
|
|
154
|
-
}
|
|
155
|
-
};
|
|
156
|
-
mutationConfig.onSettled = (data, error, variables, context) => {
|
|
157
|
-
if (onSettled) {
|
|
158
|
-
const settledCallback = onSettled;
|
|
159
|
-
settledCallback(data, error, variables, context?.userContext);
|
|
160
|
-
}
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
return useTanStackMutation(mutationConfig);
|
|
164
|
-
}
|
|
165
|
-
export function setupMutationDefaults(queryClient, config) {
|
|
166
|
-
Object.entries(config).forEach(([key, options]) => { queryClient.setMutationDefaults([key], options); });
|
|
167
|
-
}
|
|
168
|
-
export function useListMutation(mutationFn, queryKey, options) {
|
|
169
|
-
const queryClient = useQueryClient();
|
|
170
|
-
return useTanStackMutation({
|
|
171
|
-
mutationFn,
|
|
172
|
-
onSettled: () => {
|
|
173
|
-
// Invalidate all queries in the family
|
|
174
|
-
const familyKey = deriveFamilyKey(queryKey);
|
|
175
|
-
queryClient.invalidateQueries({ queryKey: familyKey, exact: false });
|
|
176
|
-
},
|
|
177
|
-
...options,
|
|
178
|
-
mutationKey: options?.mutationKey
|
|
179
|
-
});
|
|
180
|
-
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import type { QueryFunction, QueryKey } from "@tanstack/react-query";
|
|
2
|
-
export interface PrefetchOptions {
|
|
3
|
-
delay?: number;
|
|
4
|
-
enabled?: boolean;
|
|
5
|
-
staleTime?: number;
|
|
6
|
-
minInterval?: number;
|
|
7
|
-
}
|
|
8
|
-
export interface HoverPrefetchOptions extends PrefetchOptions {
|
|
9
|
-
hoverDelay?: number;
|
|
10
|
-
}
|
|
11
|
-
export interface InViewPrefetchOptions extends PrefetchOptions {
|
|
12
|
-
threshold?: number;
|
|
13
|
-
rootMargin?: string;
|
|
14
|
-
triggerOnce?: boolean;
|
|
15
|
-
}
|
|
16
|
-
export declare function useHoverPrefetch<TData = unknown>(queryKey: QueryKey, queryFn: QueryFunction<TData>, options?: HoverPrefetchOptions): {
|
|
17
|
-
onMouseEnter: () => void;
|
|
18
|
-
onMouseLeave: () => void;
|
|
19
|
-
onFocus: () => void;
|
|
20
|
-
};
|
|
21
|
-
export declare function useRoutePrefetch(): <TData = unknown>(queryKey: QueryKey, queryFn: QueryFunction<TData>, options?: PrefetchOptions) => void;
|
|
22
|
-
export declare function useBatchPrefetch(): <TData = unknown>(queries: Array<{
|
|
23
|
-
queryKey: QueryKey;
|
|
24
|
-
queryFn: QueryFunction<TData>;
|
|
25
|
-
staleTime?: number;
|
|
26
|
-
}>) => void;
|
|
27
|
-
export declare function useSmartPrefetch(): {
|
|
28
|
-
prefetch: <TData = unknown>(queryKey: QueryKey, queryFn: QueryFunction<TData>, options?: PrefetchOptions) => void;
|
|
29
|
-
shouldPrefetch: boolean;
|
|
30
|
-
clearPrefetchHistory: () => void;
|
|
31
|
-
};
|
|
32
|
-
export declare function useConditionalPrefetch<TData = unknown>(queryKey: QueryKey, queryFn: QueryFunction<TData>, condition: boolean, options?: PrefetchOptions): void;
|
|
33
|
-
export declare function useIdlePrefetch<TData = unknown>(queryKey: QueryKey, queryFn: QueryFunction<TData>, options?: PrefetchOptions & {
|
|
34
|
-
timeout?: number;
|
|
35
|
-
}): void;
|
|
36
|
-
export declare function usePeriodicPrefetch<TData = unknown>(queryKey: QueryKey, queryFn: QueryFunction<TData>, options?: PrefetchOptions & {
|
|
37
|
-
interval?: number;
|
|
38
|
-
}): void;
|
|
39
|
-
export declare function usePredictivePrefetch(): {
|
|
40
|
-
recordInteraction: (action: string, target: string) => void;
|
|
41
|
-
getPredictions: () => string[];
|
|
42
|
-
prefetchPredicted: <TData = unknown>(getQueryConfig: (target: string) => {
|
|
43
|
-
queryKey: QueryKey;
|
|
44
|
-
queryFn: QueryFunction<TData>;
|
|
45
|
-
}) => void;
|
|
46
|
-
clearHistory: () => void;
|
|
47
|
-
};
|
|
48
|
-
export declare function usePriorityPrefetch(): {
|
|
49
|
-
addPrefetchTask: <TData = unknown>(queryKey: QueryKey, queryFn: QueryFunction<TData>, priority?: "high" | "medium" | "low") => void;
|
|
50
|
-
processTasks: () => Promise<void>;
|
|
51
|
-
clearTasks: () => void;
|
|
52
|
-
taskCount: number;
|
|
53
|
-
};
|
|
54
|
-
//# sourceMappingURL=usePrefetch.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"usePrefetch.d.ts","sourceRoot":"","sources":["../../src/hooks/usePrefetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAMrE,MAAM,WAAW,eAAe;IAAG,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE;AAChH,MAAM,WAAW,oBAAqB,SAAQ,eAAe;IAAG,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE;AACrF,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAAG,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE;AASjI,wBAAgB,gBAAgB,CAAC,KAAK,GAAG,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,GAAE,oBAAyB;;;;EAwBtI;AAGD,wBAAgB,gBAAgB,KAGV,KAAK,sBAAsB,QAAQ,WAAW,aAAa,CAAC,KAAK,CAAC,YAAY,eAAe,UAUlH;AAED,wBAAgB,gBAAgB,KAEV,KAAK,qBAAqB,KAAK,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,UAO/H;AAED,wBAAgB,gBAAgB;eAUA,KAAK,sBAAsB,QAAQ,WAAW,aAAa,CAAC,KAAK,CAAC,YAAY,eAAe;;;EAa5H;AAaD,wBAAgB,sBAAsB,CAAC,KAAK,GAAG,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,eAAe,QAgBvJ;AAED,wBAAgB,eAAe,CAAC,KAAK,GAAG,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,QAwBnJ;AAED,wBAAgB,mBAAmB,CAAC,KAAK,GAAG,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,QAkBxJ;AAED,wBAAgB,qBAAqB;gCAIY,MAAM,UAAU,MAAM;;wBAa9B,KAAK,4BAA4B,CAAC,MAAM,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAA;KAAE;;EASlJ;AAED,wBAAgB,mBAAmB;sBAII,KAAK,sBAAsB,QAAQ,WAAW,aAAa,CAAC,KAAK,CAAC,aAAY,MAAM,GAAG,QAAQ,GAAG,KAAK;;;;EAmB7I"}
|
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
import { useQueryClient } from "@tanstack/react-query";
|
|
2
|
-
import { useCallback, useEffect, useRef, useState } from "react";
|
|
3
|
-
import { DEFAULT_STALE_TIME } from "../core/config.js";
|
|
4
|
-
import { isSlowNetwork } from "../utils/network.js";
|
|
5
|
-
function isMissingOrStale(queryClient, queryKey, staleTime) {
|
|
6
|
-
const state = queryClient.getQueryState(queryKey);
|
|
7
|
-
if (!state || state.data === undefined)
|
|
8
|
-
return true;
|
|
9
|
-
const updatedAt = state.dataUpdatedAt ?? 0;
|
|
10
|
-
return Date.now() - updatedAt > staleTime;
|
|
11
|
-
}
|
|
12
|
-
export function useHoverPrefetch(queryKey, queryFn, options = {}) {
|
|
13
|
-
const queryClient = useQueryClient();
|
|
14
|
-
const timeoutRef = useRef(undefined);
|
|
15
|
-
const { hoverDelay = 200, enabled = true, staleTime = DEFAULT_STALE_TIME, minInterval = 1000 } = options;
|
|
16
|
-
const queryFnRef = useRef(queryFn);
|
|
17
|
-
useEffect(() => { queryFnRef.current = queryFn; }, [queryFn]);
|
|
18
|
-
const lastPrefetchRef = useRef(new Map());
|
|
19
|
-
const prefetch = useCallback(() => {
|
|
20
|
-
if (!enabled)
|
|
21
|
-
return;
|
|
22
|
-
const keyStr = JSON.stringify(queryKey);
|
|
23
|
-
const last = lastPrefetchRef.current.get(keyStr) ?? 0;
|
|
24
|
-
if (Date.now() - last < minInterval)
|
|
25
|
-
return;
|
|
26
|
-
if (!isMissingOrStale(queryClient, queryKey, staleTime))
|
|
27
|
-
return;
|
|
28
|
-
queryClient.prefetchQuery({ queryKey, queryFn: queryFnRef.current, staleTime });
|
|
29
|
-
lastPrefetchRef.current.set(keyStr, Date.now());
|
|
30
|
-
}, [queryClient, queryKey, enabled, staleTime]);
|
|
31
|
-
const handleMouseEnter = useCallback(() => {
|
|
32
|
-
if (!enabled)
|
|
33
|
-
return;
|
|
34
|
-
if (timeoutRef.current) {
|
|
35
|
-
clearTimeout(timeoutRef.current);
|
|
36
|
-
}
|
|
37
|
-
timeoutRef.current = setTimeout(prefetch, hoverDelay);
|
|
38
|
-
}, [prefetch, hoverDelay, enabled]);
|
|
39
|
-
const handleMouseLeave = useCallback(() => { if (timeoutRef.current) {
|
|
40
|
-
clearTimeout(timeoutRef.current);
|
|
41
|
-
} }, []);
|
|
42
|
-
useEffect(() => () => { if (timeoutRef.current) {
|
|
43
|
-
clearTimeout(timeoutRef.current);
|
|
44
|
-
} }, []);
|
|
45
|
-
return { onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, onFocus: prefetch };
|
|
46
|
-
}
|
|
47
|
-
export function useRoutePrefetch() {
|
|
48
|
-
const queryClient = useQueryClient();
|
|
49
|
-
const lastPrefetchRef = useRef(new Map());
|
|
50
|
-
return useCallback((queryKey, queryFn, options) => {
|
|
51
|
-
const { enabled = true, staleTime = DEFAULT_STALE_TIME, minInterval = 1000 } = options || {};
|
|
52
|
-
if (!enabled)
|
|
53
|
-
return;
|
|
54
|
-
const keyStr = JSON.stringify(queryKey);
|
|
55
|
-
const last = lastPrefetchRef.current.get(keyStr) ?? 0;
|
|
56
|
-
if (Date.now() - last < minInterval)
|
|
57
|
-
return;
|
|
58
|
-
if (!isMissingOrStale(queryClient, queryKey, staleTime))
|
|
59
|
-
return;
|
|
60
|
-
queryClient.prefetchQuery({ queryKey, queryFn, staleTime });
|
|
61
|
-
lastPrefetchRef.current.set(keyStr, Date.now());
|
|
62
|
-
}, [queryClient]);
|
|
63
|
-
}
|
|
64
|
-
export function useBatchPrefetch() {
|
|
65
|
-
const queryClient = useQueryClient();
|
|
66
|
-
return useCallback((queries) => {
|
|
67
|
-
queries.forEach(({ queryKey, queryFn, staleTime = DEFAULT_STALE_TIME }) => {
|
|
68
|
-
if (isMissingOrStale(queryClient, queryKey, staleTime)) {
|
|
69
|
-
queryClient.prefetchQuery({ queryKey, queryFn, staleTime });
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
}, [queryClient]);
|
|
73
|
-
}
|
|
74
|
-
export function useSmartPrefetch() {
|
|
75
|
-
const queryClient = useQueryClient();
|
|
76
|
-
const prefetchedRef = useRef(new Set());
|
|
77
|
-
const lastPrefetchRef = useRef(new Map());
|
|
78
|
-
const shouldPrefetchQuery = useCallback((queryKey) => {
|
|
79
|
-
const key = JSON.stringify(queryKey);
|
|
80
|
-
if (prefetchedRef.current.has(key))
|
|
81
|
-
return false;
|
|
82
|
-
if (isSlowNetwork())
|
|
83
|
-
return false;
|
|
84
|
-
return true;
|
|
85
|
-
}, []);
|
|
86
|
-
const prefetch = useCallback((queryKey, queryFn, options) => {
|
|
87
|
-
if (!shouldPrefetchQuery(queryKey))
|
|
88
|
-
return;
|
|
89
|
-
const { staleTime = DEFAULT_STALE_TIME, minInterval = 1000 } = options || {};
|
|
90
|
-
const keyStr = JSON.stringify(queryKey);
|
|
91
|
-
const last = lastPrefetchRef.current.get(keyStr) ?? 0;
|
|
92
|
-
if (Date.now() - last < minInterval)
|
|
93
|
-
return;
|
|
94
|
-
if (!isMissingOrStale(queryClient, queryKey, staleTime))
|
|
95
|
-
return;
|
|
96
|
-
prefetchedRef.current.add(keyStr);
|
|
97
|
-
queryClient.prefetchQuery({ queryKey, queryFn, staleTime });
|
|
98
|
-
lastPrefetchRef.current.set(keyStr, Date.now());
|
|
99
|
-
}, [queryClient, shouldPrefetchQuery]);
|
|
100
|
-
const clearPrefetchHistory = useCallback(() => { prefetchedRef.current.clear(); }, []);
|
|
101
|
-
return { prefetch, shouldPrefetch: !isSlowNetwork(), clearPrefetchHistory };
|
|
102
|
-
}
|
|
103
|
-
function useStableQueryKey(queryKey) {
|
|
104
|
-
const keyRef = useRef(queryKey);
|
|
105
|
-
const keyStr = JSON.stringify(queryKey);
|
|
106
|
-
const prevKeyStr = useRef(keyStr);
|
|
107
|
-
if (prevKeyStr.current !== keyStr) {
|
|
108
|
-
keyRef.current = queryKey;
|
|
109
|
-
prevKeyStr.current = keyStr;
|
|
110
|
-
}
|
|
111
|
-
return keyRef.current;
|
|
112
|
-
}
|
|
113
|
-
export function useConditionalPrefetch(queryKey, queryFn, condition, options) {
|
|
114
|
-
const queryClient = useQueryClient();
|
|
115
|
-
const { staleTime = DEFAULT_STALE_TIME, delay = 0 } = options || {};
|
|
116
|
-
const queryFnRef = useRef(queryFn);
|
|
117
|
-
useEffect(() => { queryFnRef.current = queryFn; }, [queryFn]);
|
|
118
|
-
const stableQueryKey = useStableQueryKey(queryKey);
|
|
119
|
-
useEffect(() => {
|
|
120
|
-
if (!condition)
|
|
121
|
-
return;
|
|
122
|
-
const currentQueryKey = stableQueryKey;
|
|
123
|
-
const timeoutId = setTimeout(() => {
|
|
124
|
-
if (isMissingOrStale(queryClient, currentQueryKey, staleTime)) {
|
|
125
|
-
queryClient.prefetchQuery({ queryKey: currentQueryKey, queryFn: queryFnRef.current, staleTime });
|
|
126
|
-
}
|
|
127
|
-
}, delay);
|
|
128
|
-
return () => clearTimeout(timeoutId);
|
|
129
|
-
}, [condition, queryClient, staleTime, delay, stableQueryKey]);
|
|
130
|
-
}
|
|
131
|
-
export function useIdlePrefetch(queryKey, queryFn, options) {
|
|
132
|
-
const queryClient = useQueryClient();
|
|
133
|
-
const { staleTime = DEFAULT_STALE_TIME, enabled = true, timeout = 1000 } = options || {};
|
|
134
|
-
const queryFnRef = useRef(queryFn);
|
|
135
|
-
useEffect(() => { queryFnRef.current = queryFn; }, [queryFn]);
|
|
136
|
-
const stableQueryKey = useStableQueryKey(queryKey);
|
|
137
|
-
useEffect(() => {
|
|
138
|
-
if (!enabled)
|
|
139
|
-
return;
|
|
140
|
-
const currentQueryKey = stableQueryKey;
|
|
141
|
-
if (typeof window === "undefined" || !("requestIdleCallback" in window)) {
|
|
142
|
-
const timeoutId = setTimeout(() => {
|
|
143
|
-
if (isMissingOrStale(queryClient, currentQueryKey, staleTime)) {
|
|
144
|
-
queryClient.prefetchQuery({ queryKey: currentQueryKey, queryFn: queryFnRef.current, staleTime });
|
|
145
|
-
}
|
|
146
|
-
}, timeout);
|
|
147
|
-
return () => clearTimeout(timeoutId);
|
|
148
|
-
}
|
|
149
|
-
const idleCallbackId = window.requestIdleCallback(() => {
|
|
150
|
-
if (isMissingOrStale(queryClient, currentQueryKey, staleTime)) {
|
|
151
|
-
queryClient.prefetchQuery({ queryKey: currentQueryKey, queryFn: queryFnRef.current, staleTime });
|
|
152
|
-
}
|
|
153
|
-
}, { timeout });
|
|
154
|
-
return () => window.cancelIdleCallback(idleCallbackId);
|
|
155
|
-
}, [queryClient, staleTime, enabled, timeout, stableQueryKey]);
|
|
156
|
-
}
|
|
157
|
-
export function usePeriodicPrefetch(queryKey, queryFn, options) {
|
|
158
|
-
const queryClient = useQueryClient();
|
|
159
|
-
const { staleTime = DEFAULT_STALE_TIME, enabled = true, interval = 60000 } = options || {};
|
|
160
|
-
const queryFnRef = useRef(queryFn);
|
|
161
|
-
useEffect(() => { queryFnRef.current = queryFn; }, [queryFn]);
|
|
162
|
-
const stableQueryKey = useStableQueryKey(queryKey);
|
|
163
|
-
useEffect(() => {
|
|
164
|
-
if (!enabled)
|
|
165
|
-
return;
|
|
166
|
-
const currentQueryKey = stableQueryKey;
|
|
167
|
-
const prefetchData = () => {
|
|
168
|
-
if (isMissingOrStale(queryClient, currentQueryKey, staleTime)) {
|
|
169
|
-
queryClient.prefetchQuery({ queryKey: currentQueryKey, queryFn: queryFnRef.current, staleTime });
|
|
170
|
-
}
|
|
171
|
-
};
|
|
172
|
-
prefetchData();
|
|
173
|
-
const intervalId = setInterval(prefetchData, interval);
|
|
174
|
-
return () => clearInterval(intervalId);
|
|
175
|
-
}, [queryClient, staleTime, enabled, interval, stableQueryKey]);
|
|
176
|
-
}
|
|
177
|
-
export function usePredictivePrefetch() {
|
|
178
|
-
const queryClient = useQueryClient();
|
|
179
|
-
const interactionHistoryRef = useRef([]);
|
|
180
|
-
const maxHistorySize = 50;
|
|
181
|
-
const recordInteraction = useCallback((action, target) => {
|
|
182
|
-
interactionHistoryRef.current.push({ action, target, timestamp: Date.now() });
|
|
183
|
-
if (interactionHistoryRef.current.length > maxHistorySize) {
|
|
184
|
-
interactionHistoryRef.current.shift();
|
|
185
|
-
}
|
|
186
|
-
}, []);
|
|
187
|
-
const getPredictions = useCallback(() => {
|
|
188
|
-
const history = interactionHistoryRef.current;
|
|
189
|
-
if (history.length < 3)
|
|
190
|
-
return [];
|
|
191
|
-
const targetCounts = new Map();
|
|
192
|
-
history.forEach(({ target }) => { targetCounts.set(target, (targetCounts.get(target) || 0) + 1); });
|
|
193
|
-
return Array.from(targetCounts.entries()).sort((a, b) => b[1] - a[1]).slice(0, 5).map(([target]) => target);
|
|
194
|
-
}, []);
|
|
195
|
-
const prefetchPredicted = useCallback((getQueryConfig) => {
|
|
196
|
-
const predictions = getPredictions();
|
|
197
|
-
predictions.forEach((target) => {
|
|
198
|
-
const { queryKey, queryFn } = getQueryConfig(target);
|
|
199
|
-
queryClient.prefetchQuery({ queryKey, queryFn });
|
|
200
|
-
});
|
|
201
|
-
}, [queryClient, getPredictions]);
|
|
202
|
-
const clearHistory = useCallback(() => { interactionHistoryRef.current = []; }, []);
|
|
203
|
-
return { recordInteraction, getPredictions, prefetchPredicted, clearHistory };
|
|
204
|
-
}
|
|
205
|
-
export function usePriorityPrefetch() {
|
|
206
|
-
const queryClient = useQueryClient();
|
|
207
|
-
const tasksRef = useRef([]);
|
|
208
|
-
const [taskCount, setTaskCount] = useState(0);
|
|
209
|
-
const addPrefetchTask = useCallback((queryKey, queryFn, priority = "medium") => {
|
|
210
|
-
tasksRef.current.push({ queryKey, queryFn, priority, timestamp: Date.now() });
|
|
211
|
-
setTaskCount(tasksRef.current.length);
|
|
212
|
-
}, []);
|
|
213
|
-
const processTasks = useCallback(async () => {
|
|
214
|
-
const priorityOrder = { high: 0, medium: 1, low: 2 };
|
|
215
|
-
const sortedTasks = [...tasksRef.current].sort((a, b) => {
|
|
216
|
-
const priorityDiff = priorityOrder[a.priority] - priorityOrder[b.priority];
|
|
217
|
-
if (priorityDiff !== 0)
|
|
218
|
-
return priorityDiff;
|
|
219
|
-
return a.timestamp - b.timestamp;
|
|
220
|
-
});
|
|
221
|
-
for (const task of sortedTasks) {
|
|
222
|
-
await queryClient.prefetchQuery({ queryKey: task.queryKey, queryFn: task.queryFn });
|
|
223
|
-
}
|
|
224
|
-
tasksRef.current = [];
|
|
225
|
-
setTaskCount(0);
|
|
226
|
-
}, [queryClient]);
|
|
227
|
-
const clearTasks = useCallback(() => { tasksRef.current = []; setTaskCount(0); }, []);
|
|
228
|
-
return { addPrefetchTask, processTasks, clearTasks, taskCount };
|
|
229
|
-
}
|
package/dist/hooks/useQuery.d.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { DefaultError, QueryKey, UseQueryOptions, UseQueryResult } from "@tanstack/react-query";
|
|
2
|
-
import { skipToken } from "@tanstack/react-query";
|
|
3
|
-
export interface EnhancedQueryOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> extends UseQueryOptions<TQueryFnData, TError, TData, TQueryKey> {
|
|
4
|
-
/** Log errors to console in development */
|
|
5
|
-
logErrors?: boolean;
|
|
6
|
-
/** Callback when query takes longer than threshold */
|
|
7
|
-
onSlowQuery?: (duration: number, queryKey: TQueryKey) => void;
|
|
8
|
-
/** Threshold in ms to trigger onSlowQuery (default: 3000) */
|
|
9
|
-
slowQueryThreshold?: number;
|
|
10
|
-
/** Enable performance tracking */
|
|
11
|
-
trackPerformance?: boolean;
|
|
12
|
-
}
|
|
13
|
-
export type EnhancedQueryResult<TData = unknown, TError = DefaultError> = UseQueryResult<TData, TError> & {
|
|
14
|
-
/** Number of times the query has been refetched */
|
|
15
|
-
refetchCount: number;
|
|
16
|
-
/** Last query duration in ms */
|
|
17
|
-
lastQueryDuration: number | null;
|
|
18
|
-
};
|
|
19
|
-
export declare function useEnhancedQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(options: EnhancedQueryOptions<TQueryFnData, TError, TData, TQueryKey>): EnhancedQueryResult<TData, TError>;
|
|
20
|
-
export { skipToken };
|
|
21
|
-
//# sourceMappingURL=useQuery.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../../src/hooks/useQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACrG,OAAO,EAAE,SAAS,EAAY,MAAM,uBAAuB,CAAC;AAI5D,MAAM,WAAW,oBAAoB,CAAC,YAAY,GAAG,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,KAAK,GAAG,YAAY,EAAE,SAAS,SAAS,QAAQ,GAAG,QAAQ,CAAE,SAAQ,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;IAC/M,2CAA2C;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sDAAsD;IACtD,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,KAAK,IAAI,CAAC;IAC9D,6DAA6D;IAC7D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kCAAkC;IAClC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,MAAM,mBAAmB,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,YAAY,IAAI,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG;IACxG,mDAAmD;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,YAAY,GAAG,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,KAAK,GAAG,YAAY,EAAE,SAAS,SAAS,QAAQ,GAAG,QAAQ,EACzI,OAAO,EAAE,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,GACpE,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,CAoDpC;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
package/dist/hooks/useQuery.js
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { skipToken, useQuery } from "@tanstack/react-query";
|
|
2
|
-
import { useEffect, useRef } from "react";
|
|
3
|
-
import { isDev } from "../core/env.js";
|
|
4
|
-
export function useEnhancedQuery(options) {
|
|
5
|
-
const { logErrors = isDev, onSlowQuery, slowQueryThreshold = 3000, trackPerformance = false, ...queryOptions } = options;
|
|
6
|
-
const startTimeRef = useRef(0);
|
|
7
|
-
const refetchCountRef = useRef(0);
|
|
8
|
-
const lastDurationRef = useRef(null);
|
|
9
|
-
const wasFetchingRef = useRef(false);
|
|
10
|
-
const result = useQuery(queryOptions);
|
|
11
|
-
// Performance tracking
|
|
12
|
-
useEffect(() => {
|
|
13
|
-
if (trackPerformance || onSlowQuery) {
|
|
14
|
-
if (result.isFetching && !wasFetchingRef.current) {
|
|
15
|
-
startTimeRef.current = Date.now();
|
|
16
|
-
}
|
|
17
|
-
else if (!result.isFetching && wasFetchingRef.current && startTimeRef.current > 0) {
|
|
18
|
-
const duration = Date.now() - startTimeRef.current;
|
|
19
|
-
lastDurationRef.current = duration;
|
|
20
|
-
if (onSlowQuery && duration > slowQueryThreshold) {
|
|
21
|
-
onSlowQuery(duration, queryOptions.queryKey);
|
|
22
|
-
}
|
|
23
|
-
startTimeRef.current = 0;
|
|
24
|
-
}
|
|
25
|
-
wasFetchingRef.current = result.isFetching;
|
|
26
|
-
}
|
|
27
|
-
}, [result.isFetching, onSlowQuery, slowQueryThreshold, trackPerformance, queryOptions.queryKey]);
|
|
28
|
-
// Error logging
|
|
29
|
-
useEffect(() => {
|
|
30
|
-
if (logErrors && result.isError && result.error) {
|
|
31
|
-
console.error(`[useEnhancedQuery Error] ${JSON.stringify(queryOptions.queryKey)}:`, result.error);
|
|
32
|
-
}
|
|
33
|
-
}, [result.isError, result.error, logErrors, queryOptions.queryKey]);
|
|
34
|
-
// Refetch counting
|
|
35
|
-
useEffect(() => {
|
|
36
|
-
if (result.isRefetching) {
|
|
37
|
-
refetchCountRef.current++;
|
|
38
|
-
}
|
|
39
|
-
}, [result.isRefetching]);
|
|
40
|
-
return {
|
|
41
|
-
...result,
|
|
42
|
-
refetchCount: refetchCountRef.current,
|
|
43
|
-
lastQueryDuration: lastDurationRef.current
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
export { skipToken };
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { DefaultError, QueryFunction, QueryFunctionContext, QueryKey, UseSuspenseInfiniteQueryOptions, UseSuspenseInfiniteQueryResult, UseSuspenseQueryOptions, UseSuspenseQueryResult } from "@tanstack/react-query";
|
|
2
|
-
type InfiniteQueryFunction<TQueryFnData = unknown, TQueryKey extends QueryKey = QueryKey, TPageParam = unknown> = (context: QueryFunctionContext<TQueryKey, TPageParam>) => Promise<TQueryFnData>;
|
|
3
|
-
export declare function createSuspenseQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TVariables = void>(getQueryKey: (variables: TVariables) => TQueryKey, queryFn: QueryFunction<TQueryFnData, TQueryKey>, options?: Omit<UseSuspenseQueryOptions<TQueryFnData, TError, TData, TQueryKey>, "queryKey" | "queryFn">): (variables: TVariables) => UseSuspenseQueryResult<TData, TError>;
|
|
4
|
-
export declare function createSuspenseInfiniteQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TPageParam = unknown, TVariables = void>(getQueryKey: (variables: TVariables) => TQueryKey, queryFn: InfiniteQueryFunction<TQueryFnData, TQueryKey, TPageParam>, options: Omit<UseSuspenseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>, "queryKey" | "queryFn"> & {
|
|
5
|
-
getNextPageParam: (lastPage: TQueryFnData, allPages: TQueryFnData[], lastPageParam: TPageParam, allPageParams: TPageParam[]) => TPageParam | undefined | null;
|
|
6
|
-
initialPageParam: TPageParam;
|
|
7
|
-
}): (variables: TVariables) => UseSuspenseInfiniteQueryResult<TData, TError>;
|
|
8
|
-
export declare function useEnhancedSuspenseQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(options: UseSuspenseQueryOptions<TQueryFnData, TError, TData, TQueryKey>): UseSuspenseQueryResult<TData, TError>;
|
|
9
|
-
export declare function useEnhancedSuspenseInfiniteQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TPageParam = unknown>(options: UseSuspenseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>): UseSuspenseInfiniteQueryResult<TData, TError>;
|
|
10
|
-
export {};
|
|
11
|
-
//# sourceMappingURL=useSuspenseQuery.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useSuspenseQuery.d.ts","sourceRoot":"","sources":["../../src/hooks/useSuspenseQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,QAAQ,EAAE,+BAA+B,EAAE,8BAA8B,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE3N,KAAK,qBAAqB,CAAC,YAAY,GAAG,OAAO,EAAE,SAAS,SAAS,QAAQ,GAAG,QAAQ,EAAE,UAAU,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,SAAS,EAAE,UAAU,CAAC,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAClM,wBAAgB,mBAAmB,CAAC,YAAY,GAAG,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,KAAK,GAAG,YAAY,EAAE,SAAS,SAAS,QAAQ,GAAG,QAAQ,EAAE,UAAU,GAAG,IAAI,EAC/J,WAAW,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,SAAS,EACjD,OAAO,EAAE,aAAa,CAAC,YAAY,EAAE,SAAS,CAAC,EAC/C,OAAO,CAAC,EAAE,IAAI,CAAC,uBAAuB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,IAE/F,WAAW,UAAU,KAAG,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,CAItE;AACD,wBAAgB,2BAA2B,CAAC,YAAY,GAAG,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,KAAK,GAAG,YAAY,EAAE,SAAS,SAAS,QAAQ,GAAG,QAAQ,EAAE,UAAU,GAAG,OAAO,EAAE,UAAU,GAAG,IAAI,EAC7L,WAAW,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,SAAS,EACjD,OAAO,EAAE,qBAAqB,CAAC,YAAY,EAAE,SAAS,EAAE,UAAU,CAAC,EACnE,OAAO,EAAE,IAAI,CAAC,+BAA+B,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,GAAG;IAC3H,gBAAgB,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,KAAK,UAAU,GAAG,SAAS,GAAG,IAAI,CAAC;IAC9J,gBAAgB,EAAE,UAAU,CAAC;CAC9B,IAEO,WAAW,UAAU,KAAG,8BAA8B,CAAC,KAAK,EAAE,MAAM,CAAC,CAI9E;AACD,wBAAgB,wBAAwB,CAAC,YAAY,GAAG,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,KAAK,GAAG,YAAY,EAAE,SAAS,SAAS,QAAQ,GAAG,QAAQ,EAAE,OAAO,EAAE,uBAAuB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,CAEpQ;AACD,wBAAgB,gCAAgC,CAAC,YAAY,GAAG,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,KAAK,GAAG,YAAY,EAAE,SAAS,SAAS,QAAQ,GAAG,QAAQ,EAAE,UAAU,GAAG,OAAO,EAAE,OAAO,EAAE,+BAA+B,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,GAAG,8BAA8B,CAAC,KAAK,EAAE,MAAM,CAAC,CAE9T"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { useSuspenseInfiniteQuery, useSuspenseQuery } from "@tanstack/react-query";
|
|
2
|
-
export function createSuspenseQuery(getQueryKey, queryFn, options) {
|
|
3
|
-
return (variables) => {
|
|
4
|
-
const queryKey = getQueryKey(variables);
|
|
5
|
-
return useSuspenseQuery({ queryKey, queryFn, ...options });
|
|
6
|
-
};
|
|
7
|
-
}
|
|
8
|
-
export function createSuspenseInfiniteQuery(getQueryKey, queryFn, options) {
|
|
9
|
-
return (variables) => {
|
|
10
|
-
const queryKey = getQueryKey(variables);
|
|
11
|
-
return useSuspenseInfiniteQuery({ queryKey, queryFn, ...options });
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
export function useEnhancedSuspenseQuery(options) {
|
|
15
|
-
return useSuspenseQuery(options);
|
|
16
|
-
}
|
|
17
|
-
export function useEnhancedSuspenseInfiniteQuery(options) {
|
|
18
|
-
return useSuspenseInfiniteQuery(options);
|
|
19
|
-
}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,KAAK,+BAA+B,EAAE,MAAM,iCAAiC,CAAC;AAChK,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react-query/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,SAAS,EACT,aAAa,EACb,aAAa,EACb,QAAQ,EACR,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,wBAAwB,EACzB,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EACV,eAAe,EACf,uBAAuB,EACvB,uBAAuB,EACvB,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,cAAc,EACd,sBAAsB,EACtB,iBAAiB,EACjB,YAAY,EACb,MAAM,uBAAuB,CAAC"}
|
package/dist/types/base.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/types/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACvF,oBAAY,WAAW;IAAG,KAAK,iBAAiB;IAAE,OAAO,mBAAmB;IAAE,UAAU,cAAc;IAAE,MAAM,WAAW;CAAE;AAC3H,oBAAY,iBAAiB;IAAG,IAAI,SAAS;IAAE,IAAI,SAAS;IAAE,OAAO,YAAY;CAAE;AACnF,oBAAY,aAAa;IAAG,IAAI,SAAS;IAAE,MAAM,WAAW;IAAE,GAAG,QAAQ;CAAE;AAC3E,oBAAY,uBAAuB;IAAG,UAAU,eAAe;IAAE,YAAY,iBAAiB;IAAE,SAAS,cAAc;IAAE,MAAM,WAAW;CAAE;AAC5I,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAAI,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE;AAClJ,MAAM,WAAW,kBAAkB;IAAG,aAAa,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE;AAC3I,MAAM,WAAW,aAAa;IAAG,QAAQ,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAAC,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAAC,YAAY,CAAC,EAAE,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,IAAI,CAAA;CAAE;AAC1L,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC;AAC3G,MAAM,MAAM,QAAQ,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9E,MAAM,MAAM,QAAQ,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,GAAG;KAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC;AACtE,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC"}
|
package/dist/types/base.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
export var StorageType;
|
|
2
|
-
(function (StorageType) {
|
|
3
|
-
StorageType["LOCAL"] = "localStorage";
|
|
4
|
-
StorageType["SESSION"] = "sessionStorage";
|
|
5
|
-
StorageType["INDEXED_DB"] = "indexedDB";
|
|
6
|
-
StorageType["CUSTOM"] = "custom";
|
|
7
|
-
})(StorageType || (StorageType = {}));
|
|
8
|
-
export var ConnectionQuality;
|
|
9
|
-
(function (ConnectionQuality) {
|
|
10
|
-
ConnectionQuality["SLOW"] = "slow";
|
|
11
|
-
ConnectionQuality["FAST"] = "fast";
|
|
12
|
-
ConnectionQuality["UNKNOWN"] = "unknown";
|
|
13
|
-
})(ConnectionQuality || (ConnectionQuality = {}));
|
|
14
|
-
export var CachePriority;
|
|
15
|
-
(function (CachePriority) {
|
|
16
|
-
CachePriority["HIGH"] = "high";
|
|
17
|
-
CachePriority["MEDIUM"] = "medium";
|
|
18
|
-
CachePriority["LOW"] = "low";
|
|
19
|
-
})(CachePriority || (CachePriority = {}));
|
|
20
|
-
export var PersistenceStrategyType;
|
|
21
|
-
(function (PersistenceStrategyType) {
|
|
22
|
-
PersistenceStrategyType["AGGRESSIVE"] = "aggressive";
|
|
23
|
-
PersistenceStrategyType["CONSERVATIVE"] = "conservative";
|
|
24
|
-
PersistenceStrategyType["SELECTIVE"] = "selective";
|
|
25
|
-
PersistenceStrategyType["CUSTOM"] = "custom";
|
|
26
|
-
})(PersistenceStrategyType || (PersistenceStrategyType = {}));
|