@qiaopeng/tanstack-query-plus 0.2.6 → 0.2.7
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/hooks/useMutation.d.ts.map +1 -1
- package/dist/hooks/useMutation.js +19 -2
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/consistency.d.ts +9 -0
- package/dist/utils/consistency.d.ts.map +1 -1
- package/dist/utils/consistency.js +44 -2
- package/package.json +1 -1
|
@@ -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,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,YAAY,EAAE,WAAW,EAAE,CAAC;AAC5B,OAAO,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"useMutation.d.ts","sourceRoot":"","sources":["../../src/hooks/useMutation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useQueryClient, useMutation as useTanStackMutation } from "@tanstack/react-query";
|
|
2
2
|
import { DEFAULT_MUTATION_CONFIG } from "../core/config.js";
|
|
3
|
-
import { syncEntityAcrossFamily, DEFAULT_FAMILY_SYNC } from "../utils/consistency.js";
|
|
3
|
+
import { syncEntityAcrossFamily, syncEntityAcrossFamilyOptimistic, DEFAULT_FAMILY_SYNC } from "../utils/consistency.js";
|
|
4
4
|
function deriveFamilyKey(queryKey) {
|
|
5
5
|
const arr = Array.isArray(queryKey) ? [...queryKey] : [queryKey];
|
|
6
6
|
while (arr.length > 1) {
|
|
@@ -66,9 +66,18 @@ export function useMutation(options) {
|
|
|
66
66
|
});
|
|
67
67
|
}
|
|
68
68
|
queryClient.setQueryData(optimistic.queryKey, (oldData) => optimistic.updater(oldData, mappedVariables));
|
|
69
|
+
let familyRollbackData = [];
|
|
70
|
+
const shouldSync = (consistency?.mode ?? "sync+invalidate") === "sync+invalidate";
|
|
71
|
+
if (shouldSync && optimistic?.queryKey) {
|
|
72
|
+
const familyKey = optimistic.familyKey ?? deriveFamilyKey(optimistic.queryKey);
|
|
73
|
+
const payload = typeof variables === "object" && variables !== null ? (variables.data ?? variables) : variables;
|
|
74
|
+
const op = typeof variables?.operation === "string" ? variables.operation : "update";
|
|
75
|
+
const cfg = consistency?.familySync ?? DEFAULT_FAMILY_SYNC;
|
|
76
|
+
familyRollbackData = syncEntityAcrossFamilyOptimistic(queryClient, familyKey, cfg, op, payload);
|
|
77
|
+
}
|
|
69
78
|
const mutateCallback = onMutate;
|
|
70
79
|
const userContext = onMutate ? await mutateCallback(variables) : undefined;
|
|
71
|
-
return { previousData, userContext };
|
|
80
|
+
return { previousData, userContext, familyRollbackData };
|
|
72
81
|
}
|
|
73
82
|
catch (error) {
|
|
74
83
|
return { userContext: undefined };
|
|
@@ -78,6 +87,11 @@ export function useMutation(options) {
|
|
|
78
87
|
if (context?.previousData !== undefined) {
|
|
79
88
|
queryClient.setQueryData(optimistic.queryKey, context.previousData);
|
|
80
89
|
}
|
|
90
|
+
if (context?.familyRollbackData) {
|
|
91
|
+
context.familyRollbackData.forEach(item => {
|
|
92
|
+
queryClient.setQueryData(item.queryKey, item.previousData);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
81
95
|
if (optimistic.rollback && context?.previousData !== undefined) {
|
|
82
96
|
try {
|
|
83
97
|
optimistic.rollback(context.previousData, error);
|
|
@@ -112,6 +126,9 @@ export function useMutation(options) {
|
|
|
112
126
|
if (Array.isArray(optimistic.relatedKeys) && optimistic.relatedKeys.length > 0) {
|
|
113
127
|
optimistic.relatedKeys.forEach((k) => invalidations.push({ queryKey: k }));
|
|
114
128
|
}
|
|
129
|
+
if (Array.isArray(optimistic.invalidates) && optimistic.invalidates.length > 0) {
|
|
130
|
+
optimistic.invalidates.forEach((k) => invalidations.push({ queryKey: k }));
|
|
131
|
+
}
|
|
115
132
|
if (invalidations.length > 0) {
|
|
116
133
|
const seen = new Set();
|
|
117
134
|
const tasks = invalidations
|
package/dist/types/index.d.ts
CHANGED
|
@@ -10,6 +10,10 @@ export interface MutationContext<TData = unknown, TContext = unknown> {
|
|
|
10
10
|
previousData?: TData;
|
|
11
11
|
userContext?: TContext;
|
|
12
12
|
conditionMet?: boolean;
|
|
13
|
+
familyRollbackData?: Array<{
|
|
14
|
+
queryKey: QueryKey;
|
|
15
|
+
previousData: unknown;
|
|
16
|
+
}>;
|
|
13
17
|
}
|
|
14
18
|
export interface MutationOptions<TData, TError, TVariables, TContext = unknown> extends UseMutationOptions<TData, TError, TVariables, TContext> {
|
|
15
19
|
optimistic?: {
|
|
@@ -21,6 +25,7 @@ export interface MutationOptions<TData, TError, TVariables, TContext = unknown>
|
|
|
21
25
|
invalidateScope?: "none" | "exact" | "family";
|
|
22
26
|
familyKey?: QueryKey;
|
|
23
27
|
relatedKeys?: QueryKey[];
|
|
28
|
+
invalidates?: QueryKey[];
|
|
24
29
|
};
|
|
25
30
|
consistency?: {
|
|
26
31
|
familySync?: {
|
|
@@ -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,CAAA;CAAE;
|
|
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;KAC9C,CAAC;CACH"}
|
|
@@ -11,6 +11,15 @@ export type FamilySyncConfig = {
|
|
|
11
11
|
maxKeys?: number;
|
|
12
12
|
enableForOperations?: Array<"update" | "delete">;
|
|
13
13
|
};
|
|
14
|
+
export declare function defaultListSelector(data: unknown): {
|
|
15
|
+
items: EntityWithId[];
|
|
16
|
+
total?: number;
|
|
17
|
+
} | null;
|
|
18
|
+
export declare function defaultWriteBack(old: unknown, items: EntityWithId[], total?: number): unknown;
|
|
14
19
|
export declare const DEFAULT_FAMILY_SYNC: FamilySyncConfig;
|
|
15
20
|
export declare function syncEntityAcrossFamily(queryClient: QueryClient, familyPrefix: QueryKey, cfg: FamilySyncConfig, operation: string, payload: Partial<EntityWithId>): void;
|
|
21
|
+
export declare function syncEntityAcrossFamilyOptimistic(queryClient: QueryClient, familyPrefix: QueryKey, cfg: FamilySyncConfig, operation: string, payload: Partial<EntityWithId>): Array<{
|
|
22
|
+
queryKey: QueryKey;
|
|
23
|
+
previousData: unknown;
|
|
24
|
+
}>;
|
|
16
25
|
//# sourceMappingURL=consistency.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consistency.d.ts","sourceRoot":"","sources":["../../src/utils/consistency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,CAA2O;AACxT,MAAM,MAAM,gBAAgB,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK;QAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"consistency.d.ts","sourceRoot":"","sources":["../../src/utils/consistency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,CAA2O;AACxT,MAAM,MAAM,gBAAgB,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK;QAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAA;CAAE,CAAC;AAC1R,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CASnG;AACD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAe7F;AACD,eAAO,MAAM,mBAAmB,EAAE,gBAA4J,CAAC;AAC/L,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAqBvK;AAED,wBAAgB,gCAAgC,CAC9C,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,QAAQ,EACtB,GAAG,EAAE,gBAAgB,EACrB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,GAC7B,KAAK,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAAC,CA6CtD"}
|
|
@@ -16,7 +16,7 @@ export function startsWithKeyPrefix(key, prefix) { const k = ensureArray(key); c
|
|
|
16
16
|
if (!(a === b || deepEqual(a, b)))
|
|
17
17
|
return false;
|
|
18
18
|
} return true; }
|
|
19
|
-
function defaultListSelector(data) {
|
|
19
|
+
export function defaultListSelector(data) {
|
|
20
20
|
if (!data)
|
|
21
21
|
return null;
|
|
22
22
|
if (Array.isArray(data))
|
|
@@ -30,7 +30,7 @@ function defaultListSelector(data) {
|
|
|
30
30
|
}
|
|
31
31
|
return null;
|
|
32
32
|
}
|
|
33
|
-
function defaultWriteBack(old, items, total) {
|
|
33
|
+
export function defaultWriteBack(old, items, total) {
|
|
34
34
|
if (old && typeof old === "object") {
|
|
35
35
|
const obj = { ...old };
|
|
36
36
|
if (Array.isArray(obj.Rows)) {
|
|
@@ -77,3 +77,45 @@ export function syncEntityAcrossFamily(queryClient, familyPrefix, cfg, operation
|
|
|
77
77
|
queryClient.setQueryData(key, next);
|
|
78
78
|
});
|
|
79
79
|
}
|
|
80
|
+
export function syncEntityAcrossFamilyOptimistic(queryClient, familyPrefix, cfg, operation, payload) {
|
|
81
|
+
const rollbackData = [];
|
|
82
|
+
const enabledOps = cfg.enableForOperations ?? ["update", "delete"];
|
|
83
|
+
const op = String(operation).toLowerCase();
|
|
84
|
+
if (!enabledOps.includes(op))
|
|
85
|
+
return rollbackData;
|
|
86
|
+
const idField = cfg.idField ?? "id";
|
|
87
|
+
const cache = queryClient.getQueryCache();
|
|
88
|
+
const queries = cache.findAll({ predicate: (q) => startsWithKeyPrefix(q.queryKey, familyPrefix) });
|
|
89
|
+
const limited = typeof cfg.maxKeys === "number" && cfg.maxKeys > 0 ? queries.slice(0, cfg.maxKeys) : queries;
|
|
90
|
+
limited.forEach((q) => {
|
|
91
|
+
const key = q.queryKey;
|
|
92
|
+
const old = queryClient.getQueryData(key);
|
|
93
|
+
const picked = (cfg.listSelector ?? defaultListSelector)(old);
|
|
94
|
+
if (!picked || !Array.isArray(picked.items))
|
|
95
|
+
return;
|
|
96
|
+
const idValue = payload?.[idField];
|
|
97
|
+
let items = picked.items;
|
|
98
|
+
let shouldUpdate = false;
|
|
99
|
+
if (op === "update" && idValue !== undefined) {
|
|
100
|
+
const exists = items.some(item => item[idField] === idValue);
|
|
101
|
+
if (exists) {
|
|
102
|
+
items = listUpdater.update(items, { ...payload, id: idValue });
|
|
103
|
+
shouldUpdate = true;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else if (op === "delete" && idValue !== undefined) {
|
|
107
|
+
const exists = items.some(item => item[idField] === idValue);
|
|
108
|
+
if (exists) {
|
|
109
|
+
items = listUpdater.remove(items, idValue);
|
|
110
|
+
shouldUpdate = true;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (shouldUpdate) {
|
|
114
|
+
rollbackData.push({ queryKey: key, previousData: old });
|
|
115
|
+
const total = typeof picked.total === "number" && op === "delete" ? Math.max(0, picked.total - 1) : picked.total;
|
|
116
|
+
const next = (cfg.writeBack ?? defaultWriteBack)(old, items, total);
|
|
117
|
+
queryClient.setQueryData(key, next);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
return rollbackData;
|
|
121
|
+
}
|