Skip to content

Commit d848100

Browse files
Dailin521jwgmeligmeyling
authored andcommitted
fix(core): keep query context signal lazy when merging meta
1 parent d9889ee commit d848100

8 files changed

Lines changed: 48 additions & 24 deletions

File tree

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
"@refinedev/core": patch
3+
---
4+
5+
fix(core): keep query context signal lazy when merging meta
6+
7+
`prepareQueryContext` was previously spread into new `meta` objects inside core data hooks. Because `signal` is exposed as a getter, object spread eagerly accessed it during merge and marked the query as abortable earlier than intended.
8+
9+
This keeps `signal` lazy by merging `meta` inside `prepareQueryContext` and preserving the getter on the returned object. The fix is applied across the affected hooks in `@refinedev/core`, and a regression test was added for the lazy `signal` behavior.
10+
11+
Resolves #7132
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { prepareQueryContext } from ".";
2+
3+
describe("prepareQueryContext", () => {
4+
it("should keep signal lazy when merging it into meta", () => {
5+
const signal = new AbortController().signal;
6+
const signalGetter = vi.fn(() => signal);
7+
const context = {
8+
queryKey: ["posts", "list"],
9+
get signal() {
10+
return signalGetter();
11+
},
12+
} as any;
13+
14+
const meta = prepareQueryContext(context, { foo: "bar" });
15+
16+
expect(meta.foo).toBe("bar");
17+
expect(meta.queryKey).toEqual(["posts", "list"]);
18+
expect(signalGetter).not.toHaveBeenCalled();
19+
20+
expect(meta.signal).toBe(signal);
21+
expect(signalGetter).toHaveBeenCalledTimes(1);
22+
});
23+
});

packages/core/src/definitions/helpers/prepare-query-context/index.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,18 @@ type Context =
44
| QueryFunctionContext<QueryKey, any>
55
| QueryFunctionContext<QueryKey, never>;
66

7+
type QueryContextMeta<TMeta extends Record<string, unknown> | undefined> =
8+
(TMeta extends Record<string, unknown> ? TMeta : Record<string, never>) &
9+
Pick<Context, "queryKey" | "signal">;
10+
711
export const prepareQueryContext = (
812
context: Context,
9-
): Pick<Context, "queryKey" | "signal"> => {
10-
const queryContext: Pick<Context, "queryKey" | "signal"> = {
13+
meta?: Record<string, unknown>,
14+
): QueryContextMeta<typeof meta> => {
15+
const queryContext = {
16+
...(meta ?? {}),
1117
queryKey: context.queryKey,
12-
signal: undefined as any,
13-
};
18+
} as QueryContextMeta<typeof meta>;
1419

1520
Object.defineProperty(queryContext, "signal", {
1621
enumerable: true,

packages/core/src/hooks/data/useCustom.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -173,10 +173,7 @@ export const useCustom = <
173173
url,
174174
method,
175175
...config,
176-
meta: {
177-
...combinedMeta,
178-
...prepareQueryContext(context as any),
179-
},
176+
meta: prepareQueryContext(context as any, combinedMeta),
180177
}),
181178
...queryOptions,
182179
meta: {

packages/core/src/hooks/data/useInfiniteList.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -254,10 +254,7 @@ export const useInfiniteList = <
254254
(context.pageParam as number) ?? prefferedPagination.currentPage,
255255
};
256256

257-
const meta = {
258-
...combinedMeta,
259-
...prepareQueryContext(context),
260-
};
257+
const meta = prepareQueryContext(context, combinedMeta);
261258

262259
return getList<TQueryFnData>({
263260
resource: resource?.name || "",

packages/core/src/hooks/data/useList.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -255,10 +255,7 @@ export const useList = <
255255
})
256256
.get(),
257257
queryFn: (context) => {
258-
const meta = {
259-
...combinedMeta,
260-
...prepareQueryContext(context),
261-
};
258+
const meta = prepareQueryContext(context, combinedMeta);
262259
return getList<TQueryFnData>({
263260
resource: resource?.name ?? "",
264261
pagination: prefferedPagination,

packages/core/src/hooks/data/useMany.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,10 +188,7 @@ export const useMany = <
188188
})
189189
.get(),
190190
queryFn: (context) => {
191-
const meta = {
192-
...combinedMeta,
193-
...prepareQueryContext(context as any),
194-
};
191+
const meta = prepareQueryContext(context as any, combinedMeta);
195192

196193
if (getMany) {
197194
return getMany({

packages/core/src/hooks/data/useOne.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,10 +185,7 @@ export const useOne = <
185185
getOne<TQueryFnData>({
186186
resource: resource?.name ?? "",
187187
id: id!,
188-
meta: {
189-
...combinedMeta,
190-
...prepareQueryContext(context as any),
191-
},
188+
meta: prepareQueryContext(context as any, combinedMeta),
192189
}),
193190
...queryOptions,
194191
enabled: isEnabled,

0 commit comments

Comments
 (0)