@tanstack/solid-query 5.32.1 → 5.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { DefaultError, QueryKey, OmitKeyof, QueryObserverOptions as QueryObserverOptions$1, InfiniteQueryObserverOptions as InfiniteQueryObserverOptions$1, DefaultOptions as DefaultOptions$1, QueryClientConfig as QueryClientConfig$1, QueryClient as QueryClient$1, QueryObserverResult, DefinedQueryObserverResult, InfiniteQueryObserverResult, MutationObserverOptions, MutateFunction, MutationObserverResult, QueryFilters, InfiniteData, MutationFilters, MutationState, Mutation, QueriesPlaceholderDataFunction, QueryFunction, SkipToken, ThrowOnError } from '@tanstack/query-core';
1
+ import { DefaultError, QueryKey, OmitKeyof, QueryObserverOptions as QueryObserverOptions$1, InfiniteQueryObserverOptions as InfiniteQueryObserverOptions$1, DefaultOptions as DefaultOptions$1, QueryClientConfig as QueryClientConfig$1, QueryClient as QueryClient$1, QueryObserverResult, DefinedQueryObserverResult, InfiniteQueryObserverResult, MutationObserverOptions, MutateFunction, MutationObserverResult, DataTag, QueryFilters, InfiniteData, MutationFilters, MutationState, Mutation, QueriesPlaceholderDataFunction, QueryFunction, SkipToken, ThrowOnError } from '@tanstack/query-core';
2
2
  export * from '@tanstack/query-core';
3
3
  import * as solid_js from 'solid-js';
4
4
  import { JSX, Accessor } from 'solid-js';
@@ -32,8 +32,20 @@ declare class QueryClient extends QueryClient$1 {
32
32
  }
33
33
 
34
34
  type FunctionedParams<T> = () => T;
