@tanstack/react-query 5.0.0-beta.9 → 5.0.0-rc.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/codemods/coverage/clover.xml +2 -2
- package/build/codemods/coverage/index.html +1 -1
- package/build/legacy/HydrationBoundary.cjs +37 -2
- package/build/legacy/HydrationBoundary.cjs.map +1 -1
- package/build/legacy/HydrationBoundary.d.cts +3 -1
- package/build/legacy/HydrationBoundary.d.ts +3 -1
- package/build/legacy/HydrationBoundary.js +37 -2
- package/build/legacy/HydrationBoundary.js.map +1 -1
- package/build/legacy/index.cjs +3 -0
- package/build/legacy/index.cjs.map +1 -1
- package/build/legacy/index.d.cts +1 -0
- package/build/legacy/index.d.ts +1 -0
- package/build/legacy/index.js +2 -0
- package/build/legacy/index.js.map +1 -1
- package/build/legacy/queryOptions.cjs.map +1 -1
- package/build/legacy/queryOptions.d.cts +7 -3
- package/build/legacy/queryOptions.d.ts +7 -3
- package/build/legacy/queryOptions.js.map +1 -1
- package/build/legacy/suspense.cjs +3 -0
- package/build/legacy/suspense.cjs.map +1 -1
- package/build/legacy/suspense.d.cts +3 -2
- package/build/legacy/suspense.d.ts +3 -2
- package/build/legacy/suspense.js +2 -0
- package/build/legacy/suspense.js.map +1 -1
- package/build/legacy/types.cjs.map +1 -1
- package/build/legacy/types.d.cts +4 -4
- package/build/legacy/types.d.ts +4 -4
- package/build/legacy/useQueries.cjs.map +1 -1
- package/build/legacy/useQueries.d.cts +4 -4
- package/build/legacy/useQueries.d.ts +4 -4
- package/build/legacy/useQueries.js.map +1 -1
- package/build/legacy/useSuspenseQueries.cjs +47 -0
- package/build/legacy/useSuspenseQueries.cjs.map +1 -0
- package/build/legacy/useSuspenseQueries.d.cts +66 -0
- package/build/legacy/useSuspenseQueries.d.ts +66 -0
- package/build/legacy/useSuspenseQueries.js +23 -0
- package/build/legacy/useSuspenseQueries.js.map +1 -0
- package/build/legacy/useSuspenseQuery.cjs +2 -1
- package/build/legacy/useSuspenseQuery.cjs.map +1 -1
- package/build/legacy/useSuspenseQuery.js +2 -1
- package/build/legacy/useSuspenseQuery.js.map +1 -1
- package/build/legacy/utils.cjs.map +1 -1
- package/build/legacy/utils.d.cts +1 -1
- package/build/legacy/utils.d.ts +1 -1
- package/build/legacy/utils.js.map +1 -1
- package/build/modern/HydrationBoundary.cjs +37 -2
- package/build/modern/HydrationBoundary.cjs.map +1 -1
- package/build/modern/HydrationBoundary.d.cts +3 -1
- package/build/modern/HydrationBoundary.d.ts +3 -1
- package/build/modern/HydrationBoundary.js +37 -2
- package/build/modern/HydrationBoundary.js.map +1 -1
- package/build/modern/index.cjs +3 -0
- package/build/modern/index.cjs.map +1 -1
- package/build/modern/index.d.cts +1 -0
- package/build/modern/index.d.ts +1 -0
- package/build/modern/index.js +2 -0
- package/build/modern/index.js.map +1 -1
- package/build/modern/queryOptions.cjs.map +1 -1
- package/build/modern/queryOptions.d.cts +7 -3
- package/build/modern/queryOptions.d.ts +7 -3
- package/build/modern/queryOptions.js.map +1 -1
- package/build/modern/suspense.cjs +3 -0
- package/build/modern/suspense.cjs.map +1 -1
- package/build/modern/suspense.d.cts +3 -2
- package/build/modern/suspense.d.ts +3 -2
- package/build/modern/suspense.js +2 -0
- package/build/modern/suspense.js.map +1 -1
- package/build/modern/types.cjs.map +1 -1
- package/build/modern/types.d.cts +4 -4
- package/build/modern/types.d.ts +4 -4
- package/build/modern/useQueries.cjs.map +1 -1
- package/build/modern/useQueries.d.cts +4 -4
- package/build/modern/useQueries.d.ts +4 -4
- package/build/modern/useQueries.js.map +1 -1
- package/build/modern/useSuspenseQueries.cjs +47 -0
- package/build/modern/useSuspenseQueries.cjs.map +1 -0
- package/build/modern/useSuspenseQueries.d.cts +66 -0
- package/build/modern/useSuspenseQueries.d.ts +66 -0
- package/build/modern/useSuspenseQueries.js +23 -0
- package/build/modern/useSuspenseQueries.js.map +1 -0
- package/build/modern/useSuspenseQuery.cjs +2 -1
- package/build/modern/useSuspenseQuery.cjs.map +1 -1
- package/build/modern/useSuspenseQuery.js +2 -1
- package/build/modern/useSuspenseQuery.js.map +1 -1
- package/build/modern/utils.cjs.map +1 -1
- package/build/modern/utils.d.cts +1 -1
- package/build/modern/utils.d.ts +1 -1
- package/build/modern/utils.js.map +1 -1
- package/package.json +7 -3
- package/src/HydrationBoundary.tsx +78 -8
- package/src/__tests__/HydrationBoundary.test.tsx +111 -7
- package/src/__tests__/QueryResetErrorBoundary.test.tsx +10 -6
- package/src/__tests__/fine-grained-persister.test.tsx +163 -0
- package/src/__tests__/queryOptions.types.test.tsx +31 -0
- package/src/__tests__/ssr.test.tsx +2 -2
- package/src/__tests__/suspense.test.tsx +94 -386
- package/src/__tests__/useInfiniteQuery.test.tsx +44 -44
- package/src/__tests__/useInfiniteQuery.type.test.tsx +10 -10
- package/src/__tests__/useIsFetching.test.tsx +2 -2
- package/src/__tests__/useMutation.test.tsx +4 -4
- package/src/__tests__/useMutationState.test.tsx +4 -4
- package/src/__tests__/useQueries.test.tsx +65 -64
- package/src/__tests__/useQuery.test.tsx +142 -141
- package/src/__tests__/useQuery.types.test.tsx +34 -0
- package/src/__tests__/utils.tsx +0 -7
- package/src/index.ts +5 -0
- package/src/queryOptions.ts +11 -3
- package/src/suspense.ts +12 -0
- package/src/types.ts +18 -12
- package/src/useQueries.ts +34 -28
- package/src/useSuspenseQueries.ts +164 -0
- package/src/useSuspenseQuery.ts +2 -1
- package/src/utils.ts +1 -1
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { waitFor } from '@testing-library/react'
|
|
2
|
+
import '@testing-library/jest-dom'
|
|
3
|
+
import * as React from 'react'
|
|
4
|
+
import { QueryCache, hashKey } from '@tanstack/query-core'
|
|
5
|
+
import { vi } from 'vitest'
|
|
6
|
+
import { useQuery } from '..'
|
|
7
|
+
import {
|
|
8
|
+
PERSISTER_KEY_PREFIX,
|
|
9
|
+
experimental_createPersister,
|
|
10
|
+
} from '../../../query-persist-client-core/src'
|
|
11
|
+
import { createQueryClient, queryKey, renderWithClient, sleep } from './utils'
|
|
12
|
+
|
|
13
|
+
describe('fine grained persister', () => {
|
|
14
|
+
const queryCache = new QueryCache()
|
|
15
|
+
const queryClient = createQueryClient({ queryCache })
|
|
16
|
+
|
|
17
|
+
it('should restore query state from persister and not refetch', async () => {
|
|
18
|
+
const key = queryKey()
|
|
19
|
+
const hash = hashKey(key)
|
|
20
|
+
const spy = vi.fn(() => Promise.resolve('Works from queryFn'))
|
|
21
|
+
|
|
22
|
+
const mapStorage = new Map()
|
|
23
|
+
const storage = {
|
|
24
|
+
getItem: (itemKey: string) => Promise.resolve(mapStorage.get(itemKey)),
|
|
25
|
+
setItem: async (itemKey: string, value: unknown) => {
|
|
26
|
+
mapStorage.set(itemKey, value)
|
|
27
|
+
},
|
|
28
|
+
removeItem: async (itemKey: string) => {
|
|
29
|
+
mapStorage.delete(itemKey)
|
|
30
|
+
},
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
await storage.setItem(
|
|
34
|
+
`${PERSISTER_KEY_PREFIX}-${hash}`,
|
|
35
|
+
JSON.stringify({
|
|
36
|
+
buster: '',
|
|
37
|
+
queryHash: hash,
|
|
38
|
+
queryKey: key,
|
|
39
|
+
state: {
|
|
40
|
+
dataUpdatedAt: Date.now(),
|
|
41
|
+
data: 'Works from persister',
|
|
42
|
+
},
|
|
43
|
+
}),
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
function Test() {
|
|
47
|
+
const [_, setRef] = React.useState<HTMLDivElement | null>()
|
|
48
|
+
|
|
49
|
+
const { data } = useQuery({
|
|
50
|
+
queryKey: key,
|
|
51
|
+
queryFn: spy,
|
|
52
|
+
persister: experimental_createPersister({
|
|
53
|
+
storage,
|
|
54
|
+
}),
|
|
55
|
+
staleTime: 5000,
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
return <div ref={(value) => setRef(value)}>{data}</div>
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const rendered = renderWithClient(queryClient, <Test />)
|
|
62
|
+
|
|
63
|
+
await waitFor(() => rendered.getByText('Works from persister'))
|
|
64
|
+
expect(spy).not.toHaveBeenCalled()
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
it('should restore query state from persister and refetch', async () => {
|
|
68
|
+
const key = queryKey()
|
|
69
|
+
const hash = hashKey(key)
|
|
70
|
+
const spy = vi.fn(async () => {
|
|
71
|
+
await sleep(5)
|
|
72
|
+
|
|
73
|
+
return 'Works from queryFn'
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
const mapStorage = new Map()
|
|
77
|
+
const storage = {
|
|
78
|
+
getItem: (itemKey: string) => Promise.resolve(mapStorage.get(itemKey)),
|
|
79
|
+
setItem: async (itemKey: string, value: unknown) => {
|
|
80
|
+
mapStorage.set(itemKey, value)
|
|
81
|
+
},
|
|
82
|
+
removeItem: async (itemKey: string) => {
|
|
83
|
+
mapStorage.delete(itemKey)
|
|
84
|
+
},
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
await storage.setItem(
|
|
88
|
+
`${PERSISTER_KEY_PREFIX}-${hash}`,
|
|
89
|
+
JSON.stringify({
|
|
90
|
+
buster: '',
|
|
91
|
+
queryHash: hash,
|
|
92
|
+
queryKey: key,
|
|
93
|
+
state: {
|
|
94
|
+
dataUpdatedAt: Date.now(),
|
|
95
|
+
data: 'Works from persister',
|
|
96
|
+
},
|
|
97
|
+
}),
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
function Test() {
|
|
101
|
+
const [_, setRef] = React.useState<HTMLDivElement | null>()
|
|
102
|
+
|
|
103
|
+
const { data } = useQuery({
|
|
104
|
+
queryKey: key,
|
|
105
|
+
queryFn: spy,
|
|
106
|
+
persister: experimental_createPersister({
|
|
107
|
+
storage,
|
|
108
|
+
}),
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
return <div ref={(value) => setRef(value)}>{data}</div>
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const rendered = renderWithClient(queryClient, <Test />)
|
|
115
|
+
|
|
116
|
+
await waitFor(() => rendered.getByText('Works from persister'))
|
|
117
|
+
await waitFor(() => rendered.getByText('Works from queryFn'))
|
|
118
|
+
expect(spy).toHaveBeenCalledTimes(1)
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
it('should store query state to persister after fetch', async () => {
|
|
122
|
+
const key = queryKey()
|
|
123
|
+
const hash = hashKey(key)
|
|
124
|
+
const spy = vi.fn(() => Promise.resolve('Works from queryFn'))
|
|
125
|
+
|
|
126
|
+
const mapStorage = new Map()
|
|
127
|
+
const storage = {
|
|
128
|
+
getItem: (itemKey: string) => Promise.resolve(mapStorage.get(itemKey)),
|
|
129
|
+
setItem: async (itemKey: string, value: unknown) => {
|
|
130
|
+
mapStorage.set(itemKey, value)
|
|
131
|
+
},
|
|
132
|
+
removeItem: async (itemKey: string) => {
|
|
133
|
+
mapStorage.delete(itemKey)
|
|
134
|
+
},
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function Test() {
|
|
138
|
+
const [_, setRef] = React.useState<HTMLDivElement | null>()
|
|
139
|
+
|
|
140
|
+
const { data } = useQuery({
|
|
141
|
+
queryKey: key,
|
|
142
|
+
queryFn: spy,
|
|
143
|
+
persister: experimental_createPersister({
|
|
144
|
+
storage,
|
|
145
|
+
}),
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
return <div ref={(value) => setRef(value)}>{data}</div>
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const rendered = renderWithClient(queryClient, <Test />)
|
|
152
|
+
|
|
153
|
+
await waitFor(() => rendered.getByText('Works from queryFn'))
|
|
154
|
+
expect(spy).toHaveBeenCalledTimes(1)
|
|
155
|
+
|
|
156
|
+
const storedItem = await storage.getItem(`${PERSISTER_KEY_PREFIX}-${hash}`)
|
|
157
|
+
expect(JSON.parse(storedItem)).toMatchObject({
|
|
158
|
+
state: {
|
|
159
|
+
data: 'Works from queryFn',
|
|
160
|
+
},
|
|
161
|
+
})
|
|
162
|
+
})
|
|
163
|
+
})
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { queryOptions } from '../queryOptions'
|
|
2
|
+
import { doNotExecute } from './utils'
|
|
3
|
+
import type { Equal, Expect } from './utils'
|
|
4
|
+
|
|
5
|
+
describe('queryOptions', () => {
|
|
6
|
+
it('should not allow excess properties', () => {
|
|
7
|
+
doNotExecute(() => {
|
|
8
|
+
// @ts-expect-error this is a good error, because stallTime does not exist!
|
|
9
|
+
return queryOptions({
|
|
10
|
+
queryKey: ['key'],
|
|
11
|
+
queryFn: () => Promise.resolve(5),
|
|
12
|
+
stallTime: 1000,
|
|
13
|
+
})
|
|
14
|
+
})
|
|
15
|
+
})
|
|
16
|
+
it('should infer types for callbacks', () => {
|
|
17
|
+
doNotExecute(() => {
|
|
18
|
+
return queryOptions({
|
|
19
|
+
queryKey: ['key'],
|
|
20
|
+
queryFn: () => Promise.resolve(5),
|
|
21
|
+
staleTime: 1000,
|
|
22
|
+
select: (data) => {
|
|
23
|
+
// @ts-expect-error data is in fact inferred as unknown
|
|
24
|
+
// see https://github.com/microsoft/TypeScript/issues/47599
|
|
25
|
+
const result: Expect<Equal<number, typeof data>> = true
|
|
26
|
+
return result
|
|
27
|
+
},
|
|
28
|
+
})
|
|
29
|
+
})
|
|
30
|
+
})
|
|
31
|
+
})
|
|
@@ -132,7 +132,7 @@ describe('Server Side Rendering', () => {
|
|
|
132
132
|
queryKey: key,
|
|
133
133
|
queryFn,
|
|
134
134
|
getNextPageParam: () => undefined,
|
|
135
|
-
|
|
135
|
+
initialPageParam: 0,
|
|
136
136
|
})
|
|
137
137
|
return (
|
|
138
138
|
<ul>
|
|
@@ -146,7 +146,7 @@ describe('Server Side Rendering', () => {
|
|
|
146
146
|
await queryClient.prefetchInfiniteQuery({
|
|
147
147
|
queryKey: key,
|
|
148
148
|
queryFn,
|
|
149
|
-
|
|
149
|
+
initialPageParam: 0,
|
|
150
150
|
})
|
|
151
151
|
|
|
152
152
|
const markup = renderToString(
|