From 34171ce33708187cde73f3439f11544276049951 Mon Sep 17 00:00:00 2001 From: Brenley Dueck Date: Fri, 28 Aug 2026 22:36:01 -0500 Subject: [PATCH] fix(solid-query): untrack the client read in useMutation's cache subscription useMutation subscribes to the mutation cache in the hook body via a bare client() memo read, which fires Solid's STRICT_READ_UNTRACKED diagnostic for any component that calls useMutation. Wrap it in untrack, matching how useBaseQuery guards the same body-scope read. --- .../src/__tests__/useMutation.test.tsx | 24 +++++++++++++++++++ packages/solid-query/src/useMutation.ts | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/packages/solid-query/src/__tests__/useMutation.test.tsx b/packages/solid-query/src/__tests__/useMutation.test.tsx index bfaadc105d..aef4c2e381 100644 --- a/packages/solid-query/src/__tests__/useMutation.test.tsx +++ b/packages/solid-query/src/__tests__/useMutation.test.tsx @@ -105,6 +105,30 @@ describe('useMutation', () => { consoleMock.mockRestore() }) + it('should not emit a strict-read diagnostic on mount', () => { + const consoleMock = vi + .spyOn(console, 'warn') + .mockImplementation(() => undefined) + + function Page() { + const mutation = useMutation(() => ({ + mutationFn: () => Promise.resolve('mutation'), + })) + + return + } + + renderWithClient(queryClient, () => ) + + expect( + consoleMock.mock.calls.filter((args) => + args.some((arg) => String(arg).includes('STRICT_READ_UNTRACKED')), + ), + ).toEqual([]) + + consoleMock.mockRestore() + }) + it('should be able to call `onSuccess` and `onSettled` after each successful mutate', async () => { let countRef = 0 const [count, setCount] = createSignal(0) diff --git a/packages/solid-query/src/useMutation.ts b/packages/solid-query/src/useMutation.ts index 1d0b2f7b5c..903e3120f3 100644 --- a/packages/solid-query/src/useMutation.ts +++ b/packages/solid-query/src/useMutation.ts @@ -119,7 +119,7 @@ export function useMutation< let activeMutation: Mutation | null = null const [flightVersion, setFlightVersion] = createSignal(0) if (!isServer) { - const unsubscribe = client() + const unsubscribe = untrack(client) .getMutationCache() .subscribe((event) => { if ('mutation' in event && event.mutation === activeMutation) {