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',
])