From f3f1ddc76d8993cb1c36b773b3dcc98d48aeb24d Mon Sep 17 00:00:00 2001 From: JetProc Date: Fri, 5 Jun 2026 17:46:26 +0900 Subject: [PATCH] Preserve Svelte createQuery inference with per-query persisters Query persisters are allowed as query options in core, but the Svelte createQuery accessor path let the persister type participate in query key and data inference. That could make a valid per-query persister reject overload resolution or leave result data as unknown. This keeps the runtime path unchanged and limits the type relaxation to the createQuery option surface, with a regression test covering the reported usage. Constraint: Match TanStack Query's Svelte package boundaries and keep the fix type-only Rejected: Relax CreateBaseQueryOptions | it also affected internal defaultQueryOptions and infinite query typing Confidence: high Scope-risk: narrow Directive: Keep queryFn as the source of createQuery result data inference when persister is present Tested: pnpm run test:pr Tested: corepack pnpm nx run @tanstack/svelte-query:test:types Tested: corepack pnpm nx run @tanstack/svelte-query:test:lib Tested: corepack pnpm nx run @tanstack/svelte-query:test:eslint Tested: corepack pnpm nx run @tanstack/svelte-query:test:build --- .changeset/svelte-query-persister-options.md | 5 +++++ packages/svelte-query/src/types.ts | 8 ++++++- .../tests/createQuery/createQuery.test-d.ts | 21 +++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 .changeset/svelte-query-persister-options.md diff --git a/.changeset/svelte-query-persister-options.md b/.changeset/svelte-query-persister-options.md new file mode 100644 index 0000000000..b0a95409d8 --- /dev/null +++ b/.changeset/svelte-query-persister-options.md @@ -0,0 +1,5 @@ +--- +'@tanstack/svelte-query': patch +--- + +Fix createQuery types to allow overriding query persisters per query. diff --git a/packages/svelte-query/src/types.ts b/packages/svelte-query/src/types.ts index 9a64d10dc3..0faf4e3f0d 100644 --- a/packages/svelte-query/src/types.ts +++ b/packages/svelte-query/src/types.ts @@ -16,6 +16,7 @@ import type { QueryKey, QueryObserverOptions, QueryObserverResult, + QueryPersister, } from '@tanstack/query-core' export type Accessor = () => T @@ -41,7 +42,12 @@ export type CreateQueryOptions< TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, -> = CreateBaseQueryOptions +> = OmitKeyof< + CreateBaseQueryOptions, + 'persister' +> & { + persister?: QueryPersister +} /** Result from createQuery */ export type CreateQueryResult< diff --git a/packages/svelte-query/tests/createQuery/createQuery.test-d.ts b/packages/svelte-query/tests/createQuery/createQuery.test-d.ts index 8b6590b334..7826845b70 100644 --- a/packages/svelte-query/tests/createQuery/createQuery.test-d.ts +++ b/packages/svelte-query/tests/createQuery/createQuery.test-d.ts @@ -1,8 +1,29 @@ import { describe, expectTypeOf, it } from 'vitest' import { queryKey } from '@tanstack/query-test-utils' import { createQuery, queryOptions } from '../../src/index.js' +import type { + Query, + QueryFunctionContext, + QueryKey, +} from '@tanstack/query-core' describe('createQuery', () => { + it('should allow a per-query persister', () => { + const persister = undefined as unknown as ( + queryFn: (context: QueryFunctionContext) => T | Promise, + context: QueryFunctionContext, + query: Query, + ) => Promise + + const { data } = createQuery(() => ({ + queryKey: ['todos'], + queryFn: () => Promise.resolve(['todo']), + persister, + })) + + expectTypeOf(data).toEqualTypeOf | undefined>() + }) + describe('initialData', () => { describe('Config object overload', () => { it('TData should always be defined when initialData is provided as an object', () => {