( client: QueryClient, dehydratedState: unknown, options?: HydrateOptions, )
| 163 | } |
| 164 | |
| 165 | export 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 |
no test coverage detected
searching dependent graphs…