UNPKG

@tanstack/query-core

Version:

The framework agnostic core that powers TanStack Query

324 lines (323 loc) 11.2 kB
import { __privateAdd, __privateGet, __privateSet, __privateWrapper } from "./chunk-PXG64RU4.js"; // src/queryClient.ts import { functionalUpdate, hashKey, hashQueryKeyByOptions, noop, partialMatchKey, resolveStaleTime, skipToken } from "./utils.js"; import { QueryCache } from "./queryCache.js"; import { MutationCache } from "./mutationCache.js"; import { focusManager } from "./focusManager.js"; import { onlineManager } from "./onlineManager.js"; import { notifyManager } from "./notifyManager.js"; import { infiniteQueryBehavior } from "./infiniteQueryBehavior.js"; var _queryCache, _mutationCache, _defaultOptions, _queryDefaults, _mutationDefaults, _mountCount, _unsubscribeFocus, _unsubscribeOnline; var QueryClient = class { constructor(config = {}) { __privateAdd(this, _queryCache); __privateAdd(this, _mutationCache); __privateAdd(this, _defaultOptions); __privateAdd(this, _queryDefaults); __privateAdd(this, _mutationDefaults); __privateAdd(this, _mountCount); __privateAdd(this, _unsubscribeFocus); __privateAdd(this, _unsubscribeOnline); __privateSet(this, _queryCache, config.queryCache || new QueryCache()); __privateSet(this, _mutationCache, config.mutationCache || new MutationCache()); __privateSet(this, _defaultOptions, config.defaultOptions || {}); __privateSet(this, _queryDefaults, /* @__PURE__ */ new Map()); __privateSet(this, _mutationDefaults, /* @__PURE__ */ new Map()); __privateSet(this, _mountCount, 0); } mount() { __privateWrapper(this, _mountCount)._++; if (__privateGet(this, _mountCount) !== 1) return; __privateSet(this, _unsubscribeFocus, focusManager.subscribe(async (focused) => { if (focused) { await this.resumePausedMutations(); __privateGet(this, _queryCache).onFocus(); } })); __privateSet(this, _unsubscribeOnline, onlineManager.subscribe(async (online) => { if (online) { await this.resumePausedMutations(); __privateGet(this, _queryCache).onOnline(); } })); } unmount() { var _a, _b; __privateWrapper(this, _mountCount)._--; if (__privateGet(this, _mountCount) !== 0) return; (_a = __privateGet(this, _unsubscribeFocus)) == null ? void 0 : _a.call(this); __privateSet(this, _unsubscribeFocus, void 0); (_b = __privateGet(this, _unsubscribeOnline)) == null ? void 0 : _b.call(this); __privateSet(this, _unsubscribeOnline, void 0); } isFetching(filters) { return __privateGet(this, _queryCache).findAll({ ...filters, fetchStatus: "fetching" }).length; } isMutating(filters) { return __privateGet(this, _mutationCache).findAll({ ...filters, status: "pending" }).length; } /** * Imperative (non-reactive) way to retrieve data for a QueryKey. * Should only be used in callbacks or functions where reading the latest data is necessary, e.g. for optimistic updates. * * Hint: Do not use this function inside a component, because it won't receive updates. * Use `useQuery` to create a `QueryObserver` that subscribes to changes. */ getQueryData(queryKey) { var _a; const options = this.defaultQueryOptions({ queryKey }); return (_a = __privateGet(this, _queryCache).get(options.queryHash)) == null ? void 0 : _a.state.data; } ensureQueryData(options) { const defaultedOptions = this.defaultQueryOptions(options); const query = __privateGet(this, _queryCache).build(this, defaultedOptions); const cachedData = query.state.data; if (cachedData === void 0) { return this.fetchQuery(options); } if (options.revalidateIfStale && query.isStaleByTime(resolveStaleTime(defaultedOptions.staleTime, query))) { void this.prefetchQuery(defaultedOptions); } return Promise.resolve(cachedData); } getQueriesData(filters) { return __privateGet(this, _queryCache).findAll(filters).map(({ queryKey, state }) => { const data = state.data; return [queryKey, data]; }); } setQueryData(queryKey, updater, options) { const defaultedOptions = this.defaultQueryOptions({ queryKey }); const query = __privateGet(this, _queryCache).get( defaultedOptions.queryHash ); const prevData = query == null ? void 0 : query.state.data; const data = functionalUpdate(updater, prevData); if (data === void 0) { return void 0; } return __privateGet(this, _queryCache).build(this, defaultedOptions).setData(data, { ...options, manual: true }); } setQueriesData(filters, updater, options) { return notifyManager.batch( () => __privateGet(this, _queryCache).findAll(filters).map(({ queryKey }) => [ queryKey, this.setQueryData(queryKey, updater, options) ]) ); } getQueryState(queryKey) { var _a; const options = this.defaultQueryOptions({ queryKey }); return (_a = __privateGet(this, _queryCache).get( options.queryHash )) == null ? void 0 : _a.state; } removeQueries(filters) { const queryCache = __privateGet(this, _queryCache); notifyManager.batch(() => { queryCache.findAll(filters).forEach((query) => { queryCache.remove(query); }); }); } resetQueries(filters, options) { const queryCache = __privateGet(this, _queryCache); return notifyManager.batch(() => { queryCache.findAll(filters).forEach((query) => { query.reset(); }); return this.refetchQueries( { type: "active", ...filters }, options ); }); } cancelQueries(filters, cancelOptions = {}) { const defaultedCancelOptions = { revert: true, ...cancelOptions }; const promises = notifyManager.batch( () => __privateGet(this, _queryCache).findAll(filters).map((query) => query.cancel(defaultedCancelOptions)) ); return Promise.all(promises).then(noop).catch(noop); } invalidateQueries(filters, options = {}) { return notifyManager.batch(() => { __privateGet(this, _queryCache).findAll(filters).forEach((query) => { query.invalidate(); }); if ((filters == null ? void 0 : filters.refetchType) === "none") { return Promise.resolve(); } return this.refetchQueries( { ...filters, type: (filters == null ? void 0 : filters.refetchType) ?? (filters == null ? void 0 : filters.type) ?? "active" }, options ); }); } refetchQueries(filters, options = {}) { const fetchOptions = { ...options, cancelRefetch: options.cancelRefetch ?? true }; const promises = notifyManager.batch( () => __privateGet(this, _queryCache).findAll(filters).filter((query) => !query.isDisabled()).map((query) => { let promise = query.fetch(void 0, fetchOptions); if (!fetchOptions.throwOnError) { promise = promise.catch(noop); } return query.state.fetchStatus === "paused" ? Promise.resolve() : promise; }) ); return Promise.all(promises).then(noop); } fetchQuery(options) { const defaultedOptions = this.defaultQueryOptions(options); if (defaultedOptions.retry === void 0) { defaultedOptions.retry = false; } const query = __privateGet(this, _queryCache).build(this, defaultedOptions); return query.isStaleByTime( resolveStaleTime(defaultedOptions.staleTime, query) ) ? query.fetch(defaultedOptions) : Promise.resolve(query.state.data); } prefetchQuery(options) { return this.fetchQuery(options).then(noop).catch(noop); } fetchInfiniteQuery(options) { options.behavior = infiniteQueryBehavior(options.pages); return this.fetchQuery(options); } prefetchInfiniteQuery(options) { return this.fetchInfiniteQuery(options).then(noop).catch(noop); } ensureInfiniteQueryData(options) { options.behavior = infiniteQueryBehavior(options.pages); return this.ensureQueryData(options); } resumePausedMutations() { if (onlineManager.isOnline()) { return __privateGet(this, _mutationCache).resumePausedMutations(); } return Promise.resolve(); } getQueryCache() { return __privateGet(this, _queryCache); } getMutationCache() { return __privateGet(this, _mutationCache); } getDefaultOptions() { return __privateGet(this, _defaultOptions); } setDefaultOptions(options) { __privateSet(this, _defaultOptions, options); } setQueryDefaults(queryKey, options) { __privateGet(this, _queryDefaults).set(hashKey(queryKey), { queryKey, defaultOptions: options }); } getQueryDefaults(queryKey) { const defaults = [...__privateGet(this, _queryDefaults).values()]; const result = {}; defaults.forEach((queryDefault) => { if (partialMatchKey(queryKey, queryDefault.queryKey)) { Object.assign(result, queryDefault.defaultOptions); } }); return result; } setMutationDefaults(mutationKey, options) { __privateGet(this, _mutationDefaults).set(hashKey(mutationKey), { mutationKey, defaultOptions: options }); } getMutationDefaults(mutationKey) { const defaults = [...__privateGet(this, _mutationDefaults).values()]; const result = {}; defaults.forEach((queryDefault) => { if (partialMatchKey(mutationKey, queryDefault.mutationKey)) { Object.assign(result, queryDefault.defaultOptions); } }); return result; } defaultQueryOptions(options) { if (options._defaulted) { return options; } const defaultedOptions = { ...__privateGet(this, _defaultOptions).queries, ...this.getQueryDefaults(options.queryKey), ...options, _defaulted: true }; if (!defaultedOptions.queryHash) { defaultedOptions.queryHash = hashQueryKeyByOptions( defaultedOptions.queryKey, defaultedOptions ); } if (defaultedOptions.refetchOnReconnect === void 0) { defaultedOptions.refetchOnReconnect = defaultedOptions.networkMode !== "always"; } if (defaultedOptions.throwOnError === void 0) { defaultedOptions.throwOnError = !!defaultedOptions.suspense; } if (!defaultedOptions.networkMode && defaultedOptions.persister) { defaultedOptions.networkMode = "offlineFirst"; } if (defaultedOptions.queryFn === skipToken) { defaultedOptions.enabled = false; } return defaultedOptions; } defaultMutationOptions(options) { if (options == null ? void 0 : options._defaulted) { return options; } return { ...__privateGet(this, _defaultOptions).mutations, ...(options == null ? void 0 : options.mutationKey) && this.getMutationDefaults(options.mutationKey), ...options, _defaulted: true }; } clear() { __privateGet(this, _queryCache).clear(); __privateGet(this, _mutationCache).clear(); } }; _queryCache = new WeakMap(); _mutationCache = new WeakMap(); _defaultOptions = new WeakMap(); _queryDefaults = new WeakMap(); _mutationDefaults = new WeakMap(); _mountCount = new WeakMap(); _unsubscribeFocus = new WeakMap(); _unsubscribeOnline = new WeakMap(); export { QueryClient }; //# sourceMappingURL=queryClient.js.map