From e092f061923eaf09fd43e31f643c61fd96786ae0 Mon Sep 17 00:00:00 2001 From: Lachlan Collins <1667261+lachlancollins@users.noreply.github.com> Date: Fri, 2 Aug 2024 12:07:27 +1000 Subject: [PATCH] fix(svelte-query): allow returning undefined in initialData function (#7838) --- packages/svelte-query/src/queryOptions.ts | 9 +++++++-- .../tests/createQuery/createQuery.test-d.ts | 20 +++++++++++-------- .../tests/queryOptions/queryOptions.test-d.ts | 19 ++++++++++++++++++ 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/packages/svelte-query/src/queryOptions.ts b/packages/svelte-query/src/queryOptions.ts index a780c596dc..dc4beb2951 100644 --- a/packages/svelte-query/src/queryOptions.ts +++ b/packages/svelte-query/src/queryOptions.ts @@ -1,4 +1,9 @@ -import type { DataTag, DefaultError, QueryKey } from '@tanstack/query-core' +import type { + DataTag, + DefaultError, + InitialDataFunction, + QueryKey, +} from '@tanstack/query-core' import type { CreateQueryOptions } from './types.js' export type UndefinedInitialDataOptions< @@ -7,7 +12,7 @@ export type UndefinedInitialDataOptions< TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, > = CreateQueryOptions & { - initialData?: undefined + initialData?: undefined | InitialDataFunction> } type NonUndefinedGuard = T extends undefined ? never : T diff --git a/packages/svelte-query/tests/createQuery/createQuery.test-d.ts b/packages/svelte-query/tests/createQuery/createQuery.test-d.ts index 6560008022..7936758401 100644 --- a/packages/svelte-query/tests/createQuery/createQuery.test-d.ts +++ b/packages/svelte-query/tests/createQuery/createQuery.test-d.ts @@ -18,20 +18,24 @@ describe('createQuery', () => { test('TData should be defined when passed through queryOptions', () => { const options = queryOptions({ queryKey: ['key'], - queryFn: () => { - return { - wow: true, - } - }, - initialData: { - wow: true, - }, + queryFn: () => ({ wow: true }), + initialData: { wow: true }, }) const query = createQuery(options) expectTypeOf(get(query).data).toEqualTypeOf<{ wow: boolean }>() }) + test('TData should always be defined when initialData is provided as a function which ALWAYS returns the data', () => { + const query = createQuery({ + queryKey: ['key'], + queryFn: () => ({ wow: true }), + initialData: () => ({ wow: true }), + }) + + expectTypeOf(get(query).data).toEqualTypeOf<{ wow: boolean }>() + }) + test('TData should have undefined in the union when initialData is NOT provided', () => { const query = createQuery({ queryKey: ['key'], diff --git a/packages/svelte-query/tests/queryOptions/queryOptions.test-d.ts b/packages/svelte-query/tests/queryOptions/queryOptions.test-d.ts index cfe46e2af7..8562a7c227 100644 --- a/packages/svelte-query/tests/queryOptions/queryOptions.test-d.ts +++ b/packages/svelte-query/tests/queryOptions/queryOptions.test-d.ts @@ -176,4 +176,23 @@ describe('queryOptions', () => { QueriesObserver> >() }) + + test('Should allow undefined response in initialData', () => { + return (id: string | null) => + queryOptions({ + queryKey: ['todo', id], + queryFn: () => + Promise.resolve({ + id: '1', + title: 'Do Laundry', + }), + initialData: () => + !id + ? undefined + : { + id, + title: 'Initial Data', + }, + }) + }) })