@qiaopeng/tanstack-query-plus 0.1.0
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/dist/PersistQueryClientProvider.d.ts +22 -0
- package/dist/PersistQueryClientProvider.d.ts.map +1 -0
- package/dist/PersistQueryClientProvider.js +47 -0
- package/dist/components/LoadingFallback.d.ts +16 -0
- package/dist/components/LoadingFallback.d.ts.map +1 -0
- package/dist/components/LoadingFallback.js +27 -0
- package/dist/components/QueryErrorBoundary.d.ts +12 -0
- package/dist/components/QueryErrorBoundary.d.ts.map +1 -0
- package/dist/components/QueryErrorBoundary.js +9 -0
- package/dist/components/SuspenseWrapper.d.ts +14 -0
- package/dist/components/SuspenseWrapper.d.ts.map +1 -0
- package/dist/components/SuspenseWrapper.js +9 -0
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +3 -0
- package/dist/components/internal/ErrorBoundary.d.ts +26 -0
- package/dist/components/internal/ErrorBoundary.d.ts.map +1 -0
- package/dist/components/internal/ErrorBoundary.js +28 -0
- package/dist/core/config.d.ts +36 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +213 -0
- package/dist/core/devtools.d.ts +14 -0
- package/dist/core/devtools.d.ts.map +1 -0
- package/dist/core/devtools.js +16 -0
- package/dist/core/env.d.ts +3 -0
- package/dist/core/env.d.ts.map +1 -0
- package/dist/core/env.js +2 -0
- package/dist/core/focusManager.d.ts +33 -0
- package/dist/core/focusManager.d.ts.map +1 -0
- package/dist/core/focusManager.js +122 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +5 -0
- package/dist/core/keys.d.ts +59 -0
- package/dist/core/keys.d.ts.map +1 -0
- package/dist/core/keys.js +107 -0
- package/dist/core/queryOptions.d.ts +30 -0
- package/dist/core/queryOptions.d.ts.map +1 -0
- package/dist/core/queryOptions.js +30 -0
- package/dist/features/index.d.ts +4 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +3 -0
- package/dist/features/offline.d.ts +48 -0
- package/dist/features/offline.d.ts.map +1 -0
- package/dist/features/offline.js +269 -0
- package/dist/features/persistence.d.ts +36 -0
- package/dist/features/persistence.d.ts.map +1 -0
- package/dist/features/persistence.js +175 -0
- package/dist/hooks/batchQueries.d.ts +128 -0
- package/dist/hooks/batchQueries.d.ts.map +1 -0
- package/dist/hooks/batchQueries.js +301 -0
- package/dist/hooks/index.d.ts +8 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +7 -0
- package/dist/hooks/useFocusManager.d.ts +41 -0
- package/dist/hooks/useFocusManager.d.ts.map +1 -0
- package/dist/hooks/useFocusManager.js +109 -0
- package/dist/hooks/useInfiniteQuery.d.ts +58 -0
- package/dist/hooks/useInfiniteQuery.d.ts.map +1 -0
- package/dist/hooks/useInfiniteQuery.js +61 -0
- package/dist/hooks/useMutation.d.ts +34 -0
- package/dist/hooks/useMutation.d.ts.map +1 -0
- package/dist/hooks/useMutation.js +176 -0
- package/dist/hooks/usePrefetch.d.ts +54 -0
- package/dist/hooks/usePrefetch.d.ts.map +1 -0
- package/dist/hooks/usePrefetch.js +203 -0
- package/dist/hooks/useQuery.d.ts +5 -0
- package/dist/hooks/useQuery.d.ts.map +1 -0
- package/dist/hooks/useQuery.js +5 -0
- package/dist/hooks/useSuspenseQuery.d.ts +11 -0
- package/dist/hooks/useSuspenseQuery.d.ts.map +1 -0
- package/dist/hooks/useSuspenseQuery.js +19 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/types/base.d.ts +54 -0
- package/dist/types/base.d.ts.map +1 -0
- package/dist/types/base.js +26 -0
- package/dist/types/index.d.ts +23 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/infinite.d.ts +39 -0
- package/dist/types/infinite.d.ts.map +1 -0
- package/dist/types/infinite.js +1 -0
- package/dist/types/offline.d.ts +97 -0
- package/dist/types/offline.d.ts.map +1 -0
- package/dist/types/offline.js +8 -0
- package/dist/types/optimistic.d.ts +126 -0
- package/dist/types/optimistic.d.ts.map +1 -0
- package/dist/types/optimistic.js +7 -0
- package/dist/types/persistence.d.ts +9 -0
- package/dist/types/persistence.d.ts.map +1 -0
- package/dist/types/persistence.js +1 -0
- package/dist/types/selectors.d.ts +11 -0
- package/dist/types/selectors.d.ts.map +1 -0
- package/dist/types/selectors.js +1 -0
- package/dist/types/suspense.d.ts +67 -0
- package/dist/types/suspense.d.ts.map +1 -0
- package/dist/types/suspense.js +1 -0
- package/dist/utils/fieldMapper.d.ts +9 -0
- package/dist/utils/fieldMapper.d.ts.map +1 -0
- package/dist/utils/fieldMapper.js +27 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/network.d.ts +9 -0
- package/dist/utils/network.d.ts.map +1 -0
- package/dist/utils/network.js +43 -0
- package/dist/utils/optimisticUtils.d.ts +34 -0
- package/dist/utils/optimisticUtils.d.ts.map +1 -0
- package/dist/utils/optimisticUtils.js +76 -0
- package/dist/utils/placeholderData.d.ts +2 -0
- package/dist/utils/placeholderData.d.ts.map +1 -0
- package/dist/utils/placeholderData.js +1 -0
- package/dist/utils/prefetchManager.d.ts +111 -0
- package/dist/utils/prefetchManager.d.ts.map +1 -0
- package/dist/utils/prefetchManager.js +246 -0
- package/dist/utils/queryKey.d.ts +24 -0
- package/dist/utils/queryKey.d.ts.map +1 -0
- package/dist/utils/queryKey.js +77 -0
- package/dist/utils/selectors.d.ts +30 -0
- package/dist/utils/selectors.d.ts.map +1 -0
- package/dist/utils/selectors.js +18 -0
- package/dist/utils/storage.d.ts +7 -0
- package/dist/utils/storage.d.ts.map +1 -0
- package/dist/utils/storage.js +84 -0
- package/package.json +70 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { useQueryClient, useMutation as useTanStackMutation } from "@tanstack/react-query";
|
|
2
|
+
import { DEFAULT_MUTATION_CONFIG } from "../core/config.js";
|
|
3
|
+
export function useMutation(options) {
|
|
4
|
+
const queryClient = useQueryClient();
|
|
5
|
+
const { optimistic, onMutate, onError, onSuccess, onSettled, ...restOptions } = options;
|
|
6
|
+
const mutationConfig = {
|
|
7
|
+
...restOptions,
|
|
8
|
+
retry: restOptions.retry ?? DEFAULT_MUTATION_CONFIG?.retry,
|
|
9
|
+
retryDelay: restOptions.retryDelay ?? DEFAULT_MUTATION_CONFIG?.retryDelay,
|
|
10
|
+
gcTime: restOptions.gcTime ?? DEFAULT_MUTATION_CONFIG?.gcTime
|
|
11
|
+
};
|
|
12
|
+
if (!optimistic) {
|
|
13
|
+
if (onMutate) {
|
|
14
|
+
mutationConfig.onMutate = onMutate;
|
|
15
|
+
}
|
|
16
|
+
if (onError) {
|
|
17
|
+
mutationConfig.onError = onError;
|
|
18
|
+
}
|
|
19
|
+
if (onSuccess) {
|
|
20
|
+
mutationConfig.onSuccess = onSuccess;
|
|
21
|
+
}
|
|
22
|
+
if (onSettled) {
|
|
23
|
+
mutationConfig.onSettled = onSettled;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
mutationConfig.onMutate = async (variables) => {
|
|
28
|
+
if (optimistic.enabled === false) {
|
|
29
|
+
const mutateCallback = onMutate;
|
|
30
|
+
const userContext = onMutate ? await mutateCallback(variables) : undefined;
|
|
31
|
+
return { userContext };
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
await queryClient.cancelQueries({ queryKey: optimistic.queryKey });
|
|
35
|
+
const previousData = queryClient.getQueryData(optimistic.queryKey);
|
|
36
|
+
let mappedVariables = variables;
|
|
37
|
+
if (optimistic.fieldMapping && typeof variables === "object" && variables !== null) {
|
|
38
|
+
mappedVariables = { ...variables };
|
|
39
|
+
const sourceObj = variables;
|
|
40
|
+
const targetObj = mappedVariables;
|
|
41
|
+
Object.entries(optimistic.fieldMapping).forEach(([sourceField, targetField]) => {
|
|
42
|
+
if (sourceField in sourceObj) {
|
|
43
|
+
targetObj[targetField] = sourceObj[sourceField];
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
queryClient.setQueryData(optimistic.queryKey, (oldData) => optimistic.updater(oldData, mappedVariables));
|
|
48
|
+
const mutateCallback = onMutate;
|
|
49
|
+
const userContext = onMutate ? await mutateCallback(variables) : undefined;
|
|
50
|
+
return { previousData, userContext };
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
return { userContext: undefined };
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
mutationConfig.onError = (error, variables, context) => {
|
|
57
|
+
if (context?.previousData !== undefined) {
|
|
58
|
+
queryClient.setQueryData(optimistic.queryKey, context.previousData);
|
|
59
|
+
}
|
|
60
|
+
if (optimistic.rollback && context?.previousData !== undefined) {
|
|
61
|
+
try {
|
|
62
|
+
optimistic.rollback(context.previousData, error);
|
|
63
|
+
}
|
|
64
|
+
catch { }
|
|
65
|
+
}
|
|
66
|
+
if (onError) {
|
|
67
|
+
const errorCallback = onError;
|
|
68
|
+
errorCallback(error, variables, context?.userContext);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
mutationConfig.onSuccess = (data, variables, context) => {
|
|
72
|
+
queryClient.invalidateQueries({ queryKey: optimistic.queryKey });
|
|
73
|
+
if (onSuccess) {
|
|
74
|
+
const successCallback = onSuccess;
|
|
75
|
+
successCallback(data, variables, context?.userContext);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
mutationConfig.onSettled = (data, error, variables, context) => {
|
|
79
|
+
if (onSettled) {
|
|
80
|
+
const settledCallback = onSettled;
|
|
81
|
+
settledCallback(data, error, variables, context?.userContext);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return useTanStackMutation(mutationConfig);
|
|
86
|
+
}
|
|
87
|
+
export function setupMutationDefaults(queryClient, config) {
|
|
88
|
+
Object.entries(config).forEach(([key, options]) => { queryClient.setMutationDefaults([key], options); });
|
|
89
|
+
}
|
|
90
|
+
export function useListMutation(mutationFn, queryKey, options) {
|
|
91
|
+
const queryClient = useQueryClient();
|
|
92
|
+
return useTanStackMutation({ mutationFn, onSettled: () => { queryClient.invalidateQueries({ queryKey }); }, ...options, mutationKey: options?.mutationKey });
|
|
93
|
+
}
|
|
94
|
+
export function useBatchMutation(mutationFn, options) {
|
|
95
|
+
return useTanStackMutation({ mutationFn, ...options, mutationKey: options?.mutationKey });
|
|
96
|
+
}
|
|
97
|
+
export function useConditionalOptimisticMutation(mutationFn, condition, options) {
|
|
98
|
+
const queryClient = useQueryClient();
|
|
99
|
+
const { mutationKey, optimistic, onMutate, onError, onSettled, onSuccess } = options || {};
|
|
100
|
+
const mutationConfig = { mutationKey, mutationFn };
|
|
101
|
+
if (optimistic) {
|
|
102
|
+
mutationConfig.onMutate = async (variables) => {
|
|
103
|
+
const conditionMet = condition(variables);
|
|
104
|
+
if (!conditionMet || optimistic.enabled === false) {
|
|
105
|
+
const mutateCallback = onMutate;
|
|
106
|
+
const userContext = onMutate ? await mutateCallback(variables) : undefined;
|
|
107
|
+
return { userContext, conditionMet: false };
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
await queryClient.cancelQueries({ queryKey: optimistic.queryKey });
|
|
111
|
+
const previousData = queryClient.getQueryData(optimistic.queryKey);
|
|
112
|
+
queryClient.setQueryData(optimistic.queryKey, (oldData) => optimistic.updater(oldData, variables));
|
|
113
|
+
const mutateCallback = onMutate;
|
|
114
|
+
const userContext = onMutate ? await mutateCallback(variables) : undefined;
|
|
115
|
+
return { previousData, userContext, conditionMet: true };
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return { userContext: undefined, conditionMet: false };
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
mutationConfig.onError = (error, variables, context) => {
|
|
122
|
+
if (context?.conditionMet && context?.previousData !== undefined) {
|
|
123
|
+
queryClient.setQueryData(optimistic.queryKey, context.previousData);
|
|
124
|
+
if (optimistic.rollback) {
|
|
125
|
+
try {
|
|
126
|
+
optimistic.rollback(context.previousData, error);
|
|
127
|
+
}
|
|
128
|
+
catch { }
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (onError) {
|
|
132
|
+
const errorCallback = onError;
|
|
133
|
+
errorCallback(error, variables, context?.userContext);
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
mutationConfig.onSuccess = (data, variables, context) => {
|
|
137
|
+
if (onSuccess) {
|
|
138
|
+
const successCallback = onSuccess;
|
|
139
|
+
successCallback(data, variables, context?.userContext);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
mutationConfig.onSettled = (data, error, variables, context) => {
|
|
143
|
+
if (context?.conditionMet) {
|
|
144
|
+
queryClient.invalidateQueries({ queryKey: optimistic.queryKey });
|
|
145
|
+
}
|
|
146
|
+
if (onSettled) {
|
|
147
|
+
const settledCallback = onSettled;
|
|
148
|
+
settledCallback(data, error, variables, context?.userContext);
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
if (onMutate) {
|
|
154
|
+
mutationConfig.onMutate = async (variables) => { const mutateCallback = onMutate; const userContext = await mutateCallback(variables); return { userContext, conditionMet: false }; };
|
|
155
|
+
}
|
|
156
|
+
if (onError) {
|
|
157
|
+
mutationConfig.onError = (error, variables, context) => { const errorCallback = onError; errorCallback(error, variables, context?.userContext); };
|
|
158
|
+
}
|
|
159
|
+
if (onSuccess) {
|
|
160
|
+
mutationConfig.onSuccess = (data, variables, context) => { const successCallback = onSuccess; successCallback(data, variables, context?.userContext); };
|
|
161
|
+
}
|
|
162
|
+
if (onSettled) {
|
|
163
|
+
mutationConfig.onSettled = (data, error, variables, context) => { const settledCallback = onSettled; settledCallback(data, error, variables, context?.userContext); };
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return useTanStackMutation(mutationConfig);
|
|
167
|
+
}
|
|
168
|
+
export async function cancelQueriesBatch(queryClient, queryKeys) {
|
|
169
|
+
await Promise.all(queryKeys.map((queryKey) => queryClient.cancelQueries(queryKey)));
|
|
170
|
+
}
|
|
171
|
+
export function setQueryDataBatch(queryClient, updates) {
|
|
172
|
+
updates.forEach(({ queryKey, updater }) => { queryClient.setQueryData(queryKey, updater); });
|
|
173
|
+
}
|
|
174
|
+
export async function invalidateQueriesBatch(queryClient, queryKeys) {
|
|
175
|
+
await Promise.all(queryKeys.map((queryKey) => queryClient.invalidateQueries(queryKey)));
|
|
176
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { QueryFunction, QueryKey } from "@tanstack/react-query";
|
|
2
|
+
export interface PrefetchOptions {
|
|
3
|
+
delay?: number;
|
|
4
|
+
enabled?: boolean;
|
|
5
|
+
staleTime?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface HoverPrefetchOptions extends PrefetchOptions {
|
|
8
|
+
hoverDelay?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface InViewPrefetchOptions extends PrefetchOptions {
|
|
11
|
+
threshold?: number;
|
|
12
|
+
rootMargin?: string;
|
|
13
|
+
triggerOnce?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function useHoverPrefetch<TData = unknown>(queryKey: QueryKey, queryFn: QueryFunction<TData>, options?: HoverPrefetchOptions): {
|
|
16
|
+
onMouseEnter: () => void;
|
|
17
|
+
onMouseLeave: () => void;
|
|
18
|
+
onFocus: () => void;
|
|
19
|
+
};
|
|
20
|
+
export declare function useInViewPrefetch<TData = unknown>(queryKey: QueryKey, queryFn: QueryFunction<TData>, options?: InViewPrefetchOptions): (node?: Element | null) => void;
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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;AAOrE,MAAM,WAAW,eAAe;IAAG,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE;AAC1F,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;AAEjI,wBAAgB,gBAAgB,CAAC,KAAK,GAAG,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,GAAE,oBAAyB;;;;EAkBtI;AAED,wBAAgB,iBAAiB,CAAC,KAAK,GAAG,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,GAAE,qBAA0B,mCAcxI;AAED,wBAAgB,gBAAgB,KAEV,KAAK,sBAAsB,QAAQ,WAAW,aAAa,CAAC,KAAK,CAAC,YAAY,eAAe,UAKlH;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,UAK/H;AAED,wBAAgB,gBAAgB;eASA,KAAK,sBAAsB,QAAQ,WAAW,aAAa,CAAC,KAAK,CAAC,YAAY,eAAe;;;EAS5H;AAED,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,QAcvJ;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,QAoBnJ;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,QAgBxJ;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"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { useQueryClient } from "@tanstack/react-query";
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
3
|
+
import { useInView } from "react-intersection-observer";
|
|
4
|
+
import { DEFAULT_STALE_TIME } from "../core/config.js";
|
|
5
|
+
import { isSlowNetwork } from "../utils/network.js";
|
|
6
|
+
export function useHoverPrefetch(queryKey, queryFn, options = {}) {
|
|
7
|
+
const queryClient = useQueryClient();
|
|
8
|
+
const timeoutRef = useRef(undefined);
|
|
9
|
+
const { hoverDelay = 200, enabled = true, staleTime = DEFAULT_STALE_TIME } = options;
|
|
10
|
+
const queryFnRef = useRef(queryFn);
|
|
11
|
+
useEffect(() => { queryFnRef.current = queryFn; }, [queryFn]);
|
|
12
|
+
const prefetch = useCallback(() => {
|
|
13
|
+
if (!enabled)
|
|
14
|
+
return;
|
|
15
|
+
queryClient.prefetchQuery({ queryKey, queryFn: queryFnRef.current, staleTime });
|
|
16
|
+
}, [queryClient, queryKey, enabled, staleTime]);
|
|
17
|
+
const handleMouseEnter = useCallback(() => {
|
|
18
|
+
if (!enabled)
|
|
19
|
+
return;
|
|
20
|
+
if (timeoutRef.current) {
|
|
21
|
+
clearTimeout(timeoutRef.current);
|
|
22
|
+
}
|
|
23
|
+
timeoutRef.current = setTimeout(prefetch, hoverDelay);
|
|
24
|
+
}, [prefetch, hoverDelay, enabled]);
|
|
25
|
+
const handleMouseLeave = useCallback(() => { if (timeoutRef.current) {
|
|
26
|
+
clearTimeout(timeoutRef.current);
|
|
27
|
+
} }, []);
|
|
28
|
+
useEffect(() => () => { if (timeoutRef.current) {
|
|
29
|
+
clearTimeout(timeoutRef.current);
|
|
30
|
+
} }, []);
|
|
31
|
+
return { onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, onFocus: prefetch };
|
|
32
|
+
}
|
|
33
|
+
export function useInViewPrefetch(queryKey, queryFn, options = {}) {
|
|
34
|
+
const queryClient = useQueryClient();
|
|
35
|
+
const { threshold = 0.1, rootMargin = "50px", triggerOnce = true, enabled = true, staleTime = DEFAULT_STALE_TIME } = options;
|
|
36
|
+
const [ref, inView] = useInView({ threshold, rootMargin, triggerOnce });
|
|
37
|
+
const queryFnRef = useRef(queryFn);
|
|
38
|
+
useEffect(() => { queryFnRef.current = queryFn; }, [queryFn]);
|
|
39
|
+
const stableQueryKey = useRef(queryKey);
|
|
40
|
+
useEffect(() => { if (JSON.stringify(stableQueryKey.current) !== JSON.stringify(queryKey)) {
|
|
41
|
+
stableQueryKey.current = queryKey;
|
|
42
|
+
} }, [queryKey]);
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
if (inView && enabled) {
|
|
45
|
+
queryClient.prefetchQuery({ queryKey: stableQueryKey.current, queryFn: queryFnRef.current, staleTime });
|
|
46
|
+
}
|
|
47
|
+
}, [inView, queryClient, enabled, staleTime]);
|
|
48
|
+
return ref;
|
|
49
|
+
}
|
|
50
|
+
export function useRoutePrefetch() {
|
|
51
|
+
const queryClient = useQueryClient();
|
|
52
|
+
return useCallback((queryKey, queryFn, options) => {
|
|
53
|
+
const { enabled = true, staleTime = DEFAULT_STALE_TIME } = options || {};
|
|
54
|
+
if (!enabled)
|
|
55
|
+
return;
|
|
56
|
+
queryClient.prefetchQuery({ queryKey, queryFn, staleTime });
|
|
57
|
+
}, [queryClient]);
|
|
58
|
+
}
|
|
59
|
+
export function useBatchPrefetch() {
|
|
60
|
+
const queryClient = useQueryClient();
|
|
61
|
+
return useCallback((queries) => {
|
|
62
|
+
queries.forEach(({ queryKey, queryFn, staleTime = DEFAULT_STALE_TIME }) => {
|
|
63
|
+
queryClient.prefetchQuery({ queryKey, queryFn, staleTime });
|
|
64
|
+
});
|
|
65
|
+
}, [queryClient]);
|
|
66
|
+
}
|
|
67
|
+
export function useSmartPrefetch() {
|
|
68
|
+
const queryClient = useQueryClient();
|
|
69
|
+
const prefetchedRef = useRef(new Set());
|
|
70
|
+
const shouldPrefetchQuery = useCallback((queryKey) => {
|
|
71
|
+
const key = JSON.stringify(queryKey);
|
|
72
|
+
if (prefetchedRef.current.has(key))
|
|
73
|
+
return false;
|
|
74
|
+
if (isSlowNetwork())
|
|
75
|
+
return false;
|
|
76
|
+
return true;
|
|
77
|
+
}, []);
|
|
78
|
+
const prefetch = useCallback((queryKey, queryFn, options) => {
|
|
79
|
+
if (!shouldPrefetchQuery(queryKey))
|
|
80
|
+
return;
|
|
81
|
+
const { staleTime = DEFAULT_STALE_TIME } = options || {};
|
|
82
|
+
const key = JSON.stringify(queryKey);
|
|
83
|
+
prefetchedRef.current.add(key);
|
|
84
|
+
queryClient.prefetchQuery({ queryKey, queryFn, staleTime });
|
|
85
|
+
}, [queryClient, shouldPrefetchQuery]);
|
|
86
|
+
const clearPrefetchHistory = useCallback(() => { prefetchedRef.current.clear(); }, []);
|
|
87
|
+
return { prefetch, shouldPrefetch: !isSlowNetwork(), clearPrefetchHistory };
|
|
88
|
+
}
|
|
89
|
+
export function useConditionalPrefetch(queryKey, queryFn, condition, options) {
|
|
90
|
+
const queryClient = useQueryClient();
|
|
91
|
+
const { staleTime = DEFAULT_STALE_TIME, delay = 0 } = options || {};
|
|
92
|
+
const queryFnRef = useRef(queryFn);
|
|
93
|
+
useEffect(() => { queryFnRef.current = queryFn; }, [queryFn]);
|
|
94
|
+
const stableQueryKey = useRef(queryKey);
|
|
95
|
+
useEffect(() => { if (JSON.stringify(stableQueryKey.current) !== JSON.stringify(queryKey)) {
|
|
96
|
+
stableQueryKey.current = queryKey;
|
|
97
|
+
} }, [queryKey]);
|
|
98
|
+
useEffect(() => {
|
|
99
|
+
if (!condition)
|
|
100
|
+
return;
|
|
101
|
+
const timeoutId = setTimeout(() => {
|
|
102
|
+
queryClient.prefetchQuery({ queryKey: stableQueryKey.current, queryFn: queryFnRef.current, staleTime });
|
|
103
|
+
}, delay);
|
|
104
|
+
return () => clearTimeout(timeoutId);
|
|
105
|
+
}, [condition, queryClient, staleTime, delay]);
|
|
106
|
+
}
|
|
107
|
+
export function useIdlePrefetch(queryKey, queryFn, options) {
|
|
108
|
+
const queryClient = useQueryClient();
|
|
109
|
+
const { staleTime = DEFAULT_STALE_TIME, enabled = true, timeout = 1000 } = options || {};
|
|
110
|
+
const queryFnRef = useRef(queryFn);
|
|
111
|
+
useEffect(() => { queryFnRef.current = queryFn; }, [queryFn]);
|
|
112
|
+
const stableQueryKey = useRef(queryKey);
|
|
113
|
+
useEffect(() => { if (JSON.stringify(stableQueryKey.current) !== JSON.stringify(queryKey)) {
|
|
114
|
+
stableQueryKey.current = queryKey;
|
|
115
|
+
} }, [queryKey]);
|
|
116
|
+
useEffect(() => {
|
|
117
|
+
if (!enabled)
|
|
118
|
+
return;
|
|
119
|
+
if (typeof window === "undefined" || !("requestIdleCallback" in window)) {
|
|
120
|
+
const timeoutId = setTimeout(() => {
|
|
121
|
+
queryClient.prefetchQuery({ queryKey: stableQueryKey.current, queryFn: queryFnRef.current, staleTime });
|
|
122
|
+
}, timeout);
|
|
123
|
+
return () => clearTimeout(timeoutId);
|
|
124
|
+
}
|
|
125
|
+
const idleCallbackId = window.requestIdleCallback(() => {
|
|
126
|
+
queryClient.prefetchQuery({ queryKey: stableQueryKey.current, queryFn: queryFnRef.current, staleTime });
|
|
127
|
+
}, { timeout });
|
|
128
|
+
return () => window.cancelIdleCallback(idleCallbackId);
|
|
129
|
+
}, [queryClient, staleTime, enabled, timeout]);
|
|
130
|
+
}
|
|
131
|
+
export function usePeriodicPrefetch(queryKey, queryFn, options) {
|
|
132
|
+
const queryClient = useQueryClient();
|
|
133
|
+
const { staleTime = DEFAULT_STALE_TIME, enabled = true, interval = 60000 } = options || {};
|
|
134
|
+
const queryFnRef = useRef(queryFn);
|
|
135
|
+
useEffect(() => { queryFnRef.current = queryFn; }, [queryFn]);
|
|
136
|
+
const stableQueryKey = useRef(queryKey);
|
|
137
|
+
useEffect(() => { if (JSON.stringify(stableQueryKey.current) !== JSON.stringify(queryKey)) {
|
|
138
|
+
stableQueryKey.current = queryKey;
|
|
139
|
+
} }, [queryKey]);
|
|
140
|
+
useEffect(() => {
|
|
141
|
+
if (!enabled)
|
|
142
|
+
return;
|
|
143
|
+
const prefetchData = () => {
|
|
144
|
+
queryClient.prefetchQuery({ queryKey: stableQueryKey.current, queryFn: queryFnRef.current, staleTime });
|
|
145
|
+
};
|
|
146
|
+
prefetchData();
|
|
147
|
+
const intervalId = setInterval(prefetchData, interval);
|
|
148
|
+
return () => clearInterval(intervalId);
|
|
149
|
+
}, [queryClient, staleTime, enabled, interval]);
|
|
150
|
+
}
|
|
151
|
+
export function usePredictivePrefetch() {
|
|
152
|
+
const queryClient = useQueryClient();
|
|
153
|
+
const interactionHistoryRef = useRef([]);
|
|
154
|
+
const maxHistorySize = 50;
|
|
155
|
+
const recordInteraction = useCallback((action, target) => {
|
|
156
|
+
interactionHistoryRef.current.push({ action, target, timestamp: Date.now() });
|
|
157
|
+
if (interactionHistoryRef.current.length > maxHistorySize) {
|
|
158
|
+
interactionHistoryRef.current.shift();
|
|
159
|
+
}
|
|
160
|
+
}, []);
|
|
161
|
+
const getPredictions = useCallback(() => {
|
|
162
|
+
const history = interactionHistoryRef.current;
|
|
163
|
+
if (history.length < 3)
|
|
164
|
+
return [];
|
|
165
|
+
const targetCounts = new Map();
|
|
166
|
+
history.forEach(({ target }) => { targetCounts.set(target, (targetCounts.get(target) || 0) + 1); });
|
|
167
|
+
return Array.from(targetCounts.entries()).sort((a, b) => b[1] - a[1]).slice(0, 5).map(([target]) => target);
|
|
168
|
+
}, []);
|
|
169
|
+
const prefetchPredicted = useCallback((getQueryConfig) => {
|
|
170
|
+
const predictions = getPredictions();
|
|
171
|
+
predictions.forEach((target) => {
|
|
172
|
+
const { queryKey, queryFn } = getQueryConfig(target);
|
|
173
|
+
queryClient.prefetchQuery({ queryKey, queryFn });
|
|
174
|
+
});
|
|
175
|
+
}, [queryClient, getPredictions]);
|
|
176
|
+
const clearHistory = useCallback(() => { interactionHistoryRef.current = []; }, []);
|
|
177
|
+
return { recordInteraction, getPredictions, prefetchPredicted, clearHistory };
|
|
178
|
+
}
|
|
179
|
+
export function usePriorityPrefetch() {
|
|
180
|
+
const queryClient = useQueryClient();
|
|
181
|
+
const tasksRef = useRef([]);
|
|
182
|
+
const [taskCount, setTaskCount] = useState(0);
|
|
183
|
+
const addPrefetchTask = useCallback((queryKey, queryFn, priority = "medium") => {
|
|
184
|
+
tasksRef.current.push({ queryKey, queryFn, priority, timestamp: Date.now() });
|
|
185
|
+
setTaskCount(tasksRef.current.length);
|
|
186
|
+
}, []);
|
|
187
|
+
const processTasks = useCallback(async () => {
|
|
188
|
+
const priorityOrder = { high: 0, medium: 1, low: 2 };
|
|
189
|
+
const sortedTasks = [...tasksRef.current].sort((a, b) => {
|
|
190
|
+
const priorityDiff = priorityOrder[a.priority] - priorityOrder[b.priority];
|
|
191
|
+
if (priorityDiff !== 0)
|
|
192
|
+
return priorityDiff;
|
|
193
|
+
return a.timestamp - b.timestamp;
|
|
194
|
+
});
|
|
195
|
+
for (const task of sortedTasks) {
|
|
196
|
+
await queryClient.prefetchQuery({ queryKey: task.queryKey, queryFn: task.queryFn });
|
|
197
|
+
}
|
|
198
|
+
tasksRef.current = [];
|
|
199
|
+
setTaskCount(0);
|
|
200
|
+
}, [queryClient]);
|
|
201
|
+
const clearTasks = useCallback(() => { tasksRef.current = []; setTaskCount(0); }, []);
|
|
202
|
+
return { addPrefetchTask, processTasks, clearTasks, taskCount };
|
|
203
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { QueryKey, UseQueryOptions, UseQueryResult } from "@tanstack/react-query";
|
|
2
|
+
import { skipToken } from "@tanstack/react-query";
|
|
3
|
+
export declare function useEnhancedQuery<TQueryFnData = unknown, TError = Error, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(options: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>): UseQueryResult<TData, TError>;
|
|
4
|
+
export { skipToken };
|
|
5
|
+
//# sourceMappingURL=useQuery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../../src/hooks/useQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAAE,SAAS,EAAY,MAAM,uBAAuB,CAAC;AAC5D,wBAAgB,gBAAgB,CAAC,YAAY,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,KAAK,GAAG,YAAY,EAAE,SAAS,SAAS,QAAQ,GAAG,QAAQ,EAAE,OAAO,EAAE,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAErO;AACD,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { 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 = Error, 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 = Error, 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 = Error, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(options: UseSuspenseQueryOptions<TQueryFnData, TError, TData, TQueryKey>): UseSuspenseQueryResult<TData, TError>;
|
|
9
|
+
export declare function useEnhancedSuspenseInfiniteQuery<TQueryFnData = unknown, TError = Error, 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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSuspenseQuery.d.ts","sourceRoot":"","sources":["../../src/hooks/useSuspenseQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,QAAQ,EAAE,+BAA+B,EAAE,8BAA8B,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE7M,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,KAAK,EAAE,KAAK,GAAG,YAAY,EAAE,SAAS,SAAS,QAAQ,GAAG,QAAQ,EAAE,UAAU,GAAG,IAAI,EACxJ,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,KAAK,EAAE,KAAK,GAAG,YAAY,EAAE,SAAS,SAAS,QAAQ,GAAG,QAAQ,EAAE,UAAU,GAAG,OAAO,EAAE,UAAU,GAAG,IAAI,EACtL,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,KAAK,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,CAE7P;AACD,wBAAgB,gCAAgC,CAAC,YAAY,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK,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,CAEvT"}
|
|
@@ -0,0 +1,19 @@
|
|
|
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
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from "./components/index.js";
|
|
2
|
+
export * from "./core/index.js";
|
|
3
|
+
export * from "./hooks/index.js";
|
|
4
|
+
export { PersistQueryClientProvider, type PersistQueryClientProviderProps } from "./PersistQueryClientProvider.js";
|
|
5
|
+
export * from "./types/index.js";
|
|
6
|
+
export * from "./utils/index.js";
|
|
7
|
+
export { QueryClient, QueryClientProvider, skipToken, useQueryClient } from "@tanstack/react-query";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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,KAAK,+BAA+B,EAAE,MAAM,iCAAiC,CAAC;AACnH,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from "./components/index.js";
|
|
2
|
+
export * from "./core/index.js";
|
|
3
|
+
export * from "./hooks/index.js";
|
|
4
|
+
export { PersistQueryClientProvider } from "./PersistQueryClientProvider.js";
|
|
5
|
+
export * from "./types/index.js";
|
|
6
|
+
export * from "./utils/index.js";
|
|
7
|
+
export { QueryClient, QueryClientProvider, skipToken, useQueryClient } from "@tanstack/react-query";
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { QueryClient } from "@tanstack/react-query";
|
|
2
|
+
import type { PersistedClient, Persister } from "@tanstack/react-query-persist-client";
|
|
3
|
+
export declare enum StorageType {
|
|
4
|
+
LOCAL = "localStorage",
|
|
5
|
+
SESSION = "sessionStorage",
|
|
6
|
+
INDEXED_DB = "indexedDB",
|
|
7
|
+
CUSTOM = "custom"
|
|
8
|
+
}
|
|
9
|
+
export declare enum ConnectionQuality {
|
|
10
|
+
SLOW = "slow",
|
|
11
|
+
FAST = "fast",
|
|
12
|
+
UNKNOWN = "unknown"
|
|
13
|
+
}
|
|
14
|
+
export declare enum CachePriority {
|
|
15
|
+
HIGH = "high",
|
|
16
|
+
MEDIUM = "medium",
|
|
17
|
+
LOW = "low"
|
|
18
|
+
}
|
|
19
|
+
export declare enum PersistenceStrategyType {
|
|
20
|
+
AGGRESSIVE = "aggressive",
|
|
21
|
+
CONSERVATIVE = "conservative",
|
|
22
|
+
SELECTIVE = "selective",
|
|
23
|
+
CUSTOM = "custom"
|
|
24
|
+
}
|
|
25
|
+
export interface OperationResult<T = unknown> {
|
|
26
|
+
success: boolean;
|
|
27
|
+
data?: T;
|
|
28
|
+
error?: Error;
|
|
29
|
+
duration?: number;
|
|
30
|
+
metadata?: Record<string, unknown>;
|
|
31
|
+
}
|
|
32
|
+
export interface NetworkInformation {
|
|
33
|
+
effectiveType?: "4g" | "3g" | "2g" | "slow-2g";
|
|
34
|
+
saveData?: boolean;
|
|
35
|
+
downlink?: number;
|
|
36
|
+
rtt?: number;
|
|
37
|
+
}
|
|
38
|
+
export interface NetworkStatus {
|
|
39
|
+
isOnline: boolean;
|
|
40
|
+
isOffline: boolean;
|
|
41
|
+
connectionQuality: ConnectionQuality;
|
|
42
|
+
connection?: NetworkInformation;
|
|
43
|
+
lastOnlineAt?: Date;
|
|
44
|
+
lastOfflineAt?: Date;
|
|
45
|
+
}
|
|
46
|
+
export type DeepReadonly<T> = {
|
|
47
|
+
readonly [P in keyof T]: T[P] extends object ? DeepReadonly<T[P]> : T[P];
|
|
48
|
+
};
|
|
49
|
+
export type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
|
|
50
|
+
export type Required<T, K extends keyof T> = T & {
|
|
51
|
+
[P in K]-?: T[P];
|
|
52
|
+
};
|
|
53
|
+
export type { PersistedClient, Persister, QueryClient };
|
|
54
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
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 = {}));
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { QueryKey, UseMutationOptions } from "@tanstack/react-query";
|
|
2
|
+
export * from "./base.js";
|
|
3
|
+
export * from "./infinite.js";
|
|
4
|
+
export * from "./offline.js";
|
|
5
|
+
export * from "./optimistic.js";
|
|
6
|
+
export * from "./persistence.js";
|
|
7
|
+
export * from "./selectors.js";
|
|
8
|
+
export * from "./suspense.js";
|
|
9
|
+
export interface MutationContext<TData = unknown, TContext = unknown> {
|
|
10
|
+
previousData?: TData;
|
|
11
|
+
userContext?: TContext;
|
|
12
|
+
conditionMet?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface MutationOptions<TData, TError, TVariables, TContext = unknown> extends UseMutationOptions<TData, TError, TVariables, TContext> {
|
|
15
|
+
optimistic?: {
|
|
16
|
+
queryKey: QueryKey;
|
|
17
|
+
updater: <TQueryData = unknown>(oldData: TQueryData | undefined, variables: TVariables) => TQueryData | undefined;
|
|
18
|
+
enabled?: boolean;
|
|
19
|
+
fieldMapping?: Record<string, string>;
|
|
20
|
+
rollback?: <TQueryData = unknown>(previousData: TQueryData, error: Error) => void;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,MAAM,WAAW,eAAe,CAAC,KAAK,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO;IAAI,YAAY,CAAC,EAAE,KAAK,CAAC;IAAC,WAAW,CAAC,EAAE,QAAQ,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE;AAC9I,MAAM,WAAW,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,GAAG,OAAO,CAAE,SAAQ,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC;IAC7I,UAAU,CAAC,EAAE;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,OAAO,EAAE,CAAC,UAAU,GAAG,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG,SAAS,EAAE,SAAS,EAAE,UAAU,KAAK,UAAU,GAAG,SAAS,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,GAAG,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;KAAE,CAAC;CACrS"}
|