@tanstack/query-core 5.24.8 → 5.26.3

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.
Files changed (137) hide show
  1. package/build/legacy/focusManager.cjs +2 -1
  2. package/build/legacy/focusManager.cjs.map +1 -1
  3. package/build/legacy/focusManager.d.cts +2 -1
  4. package/build/legacy/focusManager.d.ts +2 -1
  5. package/build/legacy/focusManager.js +2 -1
  6. package/build/legacy/focusManager.js.map +1 -1
  7. package/build/legacy/hydration.d.cts +1 -1
  8. package/build/legacy/hydration.d.ts +1 -1
  9. package/build/legacy/index.cjs +3 -1
  10. package/build/legacy/index.cjs.map +1 -1
  11. package/build/legacy/index.d.cts +1 -1
  12. package/build/legacy/index.d.ts +1 -1
  13. package/build/legacy/index.js +4 -2
  14. package/build/legacy/index.js.map +1 -1
  15. package/build/legacy/infiniteQueryBehavior.cjs +12 -3
  16. package/build/legacy/infiniteQueryBehavior.cjs.map +1 -1
  17. package/build/legacy/infiniteQueryBehavior.d.cts +1 -1
  18. package/build/legacy/infiniteQueryBehavior.d.ts +1 -1
  19. package/build/legacy/infiniteQueryBehavior.js +13 -4
  20. package/build/legacy/infiniteQueryBehavior.js.map +1 -1
  21. package/build/legacy/infiniteQueryObserver.d.cts +1 -1
  22. package/build/legacy/infiniteQueryObserver.d.ts +1 -1
  23. package/build/legacy/mutation.d.cts +1 -1
  24. package/build/legacy/mutation.d.ts +1 -1
  25. package/build/legacy/mutationCache.d.cts +1 -1
  26. package/build/legacy/mutationCache.d.ts +1 -1
  27. package/build/legacy/mutationObserver.d.cts +1 -1
  28. package/build/legacy/mutationObserver.d.ts +1 -1
  29. package/build/legacy/queriesObserver.d.cts +1 -1
  30. package/build/legacy/queriesObserver.d.ts +1 -1
  31. package/build/legacy/query.cjs +8 -1
  32. package/build/legacy/query.cjs.map +1 -1
  33. package/build/legacy/query.d.cts +1 -1
  34. package/build/legacy/query.d.ts +1 -1
  35. package/build/legacy/query.js +9 -2
  36. package/build/legacy/query.js.map +1 -1
  37. package/build/legacy/queryCache.d.cts +1 -1
  38. package/build/legacy/queryCache.d.ts +1 -1
  39. package/build/legacy/{queryClient-JUWz6dOI.d.cts → queryClient-QsbA-3YL.d.cts} +4 -2
  40. package/build/legacy/{queryClient-p98HhdxQ.d.ts → queryClient-pTTqDRDI.d.ts} +4 -2
  41. package/build/legacy/queryClient.cjs +5 -2
  42. package/build/legacy/queryClient.cjs.map +1 -1
  43. package/build/legacy/queryClient.d.cts +1 -1
  44. package/build/legacy/queryClient.d.ts +1 -1
  45. package/build/legacy/queryClient.js +7 -3
  46. package/build/legacy/queryClient.js.map +1 -1
  47. package/build/legacy/queryObserver.d.cts +1 -1
  48. package/build/legacy/queryObserver.d.ts +1 -1
  49. package/build/legacy/retryer.d.cts +1 -1
  50. package/build/legacy/retryer.d.ts +1 -1
  51. package/build/legacy/types.cjs.map +1 -1
  52. package/build/legacy/types.d.cts +1 -1
  53. package/build/legacy/types.d.ts +1 -1
  54. package/build/legacy/utils.cjs +3 -0
  55. package/build/legacy/utils.cjs.map +1 -1
  56. package/build/legacy/utils.d.cts +1 -1
  57. package/build/legacy/utils.d.ts +1 -1
  58. package/build/legacy/utils.js +2 -0
  59. package/build/legacy/utils.js.map +1 -1
  60. package/build/modern/focusManager.cjs +2 -1
  61. package/build/modern/focusManager.cjs.map +1 -1
  62. package/build/modern/focusManager.d.cts +2 -1
  63. package/build/modern/focusManager.d.ts +2 -1
  64. package/build/modern/focusManager.js +2 -1
  65. package/build/modern/focusManager.js.map +1 -1
  66. package/build/modern/hydration.d.cts +1 -1
  67. package/build/modern/hydration.d.ts +1 -1
  68. package/build/modern/index.cjs +3 -1
  69. package/build/modern/index.cjs.map +1 -1
  70. package/build/modern/index.d.cts +1 -1
  71. package/build/modern/index.d.ts +1 -1
  72. package/build/modern/index.js +4 -2
  73. package/build/modern/index.js.map +1 -1
  74. package/build/modern/infiniteQueryBehavior.cjs +12 -3
  75. package/build/modern/infiniteQueryBehavior.cjs.map +1 -1
  76. package/build/modern/infiniteQueryBehavior.d.cts +1 -1
  77. package/build/modern/infiniteQueryBehavior.d.ts +1 -1
  78. package/build/modern/infiniteQueryBehavior.js +13 -4
  79. package/build/modern/infiniteQueryBehavior.js.map +1 -1
  80. package/build/modern/infiniteQueryObserver.d.cts +1 -1
  81. package/build/modern/infiniteQueryObserver.d.ts +1 -1
  82. package/build/modern/mutation.d.cts +1 -1
  83. package/build/modern/mutation.d.ts +1 -1
  84. package/build/modern/mutationCache.d.cts +1 -1
  85. package/build/modern/mutationCache.d.ts +1 -1
  86. package/build/modern/mutationObserver.d.cts +1 -1
  87. package/build/modern/mutationObserver.d.ts +1 -1
  88. package/build/modern/queriesObserver.d.cts +1 -1
  89. package/build/modern/queriesObserver.d.ts +1 -1
  90. package/build/modern/query.cjs +8 -1
  91. package/build/modern/query.cjs.map +1 -1
  92. package/build/modern/query.d.cts +1 -1
  93. package/build/modern/query.d.ts +1 -1
  94. package/build/modern/query.js +9 -2
  95. package/build/modern/query.js.map +1 -1
  96. package/build/modern/queryCache.d.cts +1 -1
  97. package/build/modern/queryCache.d.ts +1 -1
  98. package/build/modern/{queryClient-JUWz6dOI.d.cts → queryClient-QsbA-3YL.d.cts} +4 -2
  99. package/build/modern/{queryClient-p98HhdxQ.d.ts → queryClient-pTTqDRDI.d.ts} +4 -2
  100. package/build/modern/queryClient.cjs +5 -2
  101. package/build/modern/queryClient.cjs.map +1 -1
  102. package/build/modern/queryClient.d.cts +1 -1
  103. package/build/modern/queryClient.d.ts +1 -1
  104. package/build/modern/queryClient.js +7 -3
  105. package/build/modern/queryClient.js.map +1 -1
  106. package/build/modern/queryObserver.d.cts +1 -1
  107. package/build/modern/queryObserver.d.ts +1 -1
  108. package/build/modern/retryer.d.cts +1 -1
  109. package/build/modern/retryer.d.ts +1 -1
  110. package/build/modern/types.cjs.map +1 -1
  111. package/build/modern/types.d.cts +1 -1
  112. package/build/modern/types.d.ts +1 -1
  113. package/build/modern/utils.cjs +3 -0
  114. package/build/modern/utils.cjs.map +1 -1
  115. package/build/modern/utils.d.cts +1 -1
  116. package/build/modern/utils.d.ts +1 -1
  117. package/build/modern/utils.js +2 -0
  118. package/build/modern/utils.js.map +1 -1
  119. package/package.json +1 -1
  120. package/src/focusManager.ts +5 -2
  121. package/src/index.ts +2 -1
  122. package/src/infiniteQueryBehavior.ts +15 -6
  123. package/src/query.ts +11 -2
  124. package/src/queryClient.ts +10 -2
  125. package/src/tests/focusManager.test.tsx +3 -0
  126. package/src/tests/infiniteQueryObserver.test-d.tsx +62 -0
  127. package/src/tests/infiniteQueryObserver.test.tsx +2 -51
  128. package/src/tests/query.test.tsx +9 -3
  129. package/src/tests/queryClient.test-d.tsx +135 -0
  130. package/src/tests/queryClient.test.tsx +10 -0
  131. package/src/tests/queryObserver.test-d.tsx +108 -0
  132. package/src/tests/queryObserver.test.tsx +6 -40
  133. package/src/tests/utils.ts +0 -10
  134. package/src/types.ts +2 -2
  135. package/src/utils.ts +3 -0
  136. package/src/tests/queryClient.types.test.tsx +0 -174
  137. package/src/tests/queryObserver.types.test.tsx +0 -66