35
- interface CreateBaseQueryOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> extends QueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey> {
35
+ interface CreateBaseQueryOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> extends OmitKeyof<QueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>, 'suspense'> {
36
+ /**
37
+ * Only applicable while rendering queries on the server with streaming.
38
+ * Set `deferStream` to `true` to wait for the query to resolve on the server before flushing the stream.
39
+ * This can be useful to avoid sending a loading state to the client before the query has resolved.
40
+ * Defaults to `false`.
41
+ */
36
42
  deferStream?: boolean;
43
+ /**
44
+ * @deprecated The `suspense` option has been deprecated in v5 and will be removed in the next major version.
45
+ * The `data` property on createQuery is a SolidJS resource and will automatically suspend when the data is loading.
46
+ * Setting `suspense` to `false` will be a no-op.
47
+ */
48
+ suspense?: boolean;
37
49
  }
38
50
  interface SolidQueryOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> extends CreateBaseQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey> {
39
51
  }
@@ -42,9 +54,21 @@ type CreateBaseQueryResult<TData = unknown, TError = DefaultError> = QueryObserv
42
54
  type CreateQueryResult<TData = unknown, TError = DefaultError> = CreateBaseQueryResult<TData, TError>;
43
55
  type DefinedCreateBaseQueryResult<TData = unknown, TError = DefaultError> = DefinedQueryObserverResult<TData, TError>;
44
56
  type DefinedCreateQueryResult<TData = unknown, TError = DefaultError> = DefinedCreateBaseQueryResult<TData, TError>;
45
- interface SolidInfiniteQueryOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TPageParam = unknown> extends OmitKeyof<InfiniteQueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey, TPageParam>, 'queryKey'> {
57
+ interface SolidInfiniteQueryOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TPageParam = unknown> extends OmitKeyof<InfiniteQueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey, TPageParam>, 'queryKey' | 'suspense'> {
46
58
  queryKey: TQueryKey;
59
+ /**
60
+ * Only applicable while rendering queries on the server with streaming.
61
+ * Set `deferStream` to `true` to wait for the query to resolve on the server before flushing the stream.
62
+ * This can be useful to avoid sending a loading state to the client before the query has resolved.
63
+ * Defaults to `false`.
64
+ */
47
65
  deferStream?: boolean;
66
+ /**
67
+ * @deprecated The `suspense` option has been deprecated in v5 and will be removed in the next major version.
68
+ * The `data` property on createInfiniteQuery is a SolidJS resource and will automatically suspend when the data is loading.
69
+ * Setting `suspense` to `false` will be a no-op.
70
+ */
71
+ suspense?: boolean;
48
72
  }
49
73
  type CreateInfiniteQueryOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TPageParam = unknown> = FunctionedParams<SolidInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey, TPageParam>>;
50
74
  type CreateInfiniteQueryResult<TData = unknown, TError = DefaultError> = InfiniteQueryObserverResult<TData, TError>;
@@ -69,8 +93,12 @@ type UndefinedInitialDataOptions<TQueryFnData = unknown, TError = DefaultError,
69
93
  type DefinedInitialDataOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> = FunctionedParams<SolidQueryOptions<TQueryFnData, TError, TData, TQueryKey> & {
70
94
  initialData: TQueryFnData | (() => TQueryFnData);
71
95
  }>;
72
- declare function queryOptions<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TOptions extends UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> = UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>>(options: TOptions): TOptions;
73
- declare function queryOptions<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TOptions extends DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> = DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>>(options: TOptions): TOptions;
96
+ declare function queryOptions<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TOptions extends ReturnType<UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>> = ReturnType<UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>>>(options: ReturnType<UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>>): ReturnType<UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>> & {
97
+ queryKey: DataTag<TQueryKey, TQueryFnData>;
98
+ };
99
+ declare function queryOptions<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TOptions extends ReturnType<DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>> = ReturnType<DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>>>(options: ReturnType<DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>>): ReturnType<DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>> & {
100
+ queryKey: DataTag<TQueryKey, TQueryFnData>;
101
+ };
74
102
  declare function createQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>, queryClient?: () => QueryClient): CreateQueryResult<TData, TError>;
75
103
  declare function createQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>, queryClient?: () => QueryClient): DefinedCreateQueryResult<TData, TError>;
76
104
 
@@ -96,8 +124,15 @@ type MutationStateOptions<TResult = MutationState> = {
96
124
  };
97
125
  declare function useMutationState<TResult = MutationState>(options?: Accessor<MutationStateOptions<TResult>>, queryClient?: Accessor<QueryClient>): Accessor<Array<TResult>>;
98
126
 
