From c245a7d2e3634e92c30b42aef13a5452cefa3716 Mon Sep 17 00:00:00 2001 From: Raashish Aggarwal <94279692+raashish1601@users.noreply.github.com> Date: Sun, 24 May 2026 15:26:23 +0530 Subject: [PATCH 1/2] fix(solid-query): fetch on status-only reads --- .changeset/solid-query-status-resource.md | 5 +++ .../src/__tests__/useQuery.test.tsx | 35 +++++++++++++++++++ packages/solid-query/src/useBaseQuery.ts | 29 +++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 .changeset/solid-query-status-resource.md diff --git a/.changeset/solid-query-status-resource.md b/.changeset/solid-query-status-resource.md new file mode 100644 index 00000000000..12a340a386f --- /dev/null +++ b/.changeset/solid-query-status-resource.md @@ -0,0 +1,5 @@ +--- +"@tanstack/solid-query": patch +--- + +Start Solid query resources when status fields are read so curried `queryOptions` fetch on mount without requiring `data` access. diff --git a/packages/solid-query/src/__tests__/useQuery.test.tsx b/packages/solid-query/src/__tests__/useQuery.test.tsx index 745a9ab1cc2..33994aaf2f5 100644 --- a/packages/solid-query/src/__tests__/useQuery.test.tsx +++ b/packages/solid-query/src/__tests__/useQuery.test.tsx @@ -30,6 +30,7 @@ import { QueryClient, QueryClientProvider, keepPreviousData, + queryOptions, useQuery, } from '..' import { Blink, mockOnlineManagerIsOnline, setActTimeout } from './utils' @@ -244,6 +245,40 @@ describe('useQuery', () => { expect(rendered.getByText('test')).toBeInTheDocument() }) + it('should fetch when a curried queryOptions result only reads status fields', async () => { + const key = queryKey() + const queryFn = vi.fn((slug: string) => `test-${slug}`) + const fetchQueryOptions = (slug: string) => + queryOptions({ + queryKey: [key, slug], + queryFn: () => queryFn(slug), + }) + + function Page() { + const options = fetchQueryOptions('slug') + const state = useQuery(() => options) + + return ( + + pending + error + success + + ) + } + + const rendered = render(() => ( + + + + )) + + expect(rendered.getByText('pending')).toBeInTheDocument() + await vi.advanceTimersByTimeAsync(10) + expect(queryFn).toHaveBeenCalledTimes(1) + expect(rendered.getByText('success')).toBeInTheDocument() + }) + it('should return the correct states for a successful query', async () => { const key = queryKey() const states: Array> = [] diff --git a/packages/solid-query/src/useBaseQuery.ts b/packages/solid-query/src/useBaseQuery.ts index 773d0719e0c..29ae33a87fa 100644 --- a/packages/solid-query/src/useBaseQuery.ts +++ b/packages/solid-query/src/useBaseQuery.ts @@ -99,6 +99,30 @@ const hydratableObserverResult = < return obj } +const resourceTrackingProps = new Set([ + 'dataUpdatedAt', + 'errorUpdatedAt', + 'failureCount', + 'errorUpdateCount', + 'isError', + 'isFetched', + 'isFetchedAfterMount', + 'isFetching', + 'isLoading', + 'isPending', + 'isLoadingError', + 'isInitialLoading', + 'isPaused', + 'isPlaceholderData', + 'isRefetchError', + 'isRefetching', + 'isStale', + 'isSuccess', + 'isEnabled', + 'status', + 'fetchStatus', +]) + // Base Query Function that is used to create the query. export function useBaseQuery< TQueryFnData, @@ -381,6 +405,11 @@ export function useBaseQuery< } return queryResource()?.data } + if (resourceTrackingProps.has(prop)) { + // Solid resources are lazy, so status-only consumers still need to read + // the resource once to start the observer subscription and fetch. + queryResource() + } return Reflect.get(target, prop) }, } From 597b66867286139d9339887740dbf2f4a1958644 Mon Sep 17 00:00:00 2001 From: Raashish Aggarwal <94279692+raashish1601@users.noreply.github.com> Date: Sun, 24 May 2026 22:48:17 +0530 Subject: [PATCH 2/2] fix(solid-query): track resource result fields --- .../src/__tests__/useQuery.test.tsx | 32 +++++++++++++++++++ packages/solid-query/src/useBaseQuery.ts | 4 +++ 2 files changed, 36 insertions(+) diff --git a/packages/solid-query/src/__tests__/useQuery.test.tsx b/packages/solid-query/src/__tests__/useQuery.test.tsx index 33994aaf2f5..cec4d3a4a5e 100644 --- a/packages/solid-query/src/__tests__/useQuery.test.tsx +++ b/packages/solid-query/src/__tests__/useQuery.test.tsx @@ -279,6 +279,38 @@ describe('useQuery', () => { expect(rendered.getByText('success')).toBeInTheDocument() }) + it('should fetch when a curried queryOptions result only reads resource fields', async () => { + const key = queryKey() + const queryFn = vi.fn((slug: string) => `test-${slug}`) + const fetchQueryOptions = (slug: string) => + queryOptions({ + queryKey: [key, slug], + queryFn: () => queryFn(slug), + }) + + function Page() { + const options = fetchQueryOptions('slug') + const state = useQuery(() => options) + + void state.error + void state.failureReason + void state.refetch + void state.promise + + return
mounted
+ } + + const rendered = render(() => ( + + + + )) + + expect(rendered.getByText('mounted')).toBeInTheDocument() + await vi.advanceTimersByTimeAsync(10) + expect(queryFn).toHaveBeenCalledTimes(1) + }) + it('should return the correct states for a successful query', async () => { const key = queryKey() const states: Array> = [] diff --git a/packages/solid-query/src/useBaseQuery.ts b/packages/solid-query/src/useBaseQuery.ts index 29ae33a87fa..3d949b65153 100644 --- a/packages/solid-query/src/useBaseQuery.ts +++ b/packages/solid-query/src/useBaseQuery.ts @@ -101,8 +101,10 @@ const hydratableObserverResult = < const resourceTrackingProps = new Set([ 'dataUpdatedAt', + 'error', 'errorUpdatedAt', 'failureCount', + 'failureReason', 'errorUpdateCount', 'isError', 'isFetched', @@ -119,6 +121,8 @@ const resourceTrackingProps = new Set([ 'isStale', 'isSuccess', 'isEnabled', + 'refetch', + 'promise', 'status', 'fetchStatus', ])