UNPKG

@tanstack/query-core

Version:

The framework agnostic core that powers TanStack Query

1 lines 32.1 kB
{"version":3,"file":"queryObserver.cjs","names":["Subscribable","#client","#selectError","#currentQuery","#executeFetch","#updateTimers","#clearStaleTimeout","#clearRefetchInterval","resolveQueryValue","#updateQuery","shallowEqualObjects","#updateStaleTimeout","#computeRefetchInterval","#currentRefetchInterval","#updateRefetchInterval","#currentResult","#currentResultOptions","#currentResultState","#trackedProps","noop","isServerEnvironment","isValidTimeout","#shouldScheduleTimer","timeUntilStale","#staleTimeoutId","timeoutManager","#refetchIntervalId","focusManager","#currentQueryInitialState","fetchState","#lastQueryWithDefinedData","replaceData","#selectFn","#selectResult"],"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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"}