@@ -10,6 +10,7 @@ import {
10
10
  hydrate,
11
11
  onlineManager,
12
12
  } from '..'
13
+ import { skipToken } from '../utils'
13
14
  import {
14
15
  createQueryClient,
15
16
  mockOnlineManagerIsOnline,
@@ -1354,6 +1355,7 @@ describe('queryClient', () => {
1354
1355
  test('should refetch all active queries', async () => {
1355
1356
  const key1 = queryKey()
1356
1357
  const key2 = queryKey()
1358
+ const key3 = queryKey()
1357
1359
  const queryFn1 = vi.fn<Array<unknown>, string>().mockReturnValue('data1')
1358
1360
  const queryFn2 = vi.fn<Array<unknown>, string>().mockReturnValue('data2')
1359
1361
  const observer1 = new QueryObserver(queryClient, {
@@ -1366,13 +1368,21 @@ describe('queryClient', () => {
1366
1368
  queryFn: queryFn2,
1367
1369
  enabled: false,
1368
1370
  })
1371
+ const observer3 = new QueryObserver(queryClient, {
1372
+ queryKey: key3,
1373
+ queryFn: skipToken,
1374
+ })
1375
+ let didSkipTokenRun = false
1369
1376
  observer1.subscribe(() => undefined)
1370
1377
  observer2.subscribe(() => undefined)
1378
+ observer3.subscribe(() => (didSkipTokenRun = true))
1371
1379
  await queryClient.resetQueries()
1380
+ observer3.destroy()
1372
1381
  observer2.destroy()
1373
1382
  observer1.destroy()
1374
1383
  expect(queryFn1).toHaveBeenCalledTimes(2)
1375
1384
  expect(queryFn2).toHaveBeenCalledTimes(0)
1385
+ expect(didSkipTokenRun).toBe(false)
1376
1386
  })
1377
1387
  })
1378
1388
 
@@ -0,0 +1,108 @@
1
+ import { afterEach, beforeEach, describe, expectTypeOf, it } from 'vitest'
2
+ import { QueryObserver } from '..'
3
+ import { createQueryClient, queryKey } from './utils'
4
+ import type { QueryClient } from '..'
5
+
6
+ describe('queryObserver', () => {
7
+ let queryClient: QueryClient
8
+
9
+ beforeEach(() => {
10
+ queryClient = createQueryClient()
11
+ queryClient.mount()
12
+ })
13
+
14
+ afterEach(() => {
15
+ queryClient.clear()
16
+ })
17
+
18
+ it('should be inferred as a correct result type', () => {
19
+ const observer = new QueryObserver(queryClient, {
20
+ queryKey: queryKey(),
21
+ queryFn: () => Promise.resolve({ value: 'data' }),
22
+ })
23
+
24
+ const result = observer.getCurrentResult()
25
+
26
+ if (result.isPending) {
27
+ expectTypeOf(result.data).toEqualTypeOf<undefined>()
28
+ expectTypeOf(result.error).toEqualTypeOf<null>()
29
+ expectTypeOf(result.isLoading).toEqualTypeOf<boolean>()
30
+ expectTypeOf(result.status).toEqualTypeOf<'pending'>()
31
+ }
32
+ if (result.isLoading) {
33
+ expectTypeOf(result.data).toEqualTypeOf<undefined>()
34
+ expectTypeOf(result.error).toEqualTypeOf<null>()
35
+ expectTypeOf(result.isPending).toEqualTypeOf<true>()
36
+ expectTypeOf(result.status).toEqualTypeOf<'pending'>()
37
+ }
38
+
39
+ if (result.isLoadingError) {
40
+ expectTypeOf(result.data).toEqualTypeOf<undefined>()
41
+ expectTypeOf(result.error).toEqualTypeOf<Error>()
42
+ expectTypeOf(result.status).toEqualTypeOf<'error'>()
43
+ }
44
+
45
+ if (result.isRefetchError) {
46
+ expectTypeOf(result.data).toEqualTypeOf<{ value: string }>()
47
+ expectTypeOf(result.error).toEqualTypeOf<Error>()
48
+ expectTypeOf(result.status).toEqualTypeOf<'error'>()
49
+ }
50
+
51
+ if (result.isSuccess) {
52
+ expectTypeOf(result.data).toEqualTypeOf<{ value: string }>()
53
+ expectTypeOf(result.error).toEqualTypeOf<null>()
54
+ expectTypeOf(result.status).toEqualTypeOf<'success'>()
55
+ }
56
+ })
57
+
58
+ describe('placeholderData', () => {
59
+ it('previousQuery should have typed queryKey', () => {
60
+ const testQueryKey = ['SomeQuery', 42, { foo: 'bar' }] as const
61
+
62
+ new QueryObserver(createQueryClient(), {
63
+ queryKey: testQueryKey,
64
+ placeholderData: (_, previousQuery) => {
65
+ if (previousQuery) {
66
+ expectTypeOf(previousQuery.queryKey).toEqualTypeOf<
67
+ typeof testQueryKey
68
+ >()
69
+ }
70
+ },
71
+ })
72
+ })
73
+
74
+ it('previousQuery should have typed error', () => {
75
+ class CustomError extends Error {
76
+ name = 'CustomError' as const
77
+ }
78
+
79
+ new QueryObserver<boolean, CustomError>(createQueryClient(), {
80
+ queryKey: ['key'],
81
+ placeholderData: (_, previousQuery) => {
82
+ if (previousQuery) {
83
+ expectTypeOf(
84
+ previousQuery.state.error,
85
+ ).toEqualTypeOf<CustomError | null>()
86
+ }
87
+ return undefined
88
+ },
89
+ })
90
+ })
91
+
92
+ it('previousData should have the same type as query data', () => {
93
+ const queryData = { foo: 'bar' } as const
94
+
95
+ new QueryObserver(createQueryClient(), {
96
+ queryKey: ['key'],
97
+ queryFn: () => queryData,
98
+ select: (data) => data.foo,
99
+ placeholderData: (previousData) => {
100
+ expectTypeOf(previousData).toEqualTypeOf<
101
+ typeof queryData | undefined
102
+ >()
103
+ return undefined
104
+ },
105
+ })
106
+ })
107
+ })
108
+ })
@@ -120,7 +120,9 @@ describe('queryObserver', () => {
120
120
  })
121
121
  let observerResult
122
122
  const unsubscribe = observer.subscribe((result) => {
123
- expectTypeOf<QueryObserverResult<{ myCount: number }>>(result)
123
+ expectTypeOf(result).toEqualTypeOf<
124
+ QueryObserverResult<{ myCount: number }>
125
+ >()
124
126
  observerResult = result
125
127
  })
126
128
  await sleep(1)
@@ -136,7 +138,9 @@ describe('queryObserver', () => {
136
138
  select: (data) => ({ myCount: data.count }),
137
139
  })
138
140
  const observerResult = await observer.refetch()
139
- expectTypeOf<{ myCount: number } | undefined>(observerResult.data)
141
+ expectTypeOf(observerResult.data).toEqualTypeOf<
142
+ { myCount: number } | undefined
143
+ >()
140
144
  expect(observerResult.data).toMatchObject({ myCount: 1 })
141
145
  })
142
146
 
@@ -894,42 +898,4 @@ describe('queryObserver', () => {
894
898
 
895
899
  unsubscribe()
896
900
  })
897
-
898
- test('should be inferred as a correct result type', async () => {
899
- const key = queryKey()
900
- const data = { value: 'data' }
901
- const observer = new QueryObserver(queryClient, {
902
- queryKey: key,
903
- queryFn: () => Promise.resolve(data),
904
- })
905
-
906
- const result = observer.getCurrentResult()
907
-
908
- result.isPending &&
909
- expectTypeOf<undefined>(result.data) &&
910
- expectTypeOf<null>(result.error) &&
911
- expectTypeOf<boolean>(result.isLoading) &&
912
- expectTypeOf<'pending'>(result.status)
913
-
914
- result.isLoading &&
915
- expectTypeOf<undefined>(result.data) &&
916
- expectTypeOf<null>(result.error) &&
917
- expectTypeOf<true>(result.isPending) &&
918
- expectTypeOf<'pending'>(result.status)
919
-
920
- result.isLoadingError &&
921
- expectTypeOf<undefined>(result.data) &&
922
- expectTypeOf<Error>(result.error) &&
923
- expectTypeOf<'error'>(result.status)
924
-
925
- result.isRefetchError &&
926
- expectTypeOf<{ value: string }>(result.data) &&
927
- expectTypeOf<Error>(result.error) &&
928
- expectTypeOf<'error'>(result.status)
929
-
930
- result.isSuccess &&
931
- expectTypeOf<{ value: string }>(result.data) &&
932
- expectTypeOf<null>(result.error) &&
933
- expectTypeOf<'success'>(result.status)
934
- })
935
901
  })
