From c0b26cada8225a3cb0531329bbab6209056ce6ae Mon Sep 17 00:00:00 2001 From: Raashish Aggarwal <94279692+raashish1601@users.noreply.github.com> Date: Sat, 30 May 2026 17:13:41 +0530 Subject: [PATCH 1/2] fix(vue-query): avoid mounting QueryClient on server --- .../vue-query/src/__tests__/vueQueryPlugin.test.ts | 14 ++++++++++++++ packages/vue-query/src/vueQueryPlugin.ts | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/vue-query/src/__tests__/vueQueryPlugin.test.ts b/packages/vue-query/src/__tests__/vueQueryPlugin.test.ts index cfcb18ce956..f7dce9073d5 100644 --- a/packages/vue-query/src/__tests__/vueQueryPlugin.test.ts +++ b/packages/vue-query/src/__tests__/vueQueryPlugin.test.ts @@ -1,5 +1,6 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { isVue2, isVue3, ref } from 'vue-demi' +import { environmentManager } from '@tanstack/query-core' import { queryKey } from '@tanstack/query-test-utils' import { QueryClient } from '../queryClient' import { VueQueryPlugin } from '../vueQueryPlugin' @@ -218,6 +219,19 @@ describe('VueQueryPlugin', () => { customClient, ) }) + + it('should not mount client when in a server environment', () => { + environmentManager.setIsServer(() => true) + try { + const appMock = getAppMock() + const customClient = { mount: vi.fn() } as unknown as QueryClient + VueQueryPlugin.install(appMock, { queryClient: customClient }) + + expect(customClient.mount).not.toHaveBeenCalled() + } finally { + environmentManager.setIsServer(() => false) + } + }) }) describe('when called with custom client config', () => { diff --git a/packages/vue-query/src/vueQueryPlugin.ts b/packages/vue-query/src/vueQueryPlugin.ts index 590d994d304..5c24bac18b7 100644 --- a/packages/vue-query/src/vueQueryPlugin.ts +++ b/packages/vue-query/src/vueQueryPlugin.ts @@ -1,5 +1,5 @@ import { isVue2 } from 'vue-demi' -import { isServer } from '@tanstack/query-core' +import { environmentManager } from '@tanstack/query-core' import { QueryClient } from './queryClient' import { getClientKey } from './utils' @@ -38,7 +38,7 @@ export const VueQueryPlugin = { client = new QueryClient(clientConfig) } - if (!isServer) { + if (!environmentManager.isServer()) { client.mount() } From 03cb202b1cce555126d93f29fcbd2f2defffed19 Mon Sep 17 00:00:00 2001 From: Raashish Aggarwal <94279692+raashish1601@users.noreply.github.com> Date: Sat, 30 May 2026 17:40:45 +0530 Subject: [PATCH 2/2] fix: restore undefined persister query payloads --- .../src/__tests__/createPersister.test.ts | 20 +++++++++++++++++++ .../src/createPersister.ts | 12 +++++++---- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/packages/query-persist-client-core/src/__tests__/createPersister.test.ts b/packages/query-persist-client-core/src/__tests__/createPersister.test.ts index 8e385bc3dad..da4a24d24ac 100644 --- a/packages/query-persist-client-core/src/__tests__/createPersister.test.ts +++ b/packages/query-persist-client-core/src/__tests__/createPersister.test.ts @@ -309,6 +309,26 @@ describe('createPersister', () => { expect(query.fetch).toHaveBeenCalledTimes(0) }) + it('should restore persisted undefined data from storage', async () => { + const storage = getFreshStorage() + const { context, persister, query, queryFn } = setupPersister(['foo'], { + storage, + refetchOnRestore: false, + }) + + query.setData(undefined) + await persister.persistQuery(query) + + query.fetch = vi.fn() + await persister.persisterFn(queryFn, context, query) + + await vi.advanceTimersByTimeAsync(0) + + expect(queryFn).toHaveBeenCalledTimes(0) + expect(query.fetch).toHaveBeenCalledTimes(0) + expect(query.state.data).toBe(undefined) + }) + it('should store item after successful fetch', async () => { const storage = getFreshStorage() const { diff --git a/packages/query-persist-client-core/src/createPersister.ts b/packages/query-persist-client-core/src/createPersister.ts index 16fa8c43104..7538ede3e3f 100644 --- a/packages/query-persist-client-core/src/createPersister.ts +++ b/packages/query-persist-client-core/src/createPersister.ts @@ -13,6 +13,10 @@ import type { QueryState, } from '@tanstack/query-core' +type PersistedResult = { + data: T +} + export interface PersistedQuery { buster: string queryHash: string @@ -125,7 +129,7 @@ export function experimental_createQueryPersister({ async function retrieveQuery( queryHash: string, afterRestoreMacroTask?: (persistedQuery: PersistedQuery) => void, - ) { + ): Promise | undefined> { if (storage != null) { const storageKey = `${prefix}-${queryHash}` try { @@ -149,7 +153,7 @@ export function experimental_createQueryPersister({ ) } // We must resolve the promise here, as otherwise we will have `loading` state in the app until `queryFn` resolves - return persistedQuery.state.data as T + return { data: persistedQuery.state.data as T } } } } catch (err) { @@ -209,7 +213,7 @@ export function experimental_createQueryPersister({ // Try to restore only if we do not have any data in the cache and we have persister defined if (matchesFilter && query.state.data === undefined && storage != null) { - const restoredData = await retrieveQuery( + const restoredData = await retrieveQuery( query.queryHash, (persistedQuery: PersistedQuery) => { // Set proper updatedAt, since resolving in the first pass overrides those values @@ -228,7 +232,7 @@ export function experimental_createQueryPersister({ ) if (restoredData !== undefined) { - return Promise.resolve(restoredData as T) + return Promise.resolve(restoredData.data) } }