Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .changeset/fix-query-options-declaration-emit.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
'@tanstack/query-core': patch
'@tanstack/angular-query-experimental': patch
'@tanstack/preact-query': patch
'@tanstack/react-query': patch
'@tanstack/solid-query': patch
'@tanstack/svelte-query': patch
'@tanstack/vue-query': patch
---

Fix `queryOptions` and `infiniteQueryOptions` return types so exported inferred options can be emitted in declaration files without leaking internal data tag symbols.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,15 @@ import type {
InitialDataFunction,
} from '@tanstack/query-core'

// Regression test for exported infiniteQueryOptions inference under declaration emit.
// TypeScript should be able to name the return type without expanding the
// internal data tag symbols into the consumer's .d.ts output.
export const exportedInfiniteQueryOptions = infiniteQueryOptions({
queryKey: ['invalid'],
getNextPageParam: () => 1,
initialPageParam: 1,
})

describe('infiniteQueryOptions', () => {
it('should not allow excess properties', () => {
const key = queryKey()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,13 @@ import { queryKey } from '@tanstack/query-test-utils'
import { QueryClient, dataTagSymbol, injectQuery, queryOptions } from '..'
import type { Signal } from '@angular/core'

// Regression test for exported queryOptions inference under declaration emit.
// TypeScript should be able to name the return type without expanding the
// internal data tag symbols into the consumer's .d.ts output.
export const exportedQueryOptions = queryOptions({
queryKey: ['invalid'],
})

describe('queryOptions', () => {
it('should not allow excess properties', () => {
expectTypeOf(queryOptions).parameter(0).not.toHaveProperty('stallTime')
Expand Down
17 changes: 7 additions & 10 deletions packages/angular-query-experimental/src/infinite-query-options.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type {
DataTag,
QueryKeyWithDataTag,
DefaultError,
InfiniteData,
InitialDataFunction,
Expand Down Expand Up @@ -105,9 +105,8 @@ export function infiniteQueryOptions<
TData,
TQueryKey,
TPageParam
> & {
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>
}
> &
QueryKeyWithDataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>

/**
* Allows to share and re-use infinite query options in a type-safe way.
Expand Down Expand Up @@ -136,9 +135,8 @@ export function infiniteQueryOptions<
TData,
TQueryKey,
TPageParam
> & {
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>
}
> &
QueryKeyWithDataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>

/**
* Allows to share and re-use infinite query options in a type-safe way.
Expand Down Expand Up @@ -167,9 +165,8 @@ export function infiniteQueryOptions<
TData,
TQueryKey,
TPageParam
> & {
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>
}
> &
QueryKeyWithDataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>

/**
* Allows to share and re-use infinite query options in a type-safe way.
Expand Down
17 changes: 7 additions & 10 deletions packages/angular-query-experimental/src/query-options.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type {
DataTag,
QueryKeyWithDataTag,
DefaultError,
InitialDataFunction,
NonUndefinedGuard,
Expand Down Expand Up @@ -80,9 +80,8 @@ export function queryOptions<
TQueryKey extends QueryKey = QueryKey,
>(
options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
): DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> & {
queryKey: DataTag<TQueryKey, TQueryFnData, TError>
}
): DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> &
QueryKeyWithDataTag<TQueryKey, TQueryFnData, TError>

/**
* Allows to share and re-use query options in a type-safe way.
Expand Down Expand Up @@ -112,9 +111,8 @@ export function queryOptions<
TQueryKey extends QueryKey = QueryKey,
>(
options: UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey>,
): UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey> & {
queryKey: DataTag<TQueryKey, TQueryFnData, TError>
}
): UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey> &
QueryKeyWithDataTag<TQueryKey, TQueryFnData, TError>

/**
* Allows to share and re-use query options in a type-safe way.
Expand Down Expand Up @@ -144,9 +142,8 @@ export function queryOptions<
TQueryKey extends QueryKey = QueryKey,
>(
options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
): UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> & {
queryKey: DataTag<TQueryKey, TQueryFnData, TError>
}
): UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> &
QueryKeyWithDataTag<TQueryKey, TQueryFnData, TError>

/**
* Allows to share and re-use query options in a type-safe way.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,15 @@ import { useInfiniteQuery } from '../useInfiniteQuery'
import { useQuery } from '../useQuery'
import { useSuspenseInfiniteQuery } from '../useSuspenseInfiniteQuery'

// Regression test for exported infiniteQueryOptions inference under declaration emit.
// TypeScript should be able to name the return type without expanding the
// internal data tag symbols into the consumer's .d.ts output.
export const exportedInfiniteQueryOptions = infiniteQueryOptions({
queryKey: ['invalid'],
getNextPageParam: () => 1,
initialPageParam: 1,
})

describe('infiniteQueryOptions', () => {
it('should not allow excess properties', () => {
assertType(
Expand Down
7 changes: 7 additions & 0 deletions packages/preact-query/src/__tests__/queryOptions.test-d.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,13 @@ import { useQueries } from '../useQueries'
import { useQuery } from '../useQuery'
import { useSuspenseQuery } from '../useSuspenseQuery'

// Regression test for exported queryOptions inference under declaration emit.
// TypeScript should be able to name the return type without expanding the
// internal data tag symbols into the consumer's .d.ts output.
export const exportedQueryOptions = queryOptions({
queryKey: ['invalid'],
})

describe('queryOptions', () => {
it('should not allow excess properties', () => {
assertType(
Expand Down
17 changes: 7 additions & 10 deletions packages/preact-query/src/infiniteQueryOptions.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type {
DataTag,
QueryKeyWithDataTag,
DefaultError,
InfiniteData,
InitialDataFunction,
Expand Down Expand Up @@ -93,9 +93,8 @@ export function infiniteQueryOptions<
TData,
TQueryKey,
TPageParam
> & {
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>
}
> &
QueryKeyWithDataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>

export function infiniteQueryOptions<
TQueryFnData,
Expand All @@ -117,9 +116,8 @@ export function infiniteQueryOptions<
TData,
TQueryKey,
TPageParam
> & {
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>
}
> &
QueryKeyWithDataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>

export function infiniteQueryOptions<
TQueryFnData,
Expand All @@ -141,9 +139,8 @@ export function infiniteQueryOptions<
TData,
TQueryKey,
TPageParam
> & {
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>
}
> &
QueryKeyWithDataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>

export function infiniteQueryOptions(options: unknown) {
return options
Expand Down
17 changes: 7 additions & 10 deletions packages/preact-query/src/queryOptions.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type {
DataTag,
QueryKeyWithDataTag,
DefaultError,
InitialDataFunction,
NonUndefinedGuard,
Expand Down Expand Up @@ -57,9 +57,8 @@ export function queryOptions<
TQueryKey extends QueryKey = QueryKey,
>(
options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
): DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> & {
queryKey: DataTag<TQueryKey, TQueryFnData, TError>
}
): DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> &
QueryKeyWithDataTag<TQueryKey, TQueryFnData, TError>

export function queryOptions<
TQueryFnData = unknown,
Expand All @@ -68,9 +67,8 @@ export function queryOptions<
TQueryKey extends QueryKey = QueryKey,
>(
options: UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey>,
): UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey> & {
queryKey: DataTag<TQueryKey, TQueryFnData, TError>
}
): UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey> &
QueryKeyWithDataTag<TQueryKey, TQueryFnData, TError>

export function queryOptions<
TQueryFnData = unknown,
Expand All @@ -79,9 +77,8 @@ export function queryOptions<
TQueryKey extends QueryKey = QueryKey,
>(
options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
): UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> & {
queryKey: DataTag<TQueryKey, TQueryFnData, TError>
}
): UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> &
QueryKeyWithDataTag<TQueryKey, TQueryFnData, TError>

export function queryOptions(options: unknown) {
return options
Expand Down
8 changes: 8 additions & 0 deletions packages/query-core/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,14 @@ export type DataTag<
[dataTagErrorSymbol]: TError
}

export type QueryKeyWithDataTag<
TQueryKey extends QueryKey = QueryKey,
TQueryFnData = unknown,
TError = DefaultError,
> = {
queryKey: DataTag<TQueryKey, TQueryFnData, TError>
}

export type InferDataFromTag<TQueryFnData, TTaggedQueryKey extends QueryKey> =
TTaggedQueryKey extends DataTag<unknown, infer TaggedValue, unknown>
? TaggedValue
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,15 @@ import type {
InitialDataFunction,
} from '@tanstack/query-core'

// Regression test for exported infiniteQueryOptions inference under declaration emit.
// TypeScript should be able to name the return type without expanding the
// internal data tag symbols into the consumer's .d.ts output.
export const exportedInfiniteQueryOptions = infiniteQueryOptions({
queryKey: ['invalid'],
getNextPageParam: () => 1,
initialPageParam: 1,
})

describe('infiniteQueryOptions', () => {
it('should not allow excess properties', () => {
assertType(
Expand Down
7 changes: 7 additions & 0 deletions packages/react-query/src/__tests__/queryOptions.test-d.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,13 @@ import type {
QueryPersister,
} from '@tanstack/query-core'

// Regression test for exported queryOptions inference under declaration emit.
// TypeScript should be able to name the return type without expanding the
// internal data tag symbols into the consumer's .d.ts output.
export const exportedQueryOptions = queryOptions({
queryKey: ['invalid'],
})

describe('queryOptions', () => {
it('should not allow excess properties', () => {
assertType(
Expand Down
17 changes: 7 additions & 10 deletions packages/react-query/src/infiniteQueryOptions.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type {
DataTag,
QueryKeyWithDataTag,
DefaultError,
InfiniteData,
InitialDataFunction,
Expand Down Expand Up @@ -92,9 +92,8 @@ export function infiniteQueryOptions<
TData,
TQueryKey,
TPageParam
> & {
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>
}
> &
QueryKeyWithDataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>

export function infiniteQueryOptions<
TQueryFnData,
Expand All @@ -116,9 +115,8 @@ export function infiniteQueryOptions<
TData,
TQueryKey,
TPageParam
> & {
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>
}
> &
QueryKeyWithDataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>

export function infiniteQueryOptions<
TQueryFnData,
Expand All @@ -140,9 +138,8 @@ export function infiniteQueryOptions<
TData,
TQueryKey,
TPageParam
> & {
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>
}
> &
QueryKeyWithDataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>

export function infiniteQueryOptions(options: unknown) {
return options
Expand Down
17 changes: 7 additions & 10 deletions packages/react-query/src/queryOptions.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type {
DataTag,
QueryKeyWithDataTag,
DefaultError,
InitialDataFunction,
NonUndefinedGuard,
Expand Down Expand Up @@ -56,9 +56,8 @@ export function queryOptions<
TQueryKey extends QueryKey = QueryKey,
>(
options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
): DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> & {
queryKey: DataTag<TQueryKey, TQueryFnData, TError>
}
): DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> &
QueryKeyWithDataTag<TQueryKey, TQueryFnData, TError>

export function queryOptions<
TQueryFnData = unknown,
Expand All @@ -67,9 +66,8 @@ export function queryOptions<
TQueryKey extends QueryKey = QueryKey,
>(
options: UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey>,
): UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey> & {
queryKey: DataTag<TQueryKey, TQueryFnData, TError>
}
): UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey> &
QueryKeyWithDataTag<TQueryKey, TQueryFnData, TError>

export function queryOptions<
TQueryFnData = unknown,
Expand All @@ -78,9 +76,8 @@ export function queryOptions<
TQueryKey extends QueryKey = QueryKey,
>(
options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
): UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> & {
queryKey: DataTag<TQueryKey, TQueryFnData, TError>
}
): UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> &
QueryKeyWithDataTag<TQueryKey, TQueryFnData, TError>

export function queryOptions(options: unknown) {
return options
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,15 @@ import type {
UndefinedInitialDataInfiniteOptions,
} from '../infiniteQueryOptions'

// Regression test for exported infiniteQueryOptions inference under declaration emit.
// TypeScript should be able to name the return type without expanding the
// internal data tag symbols into the consumer's .d.ts output.
export const exportedInfiniteQueryOptions = infiniteQueryOptions({
queryKey: ['invalid'],
getNextPageParam: () => 1,
initialPageParam: 1,
})

describe('infiniteQueryOptions', () => {
it('should infer defined types', () => {
const options = infiniteQueryOptions({
Expand Down
Loading