@@ -57,13 +57,3 @@ export function setIsServer(isServer: boolean) {
57
57
  })
58
58
  }
59
59
  }
60
-
61
- export const doNotExecute = (_func: () => void) => true
62
-
63
- export type Equal<TTargetA, TTargetB> = (<T>() => T extends TTargetA
64
- ? 1
65
- : 2) extends <T>() => T extends TTargetB ? 1 : 2
66
- ? true
67
- : false
68
-
69
- export type Expect<T extends true> = T
package/src/types.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  import type { MutationState } from './mutation'
4
4
  import type { FetchDirection, Query, QueryBehavior } from './query'
5
5
  import type { RetryDelayValue, RetryValue } from './retryer'
6
- import type { QueryFilters, QueryTypeFilter } from './utils'
6
+ import type { QueryFilters, QueryTypeFilter, SkipToken } from './utils'
7
7
  import type { QueryCache } from './queryCache'
8
8
  import type { MutationCache } from './mutationCache'
9
9
 
@@ -147,7 +147,7 @@ export interface QueryOptions<
147
147
  * Setting it to `Infinity` will disable garbage collection.
148
148
  */
149
149
  gcTime?: number
150
- queryFn?: QueryFunction<TQueryFnData, TQueryKey, TPageParam>
150
+ queryFn?: QueryFunction<TQueryFnData, TQueryKey, TPageParam> | SkipToken
151
151
  persister?: QueryPersister<
