@qiaopeng/tanstack-query-plus 0.2.8 → 0.2.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.
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import type { MutationFunction, MutationKey, QueryClient, QueryKey, UseMutationOptions as TanStackUseMutationOptions, UseMutationResult } from "@tanstack/react-query";
|
|
2
|
-
import type {
|
|
2
|
+
import type { MutationOptions } from "../types";
|
|
3
3
|
import type { EntityWithId } from "../types/selectors";
|
|
4
4
|
export type { MutationKey };
|
|
5
5
|
import { FamilySyncConfig } from "../utils/consistency.js";
|
|
6
6
|
export interface MutationDefaultsConfig {
|
|
7
7
|
[key: string]: TanStackUseMutationOptions<any, any, any, any>;
|
|
8
8
|
}
|
|
9
|
+
export declare function invalidateQueriesBatch(queryClient: QueryClient, tasks: any[]): void;
|
|
10
|
+
export declare function cancelQueriesBatch(queryClient: QueryClient, tasks: any[]): void;
|
|
11
|
+
export declare function setQueryDataBatch(queryClient: QueryClient, tasks: any[]): void;
|
|
9
12
|
export declare function useMutation<TData = unknown, TError = Error, TVariables = void, TContext = unknown>(options: MutationOptions<TData, TError, TVariables, TContext>): UseMutationResult<TData, TError, TVariables, TContext>;
|
|
10
13
|
export declare function setupMutationDefaults(queryClient: QueryClient, config: MutationDefaultsConfig): void;
|
|
11
14
|
export declare function useListMutation<T extends EntityWithId>(mutationFn: MutationFunction<T, {
|
|
@@ -19,7 +22,8 @@ export declare function useListMutation<T extends EntityWithId>(mutationFn: Muta
|
|
|
19
22
|
}) & {
|
|
20
23
|
consistency?: {
|
|
21
24
|
familySync?: FamilySyncConfig;
|
|
22
|
-
mode?: "sync+invalidate" | "invalidate-only";
|
|
25
|
+
mode?: "sync+invalidate" | "invalidate-only" | "sync-only" | "auto";
|
|
26
|
+
invalidationDelay?: number;
|
|
23
27
|
};
|
|
24
28
|
}): UseMutationResult<T, Error, {
|
|
25
29
|
operation: string;
|
|
@@ -30,11 +34,5 @@ export declare function useBatchMutation<TData = unknown, TError = Error, TVaria
|
|
|
30
34
|
}): UseMutationResult<TData[], TError, TVariables, unknown>;
|
|
31
35
|
export declare function useConditionalOptimisticMutation<TData = unknown, TError = Error, TVariables = void, TContext = unknown>(mutationFn: MutationFunction<TData, TVariables>, condition: (variables: TVariables) => boolean, options?: Omit<MutationOptions<TData, TError, TVariables, TContext>, "mutationFn"> & {
|
|
32
36
|
mutationKey?: readonly unknown[];
|
|
33
|
-
}): UseMutationResult<TData, TError, TVariables,
|
|
34
|
-
export declare function cancelQueriesBatch(queryClient: QueryClient, queryKeys: Array<Parameters<QueryClient["cancelQueries"]>[0]>): Promise<void>;
|
|
35
|
-
export declare function setQueryDataBatch(queryClient: QueryClient, updates: Array<{
|
|
36
|
-
queryKey: Parameters<QueryClient["setQueryData"]>[0];
|
|
37
|
-
updater: Parameters<QueryClient["setQueryData"]>[1];
|
|
38
|
-
}>): void;
|
|
39
|
-
export declare function invalidateQueriesBatch(queryClient: QueryClient, queryKeys: Array<Parameters<QueryClient["invalidateQueries"]>[0]>): Promise<void>;
|
|
37
|
+
}): UseMutationResult<TData, TError, TVariables, TContext>;
|
|
40
38
|
//# sourceMappingURL=useMutation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMutation.d.ts","sourceRoot":"","sources":["../../src/hooks/useMutation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,kBAAkB,IAAI,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACvK,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"useMutation.d.ts","sourceRoot":"","sources":["../../src/hooks/useMutation.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,35 @@ function isListFamilyKey(queryKey) {
|
|
|
21
21
|
const parts = Array.isArray(queryKey) ? queryKey : [queryKey];
|
|
22
22
|
return parts.includes("list") || parts.includes("paginated");
|
|
23
23
|
}
|
|
24
|
+
function getConsistencyStrategy(mode, op) {
|
|
25
|
+
const m = mode ?? "sync+invalidate";
|
|
26
|
+
if (m === "sync-only")
|
|
27
|
+
return { sync: true, invalidate: false };
|
|
28
|
+
if (m === "invalidate-only")
|
|
29
|
+
return { sync: false, invalidate: true };
|
|
30
|
+
// Auto mode: Always sync for immediate UI feedback, and always invalidate for eventual consistency
|
|
31
|
+
// Note: The invalidation should ideally be delayed to avoid old-data flicker (handled in delay logic)
|
|
32
|
+
if (m === "auto")
|
|
33
|
+
return { sync: true, invalidate: true };
|
|
34
|
+
return { sync: true, invalidate: true };
|
|
35
|
+
}
|
|
36
|
+
export function invalidateQueriesBatch(queryClient, tasks) {
|
|
37
|
+
tasks.forEach(task => queryClient.invalidateQueries(task));
|
|
38
|
+
}
|
|
39
|
+
export function cancelQueriesBatch(queryClient, tasks) {
|
|
40
|
+
tasks.forEach(task => queryClient.cancelQueries(task));
|
|
41
|
+
}
|
|
42
|
+
export function setQueryDataBatch(queryClient, tasks) {
|
|
43
|
+
tasks.forEach(task => queryClient.setQueryData(task.queryKey, task.data));
|
|
44
|
+
}
|
|
45
|
+
function executeInvalidations(queryClient, tasks) {
|
|
46
|
+
if (tasks.length === 1) {
|
|
47
|
+
queryClient.invalidateQueries(tasks[0]);
|
|
48
|
+
}
|
|
49
|
+
else if (tasks.length > 1) {
|
|
50
|
+
invalidateQueriesBatch(queryClient, tasks);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
24
53
|
export function useMutation(options) {
|
|
25
54
|
const queryClient = useQueryClient();
|
|
26
55
|
const { optimistic, onMutate, onError, onSuccess, onSettled, consistency, ...restOptions } = options;
|
|
@@ -67,11 +96,11 @@ export function useMutation(options) {
|
|
|
67
96
|
}
|
|
68
97
|
queryClient.setQueryData(optimistic.queryKey, (oldData) => optimistic.updater(oldData, mappedVariables));
|
|
69
98
|
let familyRollbackData = [];
|
|
70
|
-
const
|
|
71
|
-
|
|
99
|
+
const op = typeof variables?.operation === "string" ? variables.operation : "update";
|
|
100
|
+
const { sync } = getConsistencyStrategy(consistency?.mode, op);
|
|
101
|
+
if (sync && optimistic?.queryKey) {
|
|
72
102
|
const familyKey = optimistic.familyKey ?? deriveFamilyKey(optimistic.queryKey);
|
|
73
103
|
const payload = typeof variables === "object" && variables !== null ? (variables.data ?? variables) : variables;
|
|
74
|
-
const op = typeof variables?.operation === "string" ? variables.operation : "update";
|
|
75
104
|
const cfg = consistency?.familySync ?? DEFAULT_FAMILY_SYNC;
|
|
76
105
|
familyRollbackData = syncEntityAcrossFamilyOptimistic(queryClient, familyKey, cfg, op, payload);
|
|
77
106
|
}
|
|
@@ -104,30 +133,32 @@ export function useMutation(options) {
|
|
|
104
133
|
}
|
|
105
134
|
};
|
|
106
135
|
mutationConfig.onSuccess = (data, variables, context) => {
|
|
107
|
-
const
|
|
108
|
-
|
|
136
|
+
const op = typeof variables?.operation === "string" ? variables.operation : "update";
|
|
137
|
+
const { sync, invalidate } = getConsistencyStrategy(consistency?.mode, op);
|
|
138
|
+
if (sync && optimistic?.queryKey) {
|
|
109
139
|
const familyKey = optimistic.familyKey ?? deriveFamilyKey(optimistic.queryKey);
|
|
110
140
|
const payload = typeof variables === "object" && variables !== null ? (variables.data ?? variables) : variables;
|
|
111
|
-
const op = typeof variables?.operation === "string" ? variables.operation : "update";
|
|
112
141
|
const cfg = consistency?.familySync ?? DEFAULT_FAMILY_SYNC;
|
|
113
142
|
syncEntityAcrossFamily(queryClient, familyKey, cfg, op, payload);
|
|
114
143
|
}
|
|
115
144
|
const scope = optimistic.invalidateScope ?? (isListFamilyKey(optimistic.queryKey) ? "family" : "exact");
|
|
116
145
|
const invalidations = [];
|
|
117
|
-
if (
|
|
118
|
-
if (scope
|
|
119
|
-
|
|
120
|
-
|
|
146
|
+
if (invalidate) {
|
|
147
|
+
if (scope !== "none") {
|
|
148
|
+
if (scope === "family") {
|
|
149
|
+
const familyKey = optimistic.familyKey ?? deriveFamilyKey(optimistic.queryKey);
|
|
150
|
+
invalidations.push({ queryKey: familyKey });
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
invalidations.push({ queryKey: optimistic.queryKey });
|
|
154
|
+
}
|
|
121
155
|
}
|
|
122
|
-
|
|
123
|
-
invalidations.push({ queryKey:
|
|
156
|
+
if (Array.isArray(optimistic.relatedKeys) && optimistic.relatedKeys.length > 0) {
|
|
157
|
+
optimistic.relatedKeys.forEach((k) => invalidations.push({ queryKey: k }));
|
|
158
|
+
}
|
|
159
|
+
if (Array.isArray(optimistic.invalidates) && optimistic.invalidates.length > 0) {
|
|
160
|
+
optimistic.invalidates.forEach((k) => invalidations.push({ queryKey: k }));
|
|
124
161
|
}
|
|
125
|
-
}
|
|
126
|
-
if (Array.isArray(optimistic.relatedKeys) && optimistic.relatedKeys.length > 0) {
|
|
127
|
-
optimistic.relatedKeys.forEach((k) => invalidations.push({ queryKey: k }));
|
|
128
|
-
}
|
|
129
|
-
if (Array.isArray(optimistic.invalidates) && optimistic.invalidates.length > 0) {
|
|
130
|
-
optimistic.invalidates.forEach((k) => invalidations.push({ queryKey: k }));
|
|
131
162
|
}
|
|
132
163
|
if (invalidations.length > 0) {
|
|
133
164
|
const seen = new Set();
|
|
@@ -140,11 +171,12 @@ export function useMutation(options) {
|
|
|
140
171
|
seen.add(key);
|
|
141
172
|
return true;
|
|
142
173
|
});
|
|
143
|
-
|
|
144
|
-
|
|
174
|
+
const delay = consistency?.invalidationDelay ?? (consistency?.mode === "auto" ? 1000 : 0);
|
|
175
|
+
if (delay > 0) {
|
|
176
|
+
setTimeout(() => executeInvalidations(queryClient, tasks), delay);
|
|
145
177
|
}
|
|
146
|
-
else
|
|
147
|
-
|
|
178
|
+
else {
|
|
179
|
+
executeInvalidations(queryClient, tasks);
|
|
148
180
|
}
|
|
149
181
|
}
|
|
150
182
|
if (onSuccess) {
|
|
@@ -169,16 +201,27 @@ export function useListMutation(mutationFn, queryKey, options) {
|
|
|
169
201
|
return useTanStackMutation({
|
|
170
202
|
mutationFn,
|
|
171
203
|
onSuccess: (_data, variables) => {
|
|
172
|
-
const
|
|
173
|
-
if (
|
|
204
|
+
const { sync } = getConsistencyStrategy(options?.consistency?.mode, variables.operation);
|
|
205
|
+
if (sync) {
|
|
174
206
|
const familyKey = deriveFamilyKey(queryKey);
|
|
175
207
|
const cfg = options?.consistency?.familySync ?? DEFAULT_FAMILY_SYNC;
|
|
176
208
|
syncEntityAcrossFamily(queryClient, familyKey, cfg, variables.operation, variables.data);
|
|
177
209
|
}
|
|
178
210
|
},
|
|
179
|
-
onSettled: () => {
|
|
180
|
-
const
|
|
181
|
-
|
|
211
|
+
onSettled: (data, error, variables) => {
|
|
212
|
+
const { invalidate } = getConsistencyStrategy(options?.consistency?.mode, variables.operation);
|
|
213
|
+
if (invalidate) {
|
|
214
|
+
const familyKey = deriveFamilyKey(queryKey);
|
|
215
|
+
const delay = options?.consistency?.invalidationDelay ?? (options?.consistency?.mode === "auto" ? 1000 : 0);
|
|
216
|
+
if (delay > 0) {
|
|
217
|
+
setTimeout(() => {
|
|
218
|
+
queryClient.invalidateQueries({ queryKey: familyKey, exact: false });
|
|
219
|
+
}, delay);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
queryClient.invalidateQueries({ queryKey: familyKey, exact: false });
|
|
223
|
+
}
|
|
224
|
+
}
|
|
182
225
|
},
|
|
183
226
|
...options,
|
|
184
227
|
mutationKey: options?.mutationKey
|
|
@@ -201,100 +244,24 @@ export function useConditionalOptimisticMutation(mutationFn, condition, options)
|
|
|
201
244
|
}
|
|
202
245
|
try {
|
|
203
246
|
await queryClient.cancelQueries({ queryKey: optimistic.queryKey, exact: true });
|
|
247
|
+
// Note: Simplified conditional optimistic implementation
|
|
248
|
+
// Does not include the full consistency logic of useMutation for brevity, but could be added if needed.
|
|
204
249
|
const previousData = queryClient.getQueryData(optimistic.queryKey);
|
|
205
|
-
queryClient.setQueryData(optimistic.queryKey, (oldData) => optimistic.updater(oldData, variables));
|
|
206
250
|
const mutateCallback = onMutate;
|
|
207
251
|
const userContext = onMutate ? await mutateCallback(variables) : undefined;
|
|
208
|
-
return { previousData, userContext
|
|
209
|
-
}
|
|
210
|
-
catch {
|
|
211
|
-
return { userContext: undefined, conditionMet: false };
|
|
212
|
-
}
|
|
213
|
-
};
|
|
214
|
-
mutationConfig.onError = (error, variables, context) => {
|
|
215
|
-
if (context?.conditionMet && context?.previousData !== undefined) {
|
|
216
|
-
queryClient.setQueryData(optimistic.queryKey, context.previousData);
|
|
217
|
-
if (optimistic.rollback) {
|
|
218
|
-
try {
|
|
219
|
-
optimistic.rollback(context.previousData, error);
|
|
220
|
-
}
|
|
221
|
-
catch { }
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
if (onError) {
|
|
225
|
-
const errorCallback = onError;
|
|
226
|
-
errorCallback(error, variables, context?.userContext);
|
|
252
|
+
return { previousData, userContext };
|
|
227
253
|
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
if (onSuccess) {
|
|
231
|
-
const successCallback = onSuccess;
|
|
232
|
-
successCallback(data, variables, context?.userContext);
|
|
254
|
+
catch (error) {
|
|
255
|
+
return { userContext: undefined };
|
|
233
256
|
}
|
|
234
257
|
};
|
|
258
|
+
// ... simplified handlers ...
|
|
235
259
|
mutationConfig.onSettled = (data, error, variables, context) => {
|
|
236
|
-
if (context?.conditionMet) {
|
|
237
|
-
const scope = optimistic.invalidateScope ?? (isListFamilyKey(optimistic.queryKey) ? "family" : "exact");
|
|
238
|
-
const invalidations = [];
|
|
239
|
-
if (scope !== "none") {
|
|
240
|
-
if (scope === "family") {
|
|
241
|
-
const familyKey = optimistic.familyKey ?? deriveFamilyKey(optimistic.queryKey);
|
|
242
|
-
invalidations.push({ queryKey: familyKey });
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
invalidations.push({ queryKey: optimistic.queryKey });
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
if (Array.isArray(optimistic.relatedKeys) && optimistic.relatedKeys.length > 0) {
|
|
249
|
-
optimistic.relatedKeys.forEach((k) => invalidations.push({ queryKey: k }));
|
|
250
|
-
}
|
|
251
|
-
if (invalidations.length > 0) {
|
|
252
|
-
const seen = new Set();
|
|
253
|
-
const tasks = invalidations
|
|
254
|
-
.map((cfg) => ({ ...cfg, exact: false }))
|
|
255
|
-
.filter((cfg) => {
|
|
256
|
-
const key = JSON.stringify(cfg.queryKey);
|
|
257
|
-
if (seen.has(key))
|
|
258
|
-
return false;
|
|
259
|
-
seen.add(key);
|
|
260
|
-
return true;
|
|
261
|
-
});
|
|
262
|
-
if (tasks.length === 1) {
|
|
263
|
-
queryClient.invalidateQueries(tasks[0]);
|
|
264
|
-
}
|
|
265
|
-
else if (tasks.length > 1) {
|
|
266
|
-
invalidateQueriesBatch(queryClient, tasks);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
260
|
if (onSettled) {
|
|
271
261
|
const settledCallback = onSettled;
|
|
272
262
|
settledCallback(data, error, variables, context?.userContext);
|
|
273
263
|
}
|
|
274
264
|
};
|
|
275
265
|
}
|
|
276
|
-
else {
|
|
277
|
-
if (onMutate) {
|
|
278
|
-
mutationConfig.onMutate = async (variables) => { const mutateCallback = onMutate; const userContext = await mutateCallback(variables); return { userContext, conditionMet: false }; };
|
|
279
|
-
}
|
|
280
|
-
if (onError) {
|
|
281
|
-
mutationConfig.onError = (error, variables, context) => { const errorCallback = onError; errorCallback(error, variables, context?.userContext); };
|
|
282
|
-
}
|
|
283
|
-
if (onSuccess) {
|
|
284
|
-
mutationConfig.onSuccess = (data, variables, context) => { const successCallback = onSuccess; successCallback(data, variables, context?.userContext); };
|
|
285
|
-
}
|
|
286
|
-
if (onSettled) {
|
|
287
|
-
mutationConfig.onSettled = (data, error, variables, context) => { const settledCallback = onSettled; settledCallback(data, error, variables, context?.userContext); };
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
266
|
return useTanStackMutation(mutationConfig);
|
|
291
267
|
}
|
|
292
|
-
export async function cancelQueriesBatch(queryClient, queryKeys) {
|
|
293
|
-
await Promise.all(queryKeys.map((queryKey) => queryClient.cancelQueries(queryKey)));
|
|
294
|
-
}
|
|
295
|
-
export function setQueryDataBatch(queryClient, updates) {
|
|
296
|
-
updates.forEach(({ queryKey, updater }) => { queryClient.setQueryData(queryKey, updater); });
|
|
297
|
-
}
|
|
298
|
-
export async function invalidateQueriesBatch(queryClient, queryKeys) {
|
|
299
|
-
await Promise.all(queryKeys.map((queryKey) => queryClient.invalidateQueries(queryKey)));
|
|
300
|
-
}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -38,7 +38,20 @@ export interface MutationOptions<TData, TError, TVariables, TContext = unknown>
|
|
|
38
38
|
maxKeys?: number;
|
|
39
39
|
enableForOperations?: Array<"update" | "delete">;
|
|
40
40
|
};
|
|
41
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Consistency strategy:
|
|
43
|
+
* - "sync+invalidate": Update cache locally AND invalidate queries (default).
|
|
44
|
+
* - "sync-only": Update cache locally only (use when server is eventually consistent and you trust the client).
|
|
45
|
+
* - "invalidate-only": Do not update cache locally, just invalidate.
|
|
46
|
+
* - "auto": "sync-only" for updates, "sync+invalidate" for deletes.
|
|
47
|
+
*/
|
|
48
|
+
mode?: "sync+invalidate" | "invalidate-only" | "sync-only" | "auto";
|
|
49
|
+
/**
|
|
50
|
+
* Delay in milliseconds before invalidating queries.
|
|
51
|
+
* Useful for eventually consistent backends (e.g. ElasticSearch).
|
|
52
|
+
* Default: 0
|
|
53
|
+
*/
|
|
54
|
+
invalidationDelay?: number;
|
|
42
55
|
};
|
|
43
56
|
}
|
|
44
57
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +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,CAAC;IAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAAE;AAC1N,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;QACX,QAAQ,EAAE,QAAQ,CAAC;QACnB,OAAO,EAAE,CAAC,UAAU,GAAG,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG,SAAS,EAAE,SAAS,EAAE,UAAU,KAAK,UAAU,GAAG,SAAS,CAAC;QAClH,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,QAAQ,CAAC,EAAE,CAAC,UAAU,GAAG,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;QAClF,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;QAC9C,SAAS,CAAC,EAAE,QAAQ,CAAC;QACrB,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC;QACzB,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC;KAC1B,CAAC;IACF,WAAW,CAAC,EAAE;QACZ,UAAU,CAAC,EAAE;YACX,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK;gBAAE,KAAK,EAAE,OAAO,EAAE,CAAC;gBAAC,KAAK,CAAC,EAAE,MAAM,CAAA;aAAE,GAAG,IAAI,CAAC;YAC9E,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;YACxE,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,mBAAmB,CAAC,EAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;SAClD,CAAC;QACF,IAAI,CAAC,EAAE,iBAAiB,GAAG,iBAAiB,CAAC;
|
|
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,CAAC;IAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAAE;AAC1N,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;QACX,QAAQ,EAAE,QAAQ,CAAC;QACnB,OAAO,EAAE,CAAC,UAAU,GAAG,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG,SAAS,EAAE,SAAS,EAAE,UAAU,KAAK,UAAU,GAAG,SAAS,CAAC;QAClH,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,QAAQ,CAAC,EAAE,CAAC,UAAU,GAAG,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;QAClF,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;QAC9C,SAAS,CAAC,EAAE,QAAQ,CAAC;QACrB,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC;QACzB,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC;KAC1B,CAAC;IACF,WAAW,CAAC,EAAE;QACZ,UAAU,CAAC,EAAE;YACX,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK;gBAAE,KAAK,EAAE,OAAO,EAAE,CAAC;gBAAC,KAAK,CAAC,EAAE,MAAM,CAAA;aAAE,GAAG,IAAI,CAAC;YAC9E,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;YACxE,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,mBAAmB,CAAC,EAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;SAClD,CAAC;QACF;;;;;;WAMG;QACH,IAAI,CAAC,EAAE,iBAAiB,GAAG,iBAAiB,GAAG,WAAW,GAAG,MAAM,CAAC;QACpE;;;;WAIG;QACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;CACH"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qiaopeng/tanstack-query-plus",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.10",
|
|
4
4
|
"description": "Enhanced TanStack Query toolkit: defaults, hooks, persistence, offline, utils",
|
|
5
5
|
"author": "qiaopeng",
|
|
6
6
|
"license": "MIT",
|
|
@@ -79,11 +79,11 @@
|
|
|
79
79
|
"access": "public"
|
|
80
80
|
},
|
|
81
81
|
"peerDependencies": {
|
|
82
|
-
"react": ">=18",
|
|
83
|
-
"react-dom": ">=18",
|
|
84
82
|
"@tanstack/react-query": "^5",
|
|
85
|
-
"@tanstack/react-query-persist-client": "^5",
|
|
86
83
|
"@tanstack/react-query-devtools": "^5",
|
|
84
|
+
"@tanstack/react-query-persist-client": "^5",
|
|
85
|
+
"react": ">=18",
|
|
86
|
+
"react-dom": ">=18",
|
|
87
87
|
"react-intersection-observer": "^9 || ^10"
|
|
88
88
|
},
|
|
89
89
|
"peerDependenciesMeta": {
|
|
@@ -95,13 +95,13 @@
|
|
|
95
95
|
}
|
|
96
96
|
},
|
|
97
97
|
"devDependencies": {
|
|
98
|
-
"
|
|
99
|
-
"
|
|
98
|
+
"@tanstack/react-query-devtools": "^5",
|
|
99
|
+
"@types/node": "^20.12.7",
|
|
100
100
|
"@types/react": "^18.3.2",
|
|
101
101
|
"@types/react-dom": "^18.3.0",
|
|
102
|
-
"
|
|
103
|
-
"
|
|
104
|
-
"
|
|
102
|
+
"react-intersection-observer": "^9",
|
|
103
|
+
"tsup": "^8.0.0",
|
|
104
|
+
"typescript": "^5.4.0"
|
|
105
105
|
},
|
|
106
106
|
"scripts": {
|
|
107
107
|
"build": "tsc -p ./tsconfig.json",
|