UNPKG

@tanstack/query-core

Version:

The framework agnostic core that powers TanStack Query

1 lines 34.6 kB
{"version":3,"file":"queryObserver.cjs","names":["Subscribable","resolveQueryValue","shallowEqualObjects","fetchState","replaceData","noop","isServerEnvironment","isValidTimeout","timeUntilStale","timeoutManager","focusManager"],"sources":["../../src/queryObserver.ts"],"sourcesContent":["import { focusManager } from './focusManager'\nimport { isServer as isServerEnvironment } from './environmentManager'\nimport { notifyManager } from './notifyManager'\nimport { fetchState } from './query'\nimport { Subscribable } from './subscribable'\nimport {\n isValidTimeout,\n noop,\n replaceData,\n resolveQueryValue,\n shallowEqualObjects,\n timeUntilStale,\n} from './utils'\nimport { timeoutManager } from './timeoutManager'\nimport type { ManagedTimerId } from './timeoutManager'\nimport type { FetchOptions, Query, QueryState } from './query'\nimport type { QueryClient } from './queryClient'\nimport type {\n DefaultError,\n DefaultedQueryObserverOptions,\n PlaceholderDataFunction,\n QueryKey,\n QueryObserverBaseResult,\n QueryObserverOptions,\n QueryObserverResult,\n RefetchOptions,\n} from './types'\n\ntype QueryObserverListener<TData, TError> = (\n result: QueryObserverResult<TData, TError>,\n) => void\n\ninterface ObserverFetchOptions extends FetchOptions {\n throwOnError?: boolean\n}\n\nexport class QueryObserver<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> extends Subscribable<QueryObserverListener<TData, TError>> {\n #client: QueryClient\n #currentQuery: Query<TQueryFnData, TError, TQueryData, TQueryKey> = undefined!\n #currentQueryInitialState: QueryState<TQueryData, TError> = undefined!\n #currentResult: QueryObserverResult<TData, TError> = undefined!\n #currentResultState?: QueryState<TQueryData, TError>\n #currentResultOptions?: QueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >\n #selectError: TError | null\n #selectFn?: (data: TQueryData) => TData\n #selectResult?: TData\n // This property keeps track of the last query with defined data.\n // It will be used to pass the previous data and query to the placeholder function between renders.\n #lastQueryWithDefinedData?: Query<TQueryFnData, TError, TQueryData, TQueryKey>\n #staleTimeoutId?: ManagedTimerId\n #refetchIntervalId?: ManagedTimerId\n #currentRefetchInterval?: number | false\n #trackedProps = new Set<keyof QueryObserverResult>()\n\n constructor(\n client: QueryClient,\n public options: QueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n ) {\n super()\n\n this.#client = client\n this.#selectError = null\n\n this.bindMethods()\n this.setOptions(options)\n }\n\n protected bindMethods(): void {\n this.refetch = this.refetch.bind(this)\n }\n\n protected onSubscribe(): void {\n if (this.listeners.size === 1) {\n this.#currentQuery.addObserver(this)\n\n if (shouldFetchOnMount(this.#currentQuery, this.options)) {\n this.#executeFetch()\n } else {\n this.updateResult()\n }\n\n this.#updateTimers()\n }\n }\n\n protected onUnsubscribe(): void {\n if (!this.hasListeners()) {\n this.destroy()\n }\n }\n\n shouldFetchOnReconnect(): boolean {\n return shouldFetchOn(\n this.#currentQuery,\n this.options,\n this.options.refetchOnReconnect,\n )\n }\n\n shouldFetchOnWindowFocus(): boolean {\n return shouldFetchOn(\n this.#currentQuery,\n this.options,\n this.options.refetchOnWindowFocus,\n )\n }\n\n destroy(): void {\n this.listeners = new Set()\n this.#clearStaleTimeout()\n this.#clearRefetchInterval()\n this.#currentQuery.removeObserver(this)\n }\n\n setOptions(\n options: QueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n ): void {\n const prevOptions = this.options\n const prevQuery = this.#currentQuery\n\n this.options = this.#client.defaultQueryOptions(options)\n\n if (\n this.options.enabled !== undefined &&\n typeof this.options.enabled !== 'boolean' &&\n typeof this.options.enabled !== 'function' &&\n typeof resolveQueryValue(this.options.enabled, this.#currentQuery) !==\n 'boolean'\n ) {\n throw new Error(\n 'Expected enabled to be a boolean or a callback that returns a boolean',\n )\n }\n\n this.#updateQuery()\n this.#currentQuery.setOptions(this.options)\n\n if (\n prevOptions._defaulted &&\n !shallowEqualObjects(this.options, prevOptions)\n ) {\n this.#client.getQueryCache().notify({\n type: 'observerOptionsUpdated',\n query: this.#currentQuery,\n observer: this,\n })\n }\n\n const mounted = this.hasListeners()\n\n // Fetch if there are subscribers\n if (\n mounted &&\n shouldFetchOptionally(\n this.#currentQuery,\n prevQuery,\n this.options,\n prevOptions,\n )\n ) {\n this.#executeFetch()\n }\n\n // Update result\n this.updateResult()\n\n // Update stale interval if needed\n if (\n mounted &&\n (this.#currentQuery !== prevQuery ||\n resolveQueryValue(this.options.enabled, this.#currentQuery) !==\n resolveQueryValue(prevOptions.enabled, this.#currentQuery) ||\n resolveQueryValue(this.options.staleTime, this.#currentQuery) !==\n resolveQueryValue(prevOptions.staleTime, this.#currentQuery))\n ) {\n this.#updateStaleTimeout()\n }\n\n const nextRefetchInterval = this.#computeRefetchInterval()\n\n // Update refetch interval if needed\n if (\n mounted &&\n (this.#currentQuery !== prevQuery ||\n resolveQueryValue(this.options.enabled, this.#currentQuery) !==\n resolveQueryValue(prevOptions.enabled, this.#currentQuery) ||\n nextRefetchInterval !== this.#currentRefetchInterval)\n ) {\n this.#updateRefetchInterval(nextRefetchInterval)\n }\n }\n\n getOptimisticResult(\n options: DefaultedQueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n ): QueryObserverResult<TData, TError> {\n const query = this.#client.getQueryCache().build(this.#client, options)\n\n const result = this.createResult(query, options)\n\n if (!shallowEqualObjects(this.getCurrentResult(), result)) {\n // this assigns the optimistic result to the current Observer\n // because if the query function changes, useQuery will be performing\n // an effect where it would fetch again.\n // When the fetch finishes, we perform a deep data cloning in order\n // to reuse objects references. This deep data clone is performed against\n // the `observer.currentResult.data` property\n // When QueryKey changes, we refresh the query and get new `optimistic`\n // result, while we leave the `observer.currentResult`, so when new data\n // arrives, it finds the old `observer.currentResult` which is related\n // to the old QueryKey. Which means that currentResult and selectData are\n // out of sync already.\n // To solve this, we move the cursor of the currentResult every time\n // an observer reads an optimistic value.\n\n // When keeping the previous data, the result doesn't change until new\n // data arrives.\n this.#currentResult = result\n this.#currentResultOptions = this.options\n this.#currentResultState = this.#currentQuery.state\n }\n return result\n }\n\n getCurrentResult(): QueryObserverResult<TData, TError> {\n return this.#currentResult\n }\n\n trackResult(\n result: QueryObserverResult<TData, TError>,\n onPropTracked?: (key: keyof QueryObserverResult) => void,\n ): QueryObserverResult<TData, TError> {\n return new Proxy(result, {\n get: (target, key) => {\n this.trackProp(key as keyof QueryObserverResult)\n onPropTracked?.(key as keyof QueryObserverResult)\n return Reflect.get(target, key)\n },\n })\n }\n\n trackProp(key: keyof QueryObserverResult) {\n this.#trackedProps.add(key)\n }\n\n getCurrentQuery(): Query<TQueryFnData, TError, TQueryData, TQueryKey> {\n return this.#currentQuery\n }\n\n refetch({ ...options }: RefetchOptions = {}): Promise<\n QueryObserverResult<TData, TError>\n > {\n return this.fetch({\n ...options,\n })\n }\n\n fetchOptimistic(\n options: QueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n ): Promise<QueryObserverResult<TData, TError>> {\n const defaultedOptions = this.#client.defaultQueryOptions(options)\n\n const query = this.#client\n .getQueryCache()\n .build(this.#client, defaultedOptions)\n\n let unsubscribe = () => {}\n let resolveEarly:\n | ((result: QueryObserverResult<TData, TError>) => void)\n | undefined\n\n const cachePromise = new Promise<QueryObserverResult<TData, TError>>(\n (resolve) => {\n resolveEarly = resolve\n unsubscribe = this.#client.getQueryCache().subscribe((event) => {\n if (\n event.type === 'updated' &&\n event.query.queryHash === query.queryHash &&\n query.state.data !== undefined\n ) {\n unsubscribe()\n resolve(this.createResult(query, defaultedOptions))\n }\n })\n },\n )\n\n return Promise.race([\n query\n .fetch()\n .then(() => {\n const result = this.createResult(query, defaultedOptions)\n // Settle the subscriber promise so both branches always settle.\n // This value is ignored by Promise.race since the fetch branch already won.\n resolveEarly?.(result)\n return result\n })\n .finally(() => {\n unsubscribe()\n }),\n cachePromise,\n ])\n }\n\n protected fetch(\n fetchOptions: ObserverFetchOptions,\n ): Promise<QueryObserverResult<TData, TError>> {\n return this.#executeFetch({\n ...fetchOptions,\n cancelRefetch: fetchOptions.cancelRefetch ?? true,\n }).then(() => {\n this.updateResult()\n return this.#currentResult\n })\n }\n\n #executeFetch(\n fetchOptions?: Omit<ObserverFetchOptions, 'initialPromise'>,\n ): Promise<TQueryData | undefined> {\n // Make sure we reference the latest query as the current one might have been removed\n this.#updateQuery()\n\n // Fetch\n let promise: Promise<TQueryData | undefined> = this.#currentQuery.fetch(\n this.options,\n fetchOptions,\n )\n\n if (!fetchOptions?.throwOnError) {\n promise = promise.catch(noop)\n }\n\n return promise\n }\n\n #shouldScheduleTimer(timeout: unknown): timeout is number {\n return (\n !isServerEnvironment() &&\n resolveQueryValue(this.options.enabled, this.#currentQuery) !== false &&\n isValidTimeout(timeout)\n )\n }\n\n #updateStaleTimeout(): void {\n this.#clearStaleTimeout()\n const staleTime = resolveQueryValue(\n this.options.staleTime,\n this.#currentQuery,\n )\n\n if (this.#currentResult.isStale || !this.#shouldScheduleTimer(staleTime)) {\n return\n }\n\n const time = timeUntilStale(this.#currentResult.dataUpdatedAt, staleTime)\n\n // The timeout is sometimes triggered 1 ms before the stale time expiration.\n // To mitigate this issue we always add 1 ms to the timeout.\n const timeout = time + 1\n\n this.#staleTimeoutId = timeoutManager.setTimeout(() => {\n if (!this.#currentResult.isStale) {\n this.updateResult()\n }\n }, timeout)\n }\n\n #computeRefetchInterval() {\n return (\n (typeof this.options.refetchInterval === 'function'\n ? this.options.refetchInterval(this.#currentQuery)\n : this.options.refetchInterval) ?? false\n )\n }\n\n #updateRefetchInterval(nextInterval: number | false): void {\n this.#clearRefetchInterval()\n\n this.#currentRefetchInterval = nextInterval\n\n if (\n this.#currentRefetchInterval === 0 ||\n !this.#shouldScheduleTimer(this.#currentRefetchInterval)\n ) {\n return\n }\n\n this.#refetchIntervalId = timeoutManager.setInterval(() => {\n if (\n this.options.refetchIntervalInBackground ||\n focusManager.isFocused()\n ) {\n this.#executeFetch()\n }\n }, this.#currentRefetchInterval)\n }\n\n #updateTimers(): void {\n this.#updateStaleTimeout()\n this.#updateRefetchInterval(this.#computeRefetchInterval())\n }\n\n #clearStaleTimeout(): void {\n if (this.#staleTimeoutId !== undefined) {\n timeoutManager.clearTimeout(this.#staleTimeoutId)\n this.#staleTimeoutId = undefined\n }\n }\n\n #clearRefetchInterval(): void {\n if (this.#refetchIntervalId !== undefined) {\n timeoutManager.clearInterval(this.#refetchIntervalId)\n this.#refetchIntervalId = undefined\n }\n }\n\n protected createResult(\n query: Query<TQueryFnData, TError, TQueryData, TQueryKey>,\n options: QueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey\n >,\n ): QueryObserverResult<TData, TError> {\n const prevQuery = this.#currentQuery\n const prevOptions = this.options\n const prevResult = this.#currentResult as\n | QueryObserverResult<TData, TError>\n | undefined\n const prevResultState = this.#currentResultState\n const prevResultOptions = this.#currentResultOptions\n const queryChange = query !== prevQuery\n const queryInitialState = queryChange\n ? query.state\n : this.#currentQueryInitialState\n\n const { state } = query\n let newState = { ...state }\n let isPlaceholderData = false\n let data: TData | undefined\n\n // Optimistically set result in fetching state if needed\n if (options._optimisticResults) {\n const mounted = this.hasListeners()\n\n const fetchOnMount = !mounted && shouldFetchOnMount(query, options)\n\n const fetchOptionally =\n mounted && shouldFetchOptionally(query, prevQuery, options, prevOptions)\n\n if (fetchOnMount || fetchOptionally) {\n newState = {\n ...newState,\n ...fetchState(state.data, query.options),\n }\n }\n if (options._optimisticResults === 'isRestoring') {\n newState.fetchStatus = 'idle'\n }\n }\n\n let { error, errorUpdatedAt, status } = newState\n\n // Per default, use query data\n data = newState.data as unknown as TData\n let skipSelect = false\n\n // use placeholderData if needed\n if (\n options.placeholderData !== undefined &&\n data === undefined &&\n status === 'pending'\n ) {\n let placeholderData\n\n // Memoize placeholder data\n if (\n prevResult?.isPlaceholderData &&\n options.placeholderData === prevResultOptions?.placeholderData\n ) {\n placeholderData = prevResult.data\n // we have to skip select when reading this memoization\n // because prevResult.data is already \"selected\"\n skipSelect = true\n } else {\n // compute placeholderData\n placeholderData =\n typeof options.placeholderData === 'function'\n ? (\n options.placeholderData as unknown as PlaceholderDataFunction<TQueryData>\n )(\n this.#lastQueryWithDefinedData?.state.data,\n this.#lastQueryWithDefinedData as any,\n )\n : options.placeholderData\n }\n\n if (placeholderData !== undefined) {\n status = 'success'\n data = replaceData(\n prevResult?.data,\n placeholderData as unknown,\n options,\n ) as TData\n isPlaceholderData = true\n }\n }\n\n // Select data if needed\n // this also runs placeholderData through the select function\n if (options.select && data !== undefined && !skipSelect) {\n // Memoize select result\n if (\n prevResult &&\n data === prevResultState?.data &&\n options.select === this.#selectFn\n ) {\n data = this.#selectResult\n } else {\n try {\n this.#selectFn = options.select\n data = options.select(data as any)\n data = replaceData(prevResult?.data, data, options)\n this.#selectResult = data\n this.#selectError = null\n } catch (selectError) {\n this.#selectError = selectError as TError\n }\n }\n } else if (data === undefined) {\n // a stored select error belongs to previously selected data; once that\n // data is gone (query switch or reset), it must not leak into this result\n this.#selectError = null\n }\n\n if (this.#selectError) {\n error = this.#selectError\n data = this.#selectResult\n errorUpdatedAt = Date.now()\n status = 'error'\n isPlaceholderData = false\n }\n\n const isFetching = newState.fetchStatus === 'fetching'\n const isPending = status === 'pending'\n const isError = status === 'error'\n\n const isLoading = isPending && isFetching\n const hasData = data !== undefined\n\n const result: QueryObserverBaseResult<TData, TError> = {\n status,\n fetchStatus: newState.fetchStatus,\n isPending,\n isSuccess: status === 'success',\n isError,\n isInitialLoading: isLoading,\n isLoading,\n data,\n dataUpdatedAt: newState.dataUpdatedAt,\n error,\n errorUpdatedAt,\n failureCount: newState.fetchFailureCount,\n failureReason: newState.fetchFailureReason,\n errorUpdateCount: newState.errorUpdateCount,\n isFetched: query.isFetched(),\n isFetchedAfterMount:\n newState.dataUpdateCount > queryInitialState.dataUpdateCount ||\n newState.errorUpdateCount > queryInitialState.errorUpdateCount,\n isFetching,\n isRefetching: isFetching && !isPending,\n isLoadingError: isError && !hasData,\n isPaused: newState.fetchStatus === 'paused',\n isPlaceholderData,\n isRefetchError: isError && hasData,\n isStale: isStale(query, options),\n refetch: this.refetch,\n isEnabled: resolveQueryValue(options.enabled, query) !== false,\n }\n\n const nextResult = result as QueryObserverResult<TData, TError>\n\n return nextResult\n }\n\n updateResult(): void {\n const prevResult = this.#currentResult as\n | QueryObserverResult<TData, TError>\n | undefined\n\n const nextResult = this.createResult(this.#currentQuery, this.options)\n\n this.#currentResultState = this.#currentQuery.state\n this.#currentResultOptions = this.options\n\n if (this.#currentResultState.data !== undefined) {\n this.#lastQueryWithDefinedData = this.#currentQuery\n }\n\n // Only notify and update result if something has changed\n if (shallowEqualObjects(nextResult, prevResult)) {\n return\n }\n\n this.#currentResult = nextResult\n\n const shouldNotifyListeners = (): boolean => {\n if (!prevResult) {\n return true\n }\n\n const { notifyOnChangeProps } = this.options\n const notifyOnChangePropsValue =\n typeof notifyOnChangeProps === 'function'\n ? notifyOnChangeProps()\n : notifyOnChangeProps\n\n if (\n notifyOnChangePropsValue === 'all' ||\n (!notifyOnChangePropsValue && !this.#trackedProps.size)\n ) {\n return true\n }\n\n const includedProps = new Set(\n notifyOnChangePropsValue ?? this.#trackedProps,\n )\n\n if (this.options.throwOnError) {\n includedProps.add('error')\n }\n\n return Object.keys(this.#currentResult).some((key) => {\n const typedKey = key as keyof QueryObserverResult\n const changed = this.#currentResult[typedKey] !== prevResult[typedKey]\n\n return changed && includedProps.has(typedKey)\n })\n }\n\n const notifyListeners = shouldNotifyListeners()\n\n notifyManager.batch(() => {\n // First, trigger the listeners\n if (notifyListeners) {\n this.listeners.forEach((listener) => {\n listener(this.#currentResult)\n })\n }\n\n // Then the cache listeners\n this.#client.getQueryCache().notify({\n query: this.#currentQuery,\n type: 'observerResultsUpdated',\n })\n })\n }\n\n #updateQuery(): void {\n const query = this.#client.getQueryCache().build(this.#client, this.options)\n\n if (query === this.#currentQuery) {\n return\n }\n\n const prevQuery = this.#currentQuery as\n | Query<TQueryFnData, TError, TQueryData, TQueryKey>\n | undefined\n this.#currentQuery = query\n this.#currentQueryInitialState = query.state\n\n if (this.hasListeners()) {\n prevQuery?.removeObserver(this)\n query.addObserver(this)\n }\n }\n\n onQueryUpdate(): void {\n this.updateResult()\n\n if (this.hasListeners()) {\n this.#updateTimers()\n }\n }\n}\n\nfunction shouldLoadOnMount(\n query: Query<any, any, any, any>,\n options: QueryObserverOptions<any, any, any, any>,\n): boolean {\n return (\n resolveQueryValue(options.enabled, query) !== false &&\n query.state.data === undefined &&\n !(\n query.state.status === 'error' &&\n resolveQueryValue(options.retryOnMount, query) === false\n )\n )\n}\n\nfunction shouldFetchOnMount(\n query: Query<any, any, any, any>,\n options: QueryObserverOptions<any, any, any, any, any>,\n): boolean {\n return (\n shouldLoadOnMount(query, options) ||\n (query.state.data !== undefined &&\n shouldFetchOn(query, options, options.refetchOnMount))\n )\n}\n\nfunction shouldFetchOn(\n query: Query<any, any, any, any>,\n options: QueryObserverOptions<any, any, any, any, any>,\n field: (typeof options)['refetchOnMount'] &\n (typeof options)['refetchOnWindowFocus'] &\n (typeof options)['refetchOnReconnect'],\n) {\n if (\n resolveQueryValue(options.enabled, query) !== false &&\n resolveQueryValue(options.staleTime, query) !== 'static'\n ) {\n const value = typeof field === 'function' ? field(query) : field\n\n return value === 'always' || (value !== false && isStale(query, options))\n }\n return false\n}\n\nfunction shouldFetchOptionally(\n query: Query<any, any, any, any>,\n prevQuery: Query<any, any, any, any>,\n options: QueryObserverOptions<any, any, any, any, any>,\n prevOptions: QueryObserverOptions<any, any, any, any, any>,\n): boolean {\n return (\n (query !== prevQuery ||\n resolveQueryValue(prevOptions.enabled, query) === false) &&\n (!options.suspense || query.state.status !== 'error') &&\n isStale(query, options)\n )\n}\n\nfunction isStale(\n query: Query<any, any, any, any>,\n options: QueryObserverOptions<any, any, any, any, any>,\n): boolean {\n return (\n resolveQueryValue(options.enabled, query) !== false &&\n query.isStaleByTime(resolveQueryValue(options.staleTime, query))\n )\n}\n"],"mappings":"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"}