152
152
  NoInfer<TQueryFnData>,
153
153
  NoInfer<TQueryKey>,
package/src/utils.ts CHANGED
@@ -342,3 +342,6 @@ export function addToStart<T>(items: Array<T>, item: T, max = 0): Array<T> {
342
342
  const newItems = [item, ...items]
343
343
  return max && newItems.length > max ? newItems.slice(0, -1) : newItems
344
344
  }
345
+
346
+ export const skipToken = Symbol()
347
+ export type SkipToken = typeof skipToken
@@ -1,174 +0,0 @@
1
- import { describe, it } from 'vitest'
2
- import { QueryClient } from '../queryClient'
3
- import { doNotExecute } from './utils'
4
- import type { Equal, Expect } from './utils'
5
- import type { DataTag, InfiniteData } from '../types'
6
-
7
- describe('getQueryData', () => {
8
- it('should be typed if key is tagged', () => {
9
- doNotExecute(() => {
10
- const queryKey = ['key'] as DataTag<Array<string>, number>
11
- const queryClient = new QueryClient()
12
- const data = queryClient.getQueryData(queryKey)
13
-
14
- const result: Expect<Equal<typeof data, number | undefined>> = true
15
- return result
16
- })
17
- })
18
-
19
- it('should infer unknown if key is not tagged', () => {
20
- doNotExecute(() => {
21
- const queryKey = ['key'] as const
22
- const queryClient = new QueryClient()
23
- const data = queryClient.getQueryData(queryKey)
24
-
25
- const result: Expect<Equal<typeof data, unknown>> = true
26
- return result
27
- })
28
- })
29
-
30
- it('should infer passed generic if passed', () => {
31
- doNotExecute(() => {
32
- const queryKey = ['key'] as const
33
- const queryClient = new QueryClient()
34
- const data = queryClient.getQueryData<number>(queryKey)
35
-
36
- const result: Expect<Equal<typeof data, number | undefined>> = true
37
- return result
38
- })
39
- })
40
-
41
- it('should only allow Arrays to be passed', () => {
42
- doNotExecute(() => {
43
- const queryKey = 'key' as const
44
- const queryClient = new QueryClient()
45
- // @ts-expect-error TS2345: Argument of type 'string' is not assignable to parameter of type 'QueryKey'
46
- return queryClient.getQueryData(queryKey)
47
- })
48
- })
49
- })
50
-
51
- describe('setQueryData', () => {
52
- it('updater should be typed if key is tagged', () => {
53
- doNotExecute(() => {
54
- const queryKey = ['key'] as DataTag<Array<string>, number>
55
- const queryClient = new QueryClient()
56
- const data = queryClient.setQueryData(queryKey, (prev) => {
57
- const result: Expect<Equal<typeof prev, number | undefined>> = true
58
- return result ? prev : 1
59
- })
60
-
61
- const result: Expect<Equal<typeof data, number | undefined>> = true
62
- return result
63
- })
64
- })
65
-
66
- it('value should be typed if key is tagged', () => {
67
- doNotExecute(() => {
68
- const queryKey = ['key'] as DataTag<Array<string>, number>
69
- const queryClient = new QueryClient()
70
-
71
- // @ts-expect-error value should be a number
72
- queryClient.setQueryData(queryKey, '1')
73
-
74
- // @ts-expect-error value should be a number
75
- queryClient.setQueryData(queryKey, () => '1')
76
-
77
- const data = queryClient.setQueryData(queryKey, 1)
78
-
79
- const result: Expect<Equal<typeof data, number | undefined>> = true
80
- return result
81
- })
82
- })
83
-
84
- it('should infer unknown for updater if key is not tagged', () => {
85
- doNotExecute(() => {
86
- const queryKey = ['key'] as const
87
- const queryClient = new QueryClient()
88
- const data = queryClient.setQueryData(queryKey, (prev) => {
89
- const result: Expect<Equal<typeof prev, unknown>> = true
90
- return result ? prev : 1
91
- })
92
-
93
- const result: Expect<Equal<typeof data, unknown>> = true
94
- return result
95
- })
96
- })
97
-
98
- it('should infer unknown for value if key is not tagged', () => {
99
- doNotExecute(() => {
100
- const queryKey = ['key'] as const
101
- const queryClient = new QueryClient()
102
- const data = queryClient.setQueryData(queryKey, 'foo')
103
-
104
- const result: Expect<Equal<typeof data, unknown>> = true
105
- return result
106
- })
107
- })
108
-
109
- it('should infer passed generic if passed', () => {
110
- doNotExecute(() => {
111
- const queryKey = ['key'] as const
112
- const queryClient = new QueryClient()
113
- const data = queryClient.setQueryData<string>(queryKey, (prev) => {
114
- const result: Expect<Equal<typeof prev, string | undefined>> = true
115
- return result ? prev : '1'
116
- })
117
-
118
- const result: Expect<Equal<typeof data, string | undefined>> = true
119
- return result
120
- })
121
- })
122
-
123
- it('should infer passed generic for value', () => {
124
- doNotExecute(() => {
125
- const queryKey = ['key'] as const
126
- const queryClient = new QueryClient()
127
- const data = queryClient.setQueryData<string>(queryKey, 'foo')
128
-
129
- const result: Expect<Equal<typeof data, string | undefined>> = true
130
- return result
131
- })
132
- })
133
- })
134
-
135
- describe('fetchInfiniteQuery', () => {
136
- it('should allow passing pages', () => {
137
- doNotExecute(async () => {
138
- const data = await new QueryClient().fetchInfiniteQuery({
139
- queryKey: ['key'],
140
- queryFn: () => Promise.resolve('string'),
141
- getNextPageParam: () => 1,
142
- initialPageParam: 1,
143
- pages: 5,
144
- })
145
-
146
- const result: Expect<Equal<typeof data, InfiniteData<string, number>>> =
147
- true
148
- return result
149
- })
150
- })
151
-
152
- it('should not allow passing getNextPageParam without pages', () => {
153
- doNotExecute(async () => {
154
- return new QueryClient().fetchInfiniteQuery({
155
- queryKey: ['key'],
156
- queryFn: () => Promise.resolve('string'),
157
- initialPageParam: 1,
158
- getNextPageParam: () => 1,
159
- })
160
- })
161
- })
162
-
163
- it('should not allow passing pages without getNextPageParam', () => {
164
- doNotExecute(async () => {
165
- // @ts-expect-error Property 'getNextPageParam' is missing
166
- return new QueryClient().fetchInfiniteQuery({
167
- queryKey: ['key'],
168
- queryFn: () => Promise.resolve('string'),
169
- initialPageParam: 1,
170
- pages: 5,
171
- })
172
- })
173
- })
174
- })
@@ -1,66 +0,0 @@
1
- import { describe, it } from 'vitest'
2
- import { QueryObserver } from '..'
3
- import { createQueryClient, doNotExecute } from './utils'
4
- import type { Equal, Expect } from './utils'
5
-
6
- describe('placeholderData', () => {
7
- describe('placeholderData function', () => {
8
- it('previousQuery should have typed queryKey', () => {
9
- doNotExecute(() => {
10
- const queryKey = ['SomeQuery', 42, { foo: 'bar' }] as const
11
- type QueryKey = typeof queryKey
12
-
13
- new QueryObserver(createQueryClient(), {
14
- queryKey,
15
- placeholderData: (_, previousQuery) => {
16
- const previousQueryKey = previousQuery?.queryKey
17
-
18
- const result: Expect<
19
- Equal<typeof previousQueryKey, QueryKey | undefined>
20
- > = true
21
- return result
22
- },
23
- })
24
- })
25
- })
26
-
27
- it('previousQuery should have typed error', () => {
28
- doNotExecute(() => {
29
- class CustomError extends Error {
30
- name = 'CustomError' as const
31
- }
32
-
33
- new QueryObserver<boolean, CustomError>(createQueryClient(), {
34
- queryKey: ['key'],
35
- placeholderData: (_, previousQuery) => {
36
- const error = previousQuery?.state.error
37
-
38
- const result: Expect<
39
- Equal<typeof error, CustomError | null | undefined>
40
- > = true
41
- return result
42
- },
43
- })
44
- })
45
- })
46
-
47
- it('previousData should have the same type as query data', () => {
48
- doNotExecute(() => {
49
- const queryData = { foo: 'bar' } as const
50
- type QueryData = typeof queryData
51
-
52
- new QueryObserver(createQueryClient(), {
53
- queryKey: ['key'],
54
- queryFn: () => queryData,
55
- select: (data) => data.foo,
56
- placeholderData: (previousData) => {
57
- const result: Expect<
58
- Equal<typeof previousData, QueryData | undefined>
59
- > = true
60
- return result ? previousData : undefined
61
- },
62
- })
63
- })
64
- })
65
- })
66
- })