99
- type CreateQueryOptionsForCreateQueries<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> = OmitKeyof<SolidQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'placeholderData'> & {
127
+ type CreateQueryOptionsForCreateQueries<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> = OmitKeyof<SolidQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'placeholderData' | 'suspense'> & {
100
128
  placeholderData?: TQueryFnData | QueriesPlaceholderDataFunction<TQueryFnData>;
129
+ /**
130
+ * @deprecated The `suspense` option has been deprecated in v5 and will be removed in the next major version.
131
+ * The `data` property on createQueries is a plain object and not a SolidJS Resource.
132
+ * It will not suspend when the data is loading.
133
+ * Setting `suspense` to `true` will be a no-op.
134
+ */
135
+ suspense?: boolean;
101
136
  };
102
137
  type MAXIMUM_DEPTH = 20;
103
138
  type GetOptions<T> = T extends {
package/build/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { DefaultError, QueryKey, OmitKeyof, QueryObserverOptions as QueryObserverOptions$1, InfiniteQueryObserverOptions as InfiniteQueryObserverOptions$1, DefaultOptions as DefaultOptions$1, QueryClientConfig as QueryClientConfig$1, QueryClient as QueryClient$1, QueryObserverResult, DefinedQueryObserverResult, InfiniteQueryObserverResult, MutationObserverOptions, MutateFunction, MutationObserverResult, QueryFilters, InfiniteData, MutationFilters, MutationState, Mutation, QueriesPlaceholderDataFunction, QueryFunction, SkipToken, ThrowOnError } from '@tanstack/query-core';
1
+ import { DefaultError, QueryKey, OmitKeyof, QueryObserverOptions as QueryObserverOptions$1, InfiniteQueryObserverOptions as InfiniteQueryObserverOptions$1, DefaultOptions as DefaultOptions$1, QueryClientConfig as QueryClientConfig$1, QueryClient as QueryClient$1, QueryObserverResult, DefinedQueryObserverResult, InfiniteQueryObserverResult, MutationObserverOptions, MutateFunction, MutationObserverResult, DataTag, QueryFilters, InfiniteData, MutationFilters, MutationState, Mutation, QueriesPlaceholderDataFunction, QueryFunction, SkipToken, ThrowOnError } from '@tanstack/query-core';
2
2
  export * from '@tanstack/query-core';
3
3
  import * as solid_js from 'solid-js';
4
4
  import { JSX, Accessor } from 'solid-js';
@@ -32,8 +32,20 @@ declare class QueryClient extends QueryClient$1 {
32
32
  }
33
33
 
34
34
  type FunctionedParams<T> = () => T;
35
- interface CreateBaseQueryOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> extends QueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey> {
35
+ interface CreateBaseQueryOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> extends OmitKeyof<QueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>, 'suspense'> {
36
+ /**
37
+ * Only applicable while rendering queries on the server with streaming.
38
+ * Set `deferStream` to `true` to wait for the query to resolve on the server before flushing the stream.
39
+ * This can be useful to avoid sending a loading state to the client before the query has resolved.
40
+ * Defaults to `false`.
41
+ */
36
42
  deferStream?: boolean;
43
+ /**
44
+ * @deprecated The `suspense` option has been deprecated in v5 and will be removed in the next major version.
45
+ * The `data` property on createQuery is a SolidJS resource and will automatically suspend when the data is loading.
46
+ * Setting `suspense` to `false` will be a no-op.
47
+ */
48
+ suspense?: boolean;
37
49
  }
38
50
  interface SolidQueryOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> extends CreateBaseQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey> {
39
51
  }
@@ -42,9 +54,21 @@ type CreateBaseQueryResult<TData = unknown, TError = DefaultError> = QueryObserv
42
54
  type CreateQueryResult<TData = unknown, TError = DefaultError> = CreateBaseQueryResult<TData, TError>;
43
55
  type DefinedCreateBaseQueryResult<TData = unknown, TError = DefaultError> = DefinedQueryObserverResult<TData, TError>;
44
56
  type DefinedCreateQueryResult<TData = unknown, TError = DefaultError> = DefinedCreateBaseQueryResult<TData, TError>;
45
- interface SolidInfiniteQueryOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TPageParam = unknown> extends OmitKeyof<InfiniteQueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey, TPageParam>, 'queryKey'> {
57
+ interface SolidInfiniteQueryOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TPageParam = unknown> extends OmitKeyof<InfiniteQueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey, TPageParam>, 'queryKey' | 'suspense'> {
46
58
  queryKey: TQueryKey;
59
+ /**
60
+ * Only applicable while rendering queries on the server with streaming.
61
+ * Set `deferStream` to `true` to wait for the query to resolve on the server before flushing the stream.
62
+ * This can be useful to avoid sending a loading state to the client before the query has resolved.
63
+ * Defaults to `false`.
64
+ */
47
65
  deferStream?: boolean;
66
+ /**
67
+ * @deprecated The `suspense` option has been deprecated in v5 and will be removed in the next major version.
68
+ * The `data` property on createInfiniteQuery is a SolidJS resource and will automatically suspend when the data is loading.
69
+ * Setting `suspense` to `false` will be a no-op.
70
+ */
71
+ suspense?: boolean;
48
72
  }
49
73
  type CreateInfiniteQueryOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TPageParam = unknown> = FunctionedParams<SolidInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey, TPageParam>>;
50
74
  type CreateInfiniteQueryResult<TData = unknown, TError = DefaultError> = InfiniteQueryObserverResult<TData, TError>;
@@ -69,8 +93,12 @@ type UndefinedInitialDataOptions<TQueryFnData = unknown, TError = DefaultError,
69
93
  type DefinedInitialDataOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> = FunctionedParams<SolidQueryOptions<TQueryFnData, TError, TData, TQueryKey> & {
70
94
  initialData: TQueryFnData | (() => TQueryFnData);
71
95
  }>;
72
- declare function queryOptions<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TOptions extends UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> = UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>>(options: TOptions): TOptions;
73
- declare function queryOptions<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TOptions extends DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> = DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>>(options: TOptions): TOptions;
96
+ declare function queryOptions<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TOptions extends ReturnType<UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>> = ReturnType<UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>>>(options: ReturnType<UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>>): ReturnType<UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>> & {
97
+ queryKey: DataTag<TQueryKey, TQueryFnData>;
98
+ };
99
+ declare function queryOptions<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TOptions extends ReturnType<DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>> = ReturnType<DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>>>(options: ReturnType<DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>>): ReturnType<DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>> & {
100
+ queryKey: DataTag<TQueryKey, TQueryFnData>;
101
+ };
74
102
  declare function createQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>, queryClient?: () => QueryClient): CreateQueryResult<TData, TError>;
75
103
  declare function createQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>, queryClient?: () => QueryClient): DefinedCreateQueryResult<TData, TError>;
76
104
 
@@ -96,8 +124,15 @@ type MutationStateOptions<TResult = MutationState> = {
96
124
  };
97
125
  declare function useMutationState<TResult = MutationState>(options?: Accessor<MutationStateOptions<TResult>>, queryClient?: Accessor<QueryClient>): Accessor<Array<TResult>>;
98
126
 
99
- type CreateQueryOptionsForCreateQueries<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> = OmitKeyof<SolidQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'placeholderData'> & {
127
+ type CreateQueryOptionsForCreateQueries<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> = OmitKeyof<SolidQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'placeholderData' | 'suspense'> & {
100
128
  placeholderData?: TQueryFnData | QueriesPlaceholderDataFunction<TQueryFnData>;
129
+ /**
130
+ * @deprecated The `suspense` option has been deprecated in v5 and will be removed in the next major version.
131
+ * The `data` property on createQueries is a plain object and not a SolidJS Resource.
132
+ * It will not suspend when the data is loading.
133
+ * Setting `suspense` to `true` will be a no-op.
134
+ */
135
+ suspense?: boolean;
101
136
  };
102
137
  type MAXIMUM_DEPTH = 20;
103
138
  type GetOptions<T> = T extends {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/solid-query",
3
- "version": "5.32.1",
3
+ "version": "5.34.0",
4
4
  "description": "Primitives for managing, caching and syncing asynchronous and remote data in Solid",
5
5
  "author": "tannerlinsley",
6
6
  "license": "MIT",
@@ -14,12 +14,12 @@ describe('initialData', () => {
14
14
  })
15
15
 
16
16
  it('TData should be defined when passed through queryOptions', () => {
17
- const options = queryOptions(() => ({
17
+ const options = queryOptions({
18
18
  queryKey: ['key'],
19
19
  queryFn: () => ({ wow: true }),
20
20
  initialData: { wow: true },
21
- }))
22
- const { data } = createQuery(options)
21
+ })
22
+ const { data } = createQuery(() => options)
23
23
 
24
24
  expectTypeOf(data).toEqualTypeOf<{ wow: boolean }>()
25
25
  })
@@ -0,0 +1,147 @@
1
+ import { describe, expect, expectTypeOf, it } from 'vitest'
2
+ import { QueryClient, dataTagSymbol, skipToken } from '@tanstack/query-core'
3
+ import { createQuery, queryOptions } from '../createQuery'
4
+
5
+ describe('queryOptions', () => {
6
+ it('should not allow excess properties', () => {
7
+ queryOptions({
8
+ queryKey: ['key'],
9
+ queryFn: () => Promise.resolve(5),
10
+ // @ts-expect-error this is a good error, because stallTime does not exist!
11
+ stallTime: 1000,
12
+ })
13
+ })
14
+ it('should infer types for callbacks', () => {
15
+ queryOptions({
16
+ queryKey: ['key'],
17
+ queryFn: () => Promise.resolve(5),
18
+ staleTime: 1000,
19
+ select: (data) => {
20
+ expectTypeOf(data).toEqualTypeOf<number>()
21
+ },
22
+ })
23
+ })
24
+ it('should work when passed to createQuery', () => {
25
+ const options = queryOptions({
26
+ queryKey: ['key'],
27
+ queryFn: () => Promise.resolve(5),
28
+ })
29
+
30
+ const { data } = createQuery(() => options)
31
+ expectTypeOf(data).toEqualTypeOf<number | undefined>()
32
+ })
33
+ it('should work when passed to fetchQuery', async () => {
34
+ const options = queryOptions({
35
+ queryKey: ['key'],
36
+ queryFn: () => Promise.resolve(5),
37
+ })
38
+
39
+ const data = await new QueryClient().fetchQuery(options)
40
+ expectTypeOf(data).toEqualTypeOf<number>()
41
+ })
42
+ it('should tag the queryKey with the result type of the QueryFn', () => {
43
+ expect(() => {
44
+ const { queryKey } = queryOptions({
45
+ queryKey: ['key'],
46
+ queryFn: () => Promise.resolve(5),
47
+ })
48
+
49
+ expectTypeOf(queryKey[dataTagSymbol]).toEqualTypeOf<number>()
50
+ })
51
+ })
52
+ it('should tag the queryKey even if no promise is returned', () => {
53
+ const { queryKey } = queryOptions({
54
+ queryKey: ['key'],
55
+ queryFn: () => 5,
56
+ })
57
+
58
+ expectTypeOf(queryKey[dataTagSymbol]).toEqualTypeOf<number>()
59
+ })
60
+ it('should tag the queryKey with unknown if there is no queryFn', () => {
61
+ const { queryKey } = queryOptions({
62
+ queryKey: ['key'],
63
+ })
64
+
65
+ expectTypeOf(queryKey[dataTagSymbol]).toEqualTypeOf<unknown>()
66
+ })
67
+ it('should tag the queryKey with the result type of the QueryFn if select is used', () => {
68
+ const { queryKey } = queryOptions({
69
+ queryKey: ['key'],
70
+ queryFn: () => Promise.resolve(5),
71
+ select: (data) => data.toString(),
72
+ })
73
+
74
+ expectTypeOf(queryKey[dataTagSymbol]).toEqualTypeOf<number>()
75
+ })
76
+ it('should return the proper type when passed to getQueryData', () => {
77
+ const { queryKey } = queryOptions({
78
+ queryKey: ['key'],
79
+ queryFn: () => Promise.resolve(5),
80
+ })
81
+
82
+ const queryClient = new QueryClient()
83
+ const data = queryClient.getQueryData(queryKey)
84
+ expectTypeOf(data).toEqualTypeOf<number | undefined>()
85
+ })
86
+ it('should return the proper type when passed to getQueryState', () => {
87
+ const { queryKey } = queryOptions({
88
+ queryKey: ['key'],
89
+ queryFn: () => Promise.resolve(5),
90
+ })
91
+
92
+ const queryClient = new QueryClient()
93
+ const state = queryClient.getQueryState(queryKey)
94
+ expectTypeOf(state?.data).toEqualTypeOf<number | undefined>()
95
+ })
96
+ it('should properly type updaterFn when passed to setQueryData', () => {
97
+ const { queryKey } = queryOptions({
98
+ queryKey: ['key'],
99
+ queryFn: () => Promise.resolve(5),
100
+ })
101
+
102
+ const queryClient = new QueryClient()
103
+ const data = queryClient.setQueryData(queryKey, (prev) => {
104
+ expectTypeOf(prev).toEqualTypeOf<number | undefined>()
105
+ return prev
106
+ })
107
+ expectTypeOf(data).toEqualTypeOf<number | undefined>()
108
+ })
109
+ it('should properly type value when passed to setQueryData', () => {
110
+ const { queryKey } = queryOptions({
111
+ queryKey: ['key'],
112
+ queryFn: () => Promise.resolve(5),
113
+ })
114
+
115
+ const queryClient = new QueryClient()
116
+
117
+ // @ts-expect-error value should be a number
118
+ queryClient.setQueryData(queryKey, '5')
119
+ // @ts-expect-error value should be a number
120
+ queryClient.setQueryData(queryKey, () => '5')
121
+
122
+ const data = queryClient.setQueryData(queryKey, 5)
123
+ expectTypeOf(data).toEqualTypeOf<number | undefined>()
124
+ })
125
+
126
+ it('should infer even if there is a conditional skipToken', () => {
127
+ const options = queryOptions({
128
+ queryKey: ['key'],
129
+ queryFn: Math.random() > 0.5 ? skipToken : () => Promise.resolve(5),
130
+ })
131
+
132
+ const queryClient = new QueryClient()
133
+ const data = queryClient.getQueryData(options.queryKey)
134
+ expectTypeOf(data).toEqualTypeOf<number | undefined>()
135
+ })
136
+
137
+ it('should infer to unknown if we disable a query with just a skipToken', () => {
138
+ const options = queryOptions({
139
+ queryKey: ['key'],
140
+ queryFn: skipToken,
141
+ })
142
+
143
+ const queryClient = new QueryClient()
144
+ const data = queryClient.getQueryData(options.queryKey)
145
+ expectTypeOf(data).toEqualTypeOf<unknown>()
146
+ })
147
+ })
@@ -37,9 +37,16 @@ type CreateQueryOptionsForCreateQueries<
37
37
  TQueryKey extends QueryKey = QueryKey,
38
38
  > = OmitKeyof<
39
39
  SolidQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
40
- 'placeholderData'
40
+ 'placeholderData' | 'suspense'
41
41
  > & {
42
42
  placeholderData?: TQueryFnData | QueriesPlaceholderDataFunction<TQueryFnData>
43
+ /**
44
+ * @deprecated The `suspense` option has been deprecated in v5 and will be removed in the next major version.
45
+ * The `data` property on createQueries is a plain object and not a SolidJS Resource.
46
+ * It will not suspend when the data is loading.
47
+ * Setting `suspense` to `true` will be a no-op.
48
+ */
49
+ suspense?: boolean
43
50
  }
44
51
 
45
52
  // Avoid TS depth-limit error in case of large array literal
@@ -1,7 +1,7 @@
1
1
  import { QueryObserver } from '@tanstack/query-core'
2
2
  import { createMemo } from 'solid-js'
3
3
  import { createBaseQuery } from './createBaseQuery'
4
- import type { DefaultError, QueryKey } from '@tanstack/query-core'
4
+ import type { DataTag, DefaultError, QueryKey } from '@tanstack/query-core'
5
5
  import type { QueryClient } from './QueryClient'
6
6
  import type { Accessor } from 'solid-js'
7
7
  import type {
@@ -39,26 +39,40 @@ export function queryOptions<
39
39
  TError = unknown,
40
40
  TData = TQueryFnData,
41
41
  TQueryKey extends QueryKey = QueryKey,
42
- TOptions extends UndefinedInitialDataOptions<
43
- TQueryFnData,
44
- TError,
45
- TData,
46
- TQueryKey
47
- > = UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
48
- >(options: TOptions): TOptions
42
+ TOptions extends ReturnType<
43
+ UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>
44
+ > = ReturnType<
45
+ UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>
46
+ >,
47
+ >(
48
+ options: ReturnType<
49
+ UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>
50
+ >,
51
+ ): ReturnType<
52
+ UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>
53
+ > & {
54
+ queryKey: DataTag<TQueryKey, TQueryFnData>
55
+ }
49
56
 
50
57
  export function queryOptions<
51
58
  TQueryFnData = unknown,
52
59
  TError = unknown,
53
60
  TData = TQueryFnData,
54
61
  TQueryKey extends QueryKey = QueryKey,
55
- TOptions extends DefinedInitialDataOptions<
56
- TQueryFnData,
57
- TError,
58
- TData,
59
- TQueryKey
60
- > = DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
61
- >(options: TOptions): TOptions
62
+ TOptions extends ReturnType<
63
+ DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>
64
+ > = ReturnType<
65
+ DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>
66
+ >,
67
+ >(
68
+ options: ReturnType<
69
+ DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>
70
+ >,
71
+ ): ReturnType<
72
+ DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>
73
+ > & {
74
+ queryKey: DataTag<TQueryKey, TQueryFnData>
75
+ }
62
76
 
63
77
  export function queryOptions(options: unknown) {
64
78
  return options
package/src/types.ts CHANGED
@@ -24,14 +24,23 @@ export interface CreateBaseQueryOptions<
24
24
  TData = TQueryFnData,
25
25
  TQueryData = TQueryFnData,
26
26
  TQueryKey extends QueryKey = QueryKey,
27
- > extends QueryObserverOptions<
28
- TQueryFnData,
29
- TError,
30
- TData,
31
- TQueryData,
32
- TQueryKey
27
+ > extends OmitKeyof<
28
+ QueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>,
29
+ 'suspense'
33
30
  > {
31
+ /**
32
+ * Only applicable while rendering queries on the server with streaming.
33
+ * Set `deferStream` to `true` to wait for the query to resolve on the server before flushing the stream.
34
+ * This can be useful to avoid sending a loading state to the client before the query has resolved.
35
+ * Defaults to `false`.
36
+ */
34
37
  deferStream?: boolean
38
+ /**
39
+ * @deprecated The `suspense` option has been deprecated in v5 and will be removed in the next major version.
40
+ * The `data` property on createQuery is a SolidJS resource and will automatically suspend when the data is loading.
41
+ * Setting `suspense` to `false` will be a no-op.
42
+ */
43
+ suspense?: boolean
35
44
  }
36
45
 
37
46
  export interface SolidQueryOptions<
@@ -93,10 +102,22 @@ export interface SolidInfiniteQueryOptions<
93
102
  TQueryKey,
94
103
  TPageParam
95
104
  >,
96
- 'queryKey'
105
+ 'queryKey' | 'suspense'
97
106
  > {
98
107
  queryKey: TQueryKey
108
+ /**
109
+ * Only applicable while rendering queries on the server with streaming.
110
+ * Set `deferStream` to `true` to wait for the query to resolve on the server before flushing the stream.
111
+ * This can be useful to avoid sending a loading state to the client before the query has resolved.
112
+ * Defaults to `false`.
113
+ */
99
114
  deferStream?: boolean
115
+ /**
116
+ * @deprecated The `suspense` option has been deprecated in v5 and will be removed in the next major version.
117
+ * The `data` property on createInfiniteQuery is a SolidJS resource and will automatically suspend when the data is loading.
118
+ * Setting `suspense` to `false` will be a no-op.
119
+ */
120
+ suspense?: boolean
100
121
  }
101
122
 
102
123
  export type CreateInfiniteQueryOptions<