MCPcopy
hub / github.com/TanStack/query / hydrate

Function hydrate

packages/query-core/src/hydration.ts:165–269  ·  view source on GitHub ↗
(
  client: QueryClient,
  dehydratedState: unknown,
  options?: HydrateOptions,
)

Source from the content-addressed store, hash-verified

163}
164
165export function hydrate(
166 client: QueryClient,
167 dehydratedState: unknown,
168 options?: HydrateOptions,
169): void {
170 if (typeof dehydratedState !== 'object' || dehydratedState === null) {
171 return
172 }
173
174 const mutationCache = client.getMutationCache()
175 const queryCache = client.getQueryCache()
176 const deserializeData =
177 options?.defaultOptions?.deserializeData ??
178 client.getDefaultOptions().hydrate?.deserializeData ??
179 defaultTransformerFn
180
181 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
182 const mutations = (dehydratedState as DehydratedState).mutations || []
183 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
184 const queries = (dehydratedState as DehydratedState).queries || []
185
186 mutations.forEach(({ state, ...mutationOptions }) => {
187 mutationCache.build(
188 client,
189 {
190 ...client.getDefaultOptions().hydrate?.mutations,
191 ...options?.defaultOptions?.mutations,
192 ...mutationOptions,
193 },
194 state,
195 )
196 })
197
198 queries.forEach(
199 ({ queryKey, state, queryHash, meta, promise, dehydratedAt }) => {
200 const syncData = promise ? tryResolveSync(promise) : undefined
201 const rawData = state.data === undefined ? syncData?.data : state.data
202 const data = rawData === undefined ? rawData : deserializeData(rawData)
203
204 let query = queryCache.get(queryHash)
205 const existingQueryIsPending = query?.state.status === 'pending'
206 const existingQueryIsFetching = query?.state.fetchStatus === 'fetching'
207
208 // Do not hydrate if an existing query exists with newer data
209 if (query) {
210 const hasNewerSyncData =
211 syncData &&
212 // We only need this undefined check to handle older dehydration
213 // payloads that might not have dehydratedAt
214 dehydratedAt !== undefined &&
215 dehydratedAt > query.state.dataUpdatedAt
216 if (
217 state.dataUpdatedAt > query.state.dataUpdatedAt ||
218 hasNewerSyncData
219 ) {
220 // omit fetchStatus from dehydrated state
221 // so that query stays in its current fetchStatus
222 const { fetchStatus: _ignored, ...serializedState } = state

Callers 11

HydrationBoundaryFunction · 0.90
useHydrateFunction · 0.90
onHydratedFunction · 0.90
hydration.test.tsxFile · 0.90
useQuery.test.tsxFile · 0.85
query.test.tsxFile · 0.85
vue-query.tsFile · 0.85

Calls 8

tryResolveSyncFunction · 0.90
getMutationCacheMethod · 0.80
getQueryCacheMethod · 0.80
getDefaultOptionsMethod · 0.80
getMethod · 0.80
setStateMethod · 0.80
buildMethod · 0.45
fetchMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…