{"version":3,"file":"hydration.mjs","sources":["../../../src/vanilla/hydration.ts"],"sourcesContent":["import { ObservableQueryOptions } from './observableQuery'\nimport { PrimitiveQuery } from './primitiveQuery'\nimport type { QueryClient } from './queryClient'\nimport type { QueryInfo, QueryInfoState } from './queryInfo'\nimport { QueryMeta } from './typeUtils'\nimport { isGeneratedKey, isPlainObject } from './utils'\n\n// TYPES\n\nexport interface DehydrateOptions {\n  shouldDehydrateQuery?: (queryInfo: QueryInfo) => boolean\n}\n\nexport interface HydrateOptions {\n  defaultOptions?: {\n    queries?: Omit<\n      ObservableQueryOptions<any, any, any>,\n      'query' | '_defaulted'\n    >\n  }\n}\n\ninterface DehydratedQuery {\n  query: PrimitiveQuery\n  variables?: any\n  queryHash: string\n  state: QueryInfoState<any, any>\n  meta?: QueryMeta\n}\n\nexport type DehydratedState = {\n  queries: DehydratedQuery[]\n}\n\n// Most config is not dehydrated but instead meant to configure again when\n// consuming the de/rehydrated data, typically with useQuery on the client.\n// Sometimes it might make sense to prefetch data on the server and include\n// in the html-payload, but not consume it on the initial render.\nconst dehydrateQuery = ({\n  query,\n  queryHash,\n  state,\n  variables,\n  meta,\n}: QueryInfo): DehydratedQuery => {\n  return {\n    query: {\n      key: query.key,\n      ...(query.$inf$ && { $inf$: true }),\n    } as PrimitiveQuery,\n    queryHash,\n    state,\n    ...(typeof variables !== 'undefined' && { variables }),\n    ...(meta && { meta }),\n  }\n}\n\nexport const defaultShouldDehydrateQuery = (queryInfo: QueryInfo) => {\n  return queryInfo.state.status === 'success'\n}\n\nexport const dehydrate = (\n  client: QueryClient,\n  options: DehydrateOptions = {}\n): DehydratedState => {\n  const filterQuery =\n    options.shouldDehydrateQuery ?? defaultShouldDehydrateQuery\n\n  const queries = client\n    .getQueryCache()\n    .getAll()\n    .flatMap(queryInfo =>\n      !isGeneratedKey(queryInfo.query.key) && filterQuery(queryInfo)\n        ? [dehydrateQuery(queryInfo)]\n        : []\n    )\n\n  return { queries }\n}\n\nexport const hydrate = (\n  client: QueryClient,\n  dehydratedState: unknown,\n  options?: HydrateOptions\n): void => {\n  if (!isPlainObject(dehydratedState)) {\n    return\n  }\n\n  const queryCache = client.getQueryCache()\n\n  const { queries } = (dehydratedState as DehydratedState) || {}\n\n  queries.forEach(({ state, ...queryOptions }) => {\n    const queryInfo = queryCache.get(queryOptions.queryHash)\n\n    // Reset fetch status to idle in the dehydrated state to avoid\n    // queryInfo being stuck in fetching state upon hydration\n    const dehydratedQueryState = {\n      ...state,\n      fetchStatus: 'idle' as const,\n    }\n\n    // Do not hydrate if an existing queryInfo exists with newer data\n    if (queryInfo) {\n      if (queryInfo.state.dataUpdatedAt < dehydratedQueryState.dataUpdatedAt) {\n        queryInfo.setState(dehydratedQueryState)\n      }\n      return\n    }\n\n    // Restore queryInfo\n    queryCache.build(\n      client,\n      {\n        ...options?.defaultOptions?.queries,\n        ...queryOptions,\n      },\n      dehydratedQueryState\n    )\n  })\n}\n"],"names":["dehydrateQuery","query","queryHash","state","variables","meta","key","$inf$","defaultShouldDehydrateQuery","queryInfo","status","dehydrate","client","options","_options$shouldDehydr","filterQuery","shouldDehydrateQuery","queries","getQueryCache","getAll","flatMap","isGeneratedKey","hydrate","dehydratedState","isPlainObject","queryCache","forEach","queryOptions","_options$defaultOptio","get","dehydratedQueryState","fetchStatus","dataUpdatedAt","setState","build","defaultOptions"],"mappings":"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"}