@tanstack/query-core 5.102.4 → 5.102.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/build/legacy/environmentManager.cjs +15 -17
  2. package/build/legacy/environmentManager.cjs.map +1 -1
  3. package/build/legacy/environmentManager.d.cts +6 -5
  4. package/build/legacy/environmentManager.d.cts.map +1 -1
  5. package/build/legacy/environmentManager.d.ts +6 -5
  6. package/build/legacy/environmentManager.d.ts.map +1 -1
  7. package/build/legacy/environmentManager.js +16 -19
  8. package/build/legacy/environmentManager.js.map +1 -1
  9. package/build/legacy/{hydration-DFwTM9vM.d.ts → hydration-Bjs0MSgg.d.ts} +3 -4
  10. package/build/legacy/hydration-Bjs0MSgg.d.ts.map +1 -0
  11. package/build/legacy/{hydration-BoHd-X9T.d.cts → hydration-DWGr3cFC.d.cts} +3 -4
  12. package/build/legacy/hydration-DWGr3cFC.d.cts.map +1 -0
  13. package/build/legacy/hydration.d.cts +1 -1
  14. package/build/legacy/hydration.d.ts +1 -1
  15. package/build/legacy/index.d.cts +1 -1
  16. package/build/legacy/index.d.ts +1 -1
  17. package/build/legacy/infiniteQueryBehavior.d.cts +1 -1
  18. package/build/legacy/infiniteQueryBehavior.d.ts +1 -1
  19. package/build/legacy/infiniteQueryObserver.d.cts +1 -1
  20. package/build/legacy/infiniteQueryObserver.d.ts +1 -1
  21. package/build/legacy/mutation.d.cts +1 -1
  22. package/build/legacy/mutation.d.ts +1 -1
  23. package/build/legacy/mutationCache.d.cts +1 -1
  24. package/build/legacy/mutationCache.d.ts +1 -1
  25. package/build/legacy/mutationObserver.d.cts +1 -1
  26. package/build/legacy/mutationObserver.d.ts +1 -1
  27. package/build/legacy/queriesObserver.cjs +2 -6
  28. package/build/legacy/queriesObserver.cjs.map +1 -1
  29. package/build/legacy/queriesObserver.d.cts +1 -1
  30. package/build/legacy/queriesObserver.d.cts.map +1 -1
  31. package/build/legacy/queriesObserver.d.ts +1 -1
  32. package/build/legacy/queriesObserver.d.ts.map +1 -1
  33. package/build/legacy/queriesObserver.js +2 -6
  34. package/build/legacy/queriesObserver.js.map +1 -1
  35. package/build/legacy/query.cjs +3 -6
  36. package/build/legacy/query.cjs.map +1 -1
  37. package/build/legacy/query.d.cts +1 -1
  38. package/build/legacy/query.d.ts +1 -1
  39. package/build/legacy/query.js +4 -7
  40. package/build/legacy/query.js.map +1 -1
  41. package/build/legacy/queryCache.d.cts +1 -1
  42. package/build/legacy/queryCache.d.ts +1 -1
  43. package/build/legacy/queryClient.cjs +3 -3
  44. package/build/legacy/queryClient.cjs.map +1 -1
  45. package/build/legacy/queryClient.d.cts +1 -1
  46. package/build/legacy/queryClient.d.ts +1 -1
  47. package/build/legacy/queryClient.js +4 -4
  48. package/build/legacy/queryClient.js.map +1 -1
  49. package/build/legacy/queryObserver.cjs +21 -27
  50. package/build/legacy/queryObserver.cjs.map +1 -1
  51. package/build/legacy/queryObserver.d.cts +1 -1
  52. package/build/legacy/queryObserver.d.ts +1 -1
  53. package/build/legacy/queryObserver.js +23 -29
  54. package/build/legacy/queryObserver.js.map +1 -1
  55. package/build/legacy/removable.cjs +1 -1
  56. package/build/legacy/removable.cjs.map +1 -1
  57. package/build/legacy/removable.js +2 -2
  58. package/build/legacy/removable.js.map +1 -1
  59. package/build/legacy/retryer.cjs +1 -1
  60. package/build/legacy/retryer.cjs.map +1 -1
  61. package/build/legacy/retryer.d.cts +1 -1
  62. package/build/legacy/retryer.d.ts +1 -1
  63. package/build/legacy/retryer.js +2 -2
  64. package/build/legacy/retryer.js.map +1 -1
  65. package/build/legacy/streamedQuery.d.cts +1 -1
  66. package/build/legacy/streamedQuery.d.ts +1 -1
  67. package/build/legacy/types.cjs +3 -3
  68. package/build/legacy/types.cjs.map +1 -1
  69. package/build/legacy/types.d.cts +1 -1
  70. package/build/legacy/types.d.ts +1 -1
  71. package/build/legacy/types.js +3 -3
  72. package/build/legacy/types.js.map +1 -1
  73. package/build/legacy/utils.cjs +3 -7
  74. package/build/legacy/utils.cjs.map +1 -1
  75. package/build/legacy/utils.d.cts +2 -2
  76. package/build/legacy/utils.d.ts +2 -2
  77. package/build/legacy/utils.js +3 -6
  78. package/build/legacy/utils.js.map +1 -1
  79. package/build/modern/environmentManager.cjs +15 -17
  80. package/build/modern/environmentManager.cjs.map +1 -1
  81. package/build/modern/environmentManager.d.cts +6 -5
  82. package/build/modern/environmentManager.d.cts.map +1 -1
  83. package/build/modern/environmentManager.d.ts +6 -5
  84. package/build/modern/environmentManager.d.ts.map +1 -1
  85. package/build/modern/environmentManager.js +16 -19
  86. package/build/modern/environmentManager.js.map +1 -1
  87. package/build/modern/{hydration-DFwTM9vM.d.ts → hydration-Bjs0MSgg.d.ts} +3 -4
  88. package/build/modern/hydration-Bjs0MSgg.d.ts.map +1 -0
  89. package/build/modern/{hydration-BoHd-X9T.d.cts → hydration-DWGr3cFC.d.cts} +3 -4
  90. package/build/modern/hydration-DWGr3cFC.d.cts.map +1 -0
  91. package/build/modern/hydration.d.cts +1 -1
  92. package/build/modern/hydration.d.ts +1 -1
  93. package/build/modern/index.d.cts +1 -1
  94. package/build/modern/index.d.ts +1 -1
  95. package/build/modern/infiniteQueryBehavior.d.cts +1 -1
  96. package/build/modern/infiniteQueryBehavior.d.ts +1 -1
  97. package/build/modern/infiniteQueryObserver.d.cts +1 -1
  98. package/build/modern/infiniteQueryObserver.d.ts +1 -1
  99. package/build/modern/mutation.d.cts +1 -1
  100. package/build/modern/mutation.d.ts +1 -1
  101. package/build/modern/mutationCache.d.cts +1 -1
  102. package/build/modern/mutationCache.d.ts +1 -1
  103. package/build/modern/mutationObserver.d.cts +1 -1
  104. package/build/modern/mutationObserver.d.ts +1 -1
  105. package/build/modern/queriesObserver.cjs +2 -6
  106. package/build/modern/queriesObserver.cjs.map +1 -1
  107. package/build/modern/queriesObserver.d.cts +1 -1
  108. package/build/modern/queriesObserver.d.cts.map +1 -1
  109. package/build/modern/queriesObserver.d.ts +1 -1
  110. package/build/modern/queriesObserver.d.ts.map +1 -1
  111. package/build/modern/queriesObserver.js +2 -6
  112. package/build/modern/queriesObserver.js.map +1 -1
  113. package/build/modern/query.cjs +3 -6
  114. package/build/modern/query.cjs.map +1 -1
  115. package/build/modern/query.d.cts +1 -1
  116. package/build/modern/query.d.ts +1 -1
  117. package/build/modern/query.js +4 -7
  118. package/build/modern/query.js.map +1 -1
  119. package/build/modern/queryCache.d.cts +1 -1
  120. package/build/modern/queryCache.d.ts +1 -1
  121. package/build/modern/queryClient.cjs +3 -3
  122. package/build/modern/queryClient.cjs.map +1 -1
  123. package/build/modern/queryClient.d.cts +1 -1
  124. package/build/modern/queryClient.d.ts +1 -1
  125. package/build/modern/queryClient.js +4 -4
  126. package/build/modern/queryClient.js.map +1 -1
  127. package/build/modern/queryObserver.cjs +21 -27
  128. package/build/modern/queryObserver.cjs.map +1 -1
  129. package/build/modern/queryObserver.d.cts +1 -1
  130. package/build/modern/queryObserver.d.ts +1 -1
  131. package/build/modern/queryObserver.js +23 -29
  132. package/build/modern/queryObserver.js.map +1 -1
  133. package/build/modern/removable.cjs +1 -1
  134. package/build/modern/removable.cjs.map +1 -1
  135. package/build/modern/removable.js +2 -2
  136. package/build/modern/removable.js.map +1 -1
  137. package/build/modern/retryer.cjs +1 -1
  138. package/build/modern/retryer.cjs.map +1 -1
  139. package/build/modern/retryer.d.cts +1 -1
  140. package/build/modern/retryer.d.ts +1 -1
  141. package/build/modern/retryer.js +2 -2
  142. package/build/modern/retryer.js.map +1 -1
  143. package/build/modern/streamedQuery.d.cts +1 -1
  144. package/build/modern/streamedQuery.d.ts +1 -1
  145. package/build/modern/types.cjs +3 -3
  146. package/build/modern/types.cjs.map +1 -1
  147. package/build/modern/types.d.cts +1 -1
  148. package/build/modern/types.d.ts +1 -1
  149. package/build/modern/types.js +3 -3
  150. package/build/modern/types.js.map +1 -1
  151. package/build/modern/utils.cjs +3 -7
  152. package/build/modern/utils.cjs.map +1 -1
  153. package/build/modern/utils.d.cts +2 -2
  154. package/build/modern/utils.d.ts +2 -2
  155. package/build/modern/utils.js +3 -6
  156. package/build/modern/utils.js.map +1 -1
  157. package/package.json +1 -1
  158. package/src/environmentManager.ts +17 -19
  159. package/src/queriesObserver.ts +2 -7
  160. package/src/query.ts +8 -12
  161. package/src/queryClient.ts +4 -4
  162. package/src/queryObserver.ts +37 -62
  163. package/src/removable.ts +2 -2
  164. package/src/retryer.ts +2 -2
  165. package/src/types.ts +3 -3
  166. package/src/utils.ts +13 -22
  167. package/build/legacy/hydration-BoHd-X9T.d.cts.map +0 -1
  168. package/build/legacy/hydration-DFwTM9vM.d.ts.map +0 -1
  169. package/build/modern/hydration-BoHd-X9T.d.cts.map +0 -1
  170. package/build/modern/hydration-DFwTM9vM.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","names":[],"sources":["../../src/utils.ts"],"sourcesContent":["import { timeoutManager } from './timeoutManager'\nimport type {\n DefaultError,\n FetchStatus,\n MutationKey,\n MutationStatus,\n QueryBooleanOption,\n QueryFunction,\n QueryKey,\n QueryOptions,\n StaleTime,\n StaleTimeFunction,\n} from './types'\nimport type { Mutation } from './mutation'\nimport type { FetchOptions, Query } from './query'\n\n// TYPES\n\ntype DropLast<T extends ReadonlyArray<unknown>> = T extends readonly [\n ...infer R,\n unknown,\n]\n ? readonly [...R]\n : never\n\ntype TuplePrefixes<T extends ReadonlyArray<unknown>> = T extends readonly []\n ? readonly []\n : TuplePrefixes<DropLast<T>> | T\n\nexport interface QueryFilters<TQueryKey extends QueryKey = QueryKey> {\n /**\n * Filter to active queries, inactive queries or all queries\n */\n type?: QueryTypeFilter\n /**\n * Match query key exactly\n */\n exact?: boolean\n /**\n * Include queries matching this predicate function\n */\n predicate?: (query: Query) => boolean\n /**\n * Include queries matching this query key\n */\n queryKey?: TQueryKey | TuplePrefixes<TQueryKey>\n /**\n * Include or exclude stale queries\n */\n stale?: boolean\n /**\n * Include queries matching their fetchStatus\n */\n fetchStatus?: FetchStatus\n}\n\nexport interface MutationFilters<\n TData = unknown,\n TError = DefaultError,\n TVariables = unknown,\n TOnMutateResult = unknown,\n> {\n /**\n * Match mutation key exactly\n */\n exact?: boolean\n /**\n * Include mutations matching this predicate function\n */\n predicate?: (\n mutation: Mutation<TData, TError, TVariables, TOnMutateResult>,\n ) => boolean\n /**\n * Include mutations matching this mutation key\n */\n mutationKey?: TuplePrefixes<MutationKey>\n /**\n * Filter by mutation status\n */\n status?: MutationStatus\n}\n\nexport type Updater<TInput, TOutput> = TOutput | ((input: TInput) => TOutput)\n\nexport type QueryTypeFilter = 'all' | 'active' | 'inactive'\n\n// UTILS\n\n/** @deprecated\n * use `environmentManager.isServer()` instead.\n */\nexport const isServer = typeof window === 'undefined' || 'Deno' in globalThis\n\nexport function noop(): void\nexport function noop(): undefined\nexport function noop() {}\n\nexport function functionalUpdate<TInput, TOutput>(\n updater: Updater<TInput, TOutput>,\n input: TInput,\n): TOutput {\n return typeof updater === 'function'\n ? (updater as (_: TInput) => TOutput)(input)\n : updater\n}\n\nexport function isValidTimeout(value: unknown): value is number {\n return typeof value === 'number' && value >= 0 && value !== Infinity\n}\n\nexport function timeUntilStale(updatedAt: number, staleTime?: number): number {\n return Math.max(updatedAt + (staleTime || 0) - Date.now(), 0)\n}\n\nexport function resolveStaleTime<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n staleTime:\n | undefined\n | StaleTimeFunction<TQueryFnData, TError, TData, TQueryKey>,\n query: Query<TQueryFnData, TError, TData, TQueryKey>,\n): StaleTime | undefined {\n return typeof staleTime === 'function' ? staleTime(query) : staleTime\n}\n\nexport function resolveQueryBoolean<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n option:\n | undefined\n | QueryBooleanOption<TQueryFnData, TError, TData, TQueryKey>,\n query: Query<TQueryFnData, TError, TData, TQueryKey>,\n): boolean | undefined {\n return typeof option === 'function' ? option(query) : option\n}\n\nexport function matchQuery(\n filters: QueryFilters,\n query: Query<any, any, any, any>,\n): boolean {\n const {\n type = 'all',\n exact,\n fetchStatus,\n predicate,\n queryKey,\n stale,\n } = filters\n\n if (queryKey) {\n if (exact) {\n if (query.queryHash !== hashQueryKeyByOptions(queryKey, query.options)) {\n return false\n }\n } else if (!partialMatchKey(query.queryKey, queryKey)) {\n return false\n }\n }\n\n if (type !== 'all') {\n const isActive = query.isActive()\n if (type === 'active' && !isActive) {\n return false\n }\n if (type === 'inactive' && isActive) {\n return false\n }\n }\n\n if (typeof stale === 'boolean' && query.isStale() !== stale) {\n return false\n }\n\n if (fetchStatus && fetchStatus !== query.state.fetchStatus) {\n return false\n }\n\n if (predicate && !predicate(query)) {\n return false\n }\n\n return true\n}\n\nexport function matchMutation(\n filters: MutationFilters,\n mutation: Mutation<any, any>,\n): boolean {\n const { exact, status, predicate, mutationKey } = filters\n if (mutationKey) {\n if (!mutation.options.mutationKey) {\n return false\n }\n if (exact) {\n if (hashKey(mutation.options.mutationKey) !== hashKey(mutationKey)) {\n return false\n }\n } else if (!partialMatchKey(mutation.options.mutationKey, mutationKey)) {\n return false\n }\n }\n\n if (status && mutation.state.status !== status) {\n return false\n }\n\n if (predicate && !predicate(mutation)) {\n return false\n }\n\n return true\n}\n\nexport function hashQueryKeyByOptions<TQueryKey extends QueryKey = QueryKey>(\n queryKey: TQueryKey,\n options?: Pick<QueryOptions<any, any, any, any>, 'queryKeyHashFn'>,\n): string {\n const hashFn = options?.queryKeyHashFn || hashKey\n return hashFn(queryKey)\n}\n\n/**\n * Default query & mutation keys hash function.\n * Hashes the value into a stable hash.\n */\nexport function hashKey(queryKey: QueryKey | MutationKey): string {\n return JSON.stringify(queryKey, (_, val) =>\n isPlainObject(val)\n ? Object.keys(val)\n .sort()\n .reduce((result, key) => {\n result[key] = val[key]\n return result\n }, {} as any)\n : val,\n )\n}\n\n/**\n * Checks if key `b` partially matches with key `a`.\n */\nexport function partialMatchKey(a: QueryKey, b: QueryKey): boolean\nexport function partialMatchKey(a: any, b: any): boolean {\n if (a === b) {\n return true\n }\n\n if (typeof a !== typeof b) {\n return false\n }\n\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n if (Array.isArray(a) && Array.isArray(b)) {\n for (let i = 0; i < b.length; i++) {\n if (!partialMatchKey(a[i], b[i])) {\n return false\n }\n }\n return true\n }\n\n const bKeys = Object.keys(b)\n for (const key of bKeys) {\n if (!partialMatchKey(a[key], b[key])) {\n return false\n }\n }\n return true\n }\n\n return false\n}\n\nconst hasOwn = Object.prototype.hasOwnProperty\n\n/**\n * This function returns `a` if `b` is deeply equal.\n * If not, it will replace any deeply equal children of `b` with those of `a`.\n * This can be used for structural sharing between JSON values for example.\n */\nexport function replaceEqualDeep<T>(a: unknown, b: T, depth?: number): T\nexport function replaceEqualDeep(a: any, b: any, depth = 0): any {\n if (a === b) {\n return a\n }\n\n if (depth > 500) return b\n\n const array = isPlainArray(a) && isPlainArray(b)\n\n if (!array && !(isPlainObject(a) && isPlainObject(b))) return b\n\n const aItems = array ? a : Object.keys(a)\n const aSize = aItems.length\n const bItems = array ? b : Object.keys(b)\n const bSize = bItems.length\n const copy: any = array ? new Array(bSize) : {}\n\n let equalItems = 0\n\n for (let i = 0; i < bSize; i++) {\n const key: any = array ? i : bItems[i]\n const aItem = a[key]\n const bItem = b[key]\n\n if (aItem === bItem) {\n copy[key] = aItem\n if (array ? i < aSize : hasOwn.call(a, key)) equalItems++\n continue\n }\n\n if (\n aItem === null ||\n bItem === null ||\n typeof aItem !== 'object' ||\n typeof bItem !== 'object'\n ) {\n copy[key] = bItem\n continue\n }\n\n const v = replaceEqualDeep(aItem, bItem, depth + 1)\n copy[key] = v\n if (v === aItem) equalItems++\n }\n\n return aSize === bSize && equalItems === aSize ? a : copy\n}\n\n/**\n * Shallow compare objects.\n */\nexport function shallowEqualObjects<T extends Record<string, any>>(\n a: T,\n b: T | undefined,\n): boolean {\n if (!b || Object.keys(a).length !== Object.keys(b).length) {\n return false\n }\n\n for (const key in a) {\n if (a[key] !== b[key]) {\n return false\n }\n }\n\n return true\n}\n\nexport function isPlainArray(value: unknown): value is Array<unknown> {\n return Array.isArray(value) && value.length === Object.keys(value).length\n}\n\n// Copied from: https://github.com/jonschlinkert/is-plain-object\nexport function isPlainObject(o: any): o is Record<PropertyKey, unknown> {\n if (!hasObjectPrototype(o)) {\n return false\n }\n\n // If has no constructor\n const ctor = o.constructor\n if (ctor === undefined) {\n return true\n }\n\n // If has modified prototype\n const prot = ctor.prototype\n if (!hasObjectPrototype(prot)) {\n return false\n }\n\n // If constructor does not have an Object-specific method\n if (!prot.hasOwnProperty('isPrototypeOf')) {\n return false\n }\n\n // Handles Objects created by Object.create(<arbitrary prototype>)\n if (Object.getPrototypeOf(o) !== Object.prototype) {\n return false\n }\n\n // Most likely a plain Object\n return true\n}\n\nfunction hasObjectPrototype(o: any): boolean {\n return Object.prototype.toString.call(o) === '[object Object]'\n}\n\nexport function sleep(timeout: number): Promise<void> {\n return new Promise((resolve) => {\n timeoutManager.setTimeout(resolve, timeout)\n })\n}\n\nexport function replaceData<\n TData,\n TOptions extends QueryOptions<any, any, any, any>,\n>(prevData: TData | undefined, data: TData, options: TOptions): TData {\n if (typeof options.structuralSharing === 'function') {\n return options.structuralSharing(prevData, data) as TData\n } else if (options.structuralSharing !== false) {\n if (process.env.NODE_ENV !== 'production') {\n try {\n return replaceEqualDeep(prevData, data)\n } catch (error) {\n console.error(\n `Structural sharing requires data to be JSON serializable. To fix this, turn off structuralSharing or return JSON-serializable data from your queryFn. [${options.queryHash}]: ${error}`,\n )\n\n // Prevent the replaceEqualDeep from being called again down below.\n throw error\n }\n }\n // Structurally share data between prev and new data if needed\n return replaceEqualDeep(prevData, data)\n }\n return data\n}\n\nexport function keepPreviousData<T>(\n previousData: T | undefined,\n): T | undefined {\n return previousData\n}\n\nexport function addToEnd<T>(items: Array<T>, item: T, max = 0): Array<T> {\n const newItems = [...items, item]\n return max && newItems.length > max ? newItems.slice(1) : newItems\n}\n\nexport function addToStart<T>(items: Array<T>, item: T, max = 0): Array<T> {\n const newItems = [item, ...items]\n return max && newItems.length > max ? newItems.slice(0, -1) : newItems\n}\n\nexport const skipToken = Symbol()\nexport type SkipToken = typeof skipToken\n\nexport function ensureQueryFn<\n TQueryFnData = unknown,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: {\n queryFn?: QueryFunction<TQueryFnData, TQueryKey> | SkipToken\n queryHash?: string\n },\n fetchOptions?: FetchOptions<TQueryFnData>,\n): QueryFunction<TQueryFnData, TQueryKey> {\n if (process.env.NODE_ENV !== 'production') {\n if (options.queryFn === skipToken) {\n console.error(\n `Attempted to invoke queryFn when set to skipToken. This is likely a configuration error. Query hash: '${options.queryHash}'`,\n )\n }\n }\n\n // if we attempt to retry a fetch that was triggered from an initialPromise\n // when we don't have a queryFn yet, we can't retry, so we just return the already rejected initialPromise\n // if an observer has already mounted, we will be able to retry with that queryFn\n if (!options.queryFn && fetchOptions?.initialPromise) {\n return () => fetchOptions.initialPromise!\n }\n\n if (!options.queryFn || options.queryFn === skipToken) {\n return () =>\n Promise.reject(new Error(`Missing queryFn: '${options.queryHash}'`))\n }\n\n return options.queryFn\n}\n\nexport function shouldThrowError<T extends (...args: Array<any>) => boolean>(\n throwOnError: boolean | T | undefined,\n params: Parameters<T>,\n): boolean {\n // Allow throwOnError function to override throwing behavior on a per-error basis\n if (typeof throwOnError === 'function') {\n return throwOnError(...params)\n }\n\n return !!throwOnError\n}\n\nexport function addConsumeAwareSignal<T>(\n object: T,\n getSignal: () => AbortSignal,\n onCancelled: VoidFunction,\n): T & { signal: AbortSignal } {\n let consumed = false\n let signal: AbortSignal | undefined\n\n Object.defineProperty(object, 'signal', {\n enumerable: true,\n get: () => {\n signal ??= getSignal()\n if (consumed) {\n return signal\n }\n\n consumed = true\n if (signal.aborted) {\n onCancelled()\n } else {\n signal.addEventListener('abort', onCancelled, { once: true })\n }\n\n return signal\n },\n })\n\n return object as T & { signal: AbortSignal }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.cjs","names":[],"sources":["../../src/utils.ts"],"sourcesContent":["import { timeoutManager } from './timeoutManager'\nimport type {\n DefaultError,\n FetchStatus,\n MutationKey,\n MutationStatus,\n QueryFunction,\n QueryKey,\n QueryOptions,\n} from './types'\nimport type { Mutation } from './mutation'\nimport type { FetchOptions, Query } from './query'\n\n// TYPES\n\ntype DropLast<T extends ReadonlyArray<unknown>> = T extends readonly [\n ...infer R,\n unknown,\n]\n ? readonly [...R]\n : never\n\ntype TuplePrefixes<T extends ReadonlyArray<unknown>> = T extends readonly []\n ? readonly []\n : TuplePrefixes<DropLast<T>> | T\n\nexport interface QueryFilters<TQueryKey extends QueryKey = QueryKey> {\n /**\n * Filter to active queries, inactive queries or all queries\n */\n type?: QueryTypeFilter\n /**\n * Match query key exactly\n */\n exact?: boolean\n /**\n * Include queries matching this predicate function\n */\n predicate?: (query: Query) => boolean\n /**\n * Include queries matching this query key\n */\n queryKey?: TQueryKey | TuplePrefixes<TQueryKey>\n /**\n * Include or exclude stale queries\n */\n stale?: boolean\n /**\n * Include queries matching their fetchStatus\n */\n fetchStatus?: FetchStatus\n}\n\nexport interface MutationFilters<\n TData = unknown,\n TError = DefaultError,\n TVariables = unknown,\n TOnMutateResult = unknown,\n> {\n /**\n * Match mutation key exactly\n */\n exact?: boolean\n /**\n * Include mutations matching this predicate function\n */\n predicate?: (\n mutation: Mutation<TData, TError, TVariables, TOnMutateResult>,\n ) => boolean\n /**\n * Include mutations matching this mutation key\n */\n mutationKey?: TuplePrefixes<MutationKey>\n /**\n * Filter by mutation status\n */\n status?: MutationStatus\n}\n\nexport type Updater<TInput, TOutput> = TOutput | ((input: TInput) => TOutput)\n\nexport type QueryTypeFilter = 'all' | 'active' | 'inactive'\n\n// UTILS\n\n/** @deprecated\n * use `environmentManager.isServer()` instead.\n */\nexport const isServer = typeof window === 'undefined' || 'Deno' in globalThis\n\nexport function noop(): void\nexport function noop(): undefined\nexport function noop() {}\n\nexport function functionalUpdate<TInput, TOutput>(\n updater: Updater<TInput, TOutput>,\n input: TInput,\n): TOutput {\n return typeof updater === 'function'\n ? (updater as (_: TInput) => TOutput)(input)\n : updater\n}\n\nexport function isValidTimeout(value: unknown): value is number {\n return typeof value === 'number' && value >= 0 && value !== Infinity\n}\n\nexport function timeUntilStale(updatedAt: number, staleTime?: number): number {\n return Math.max(updatedAt + (staleTime || 0) - Date.now(), 0)\n}\n\nexport function resolveQueryValue<\n TValue,\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n value:\n | undefined\n | TValue\n | ((query: Query<TQueryFnData, TError, TData, TQueryKey>) => TValue),\n query: Query<TQueryFnData, TError, TData, TQueryKey>,\n): TValue | undefined {\n return typeof value === 'function'\n ? (\n value as (\n query: Query<TQueryFnData, TError, TData, TQueryKey>,\n ) => TValue\n )(query)\n : value\n}\n\nexport function matchQuery(\n filters: QueryFilters,\n query: Query<any, any, any, any>,\n): boolean {\n const {\n type = 'all',\n exact,\n fetchStatus,\n predicate,\n queryKey,\n stale,\n } = filters\n\n if (queryKey) {\n if (exact) {\n if (query.queryHash !== hashQueryKeyByOptions(queryKey, query.options)) {\n return false\n }\n } else if (!partialMatchKey(query.queryKey, queryKey)) {\n return false\n }\n }\n\n if (type !== 'all') {\n const isActive = query.isActive()\n if (type === 'active' && !isActive) {\n return false\n }\n if (type === 'inactive' && isActive) {\n return false\n }\n }\n\n if (typeof stale === 'boolean' && query.isStale() !== stale) {\n return false\n }\n\n if (fetchStatus && fetchStatus !== query.state.fetchStatus) {\n return false\n }\n\n if (predicate && !predicate(query)) {\n return false\n }\n\n return true\n}\n\nexport function matchMutation(\n filters: MutationFilters,\n mutation: Mutation<any, any>,\n): boolean {\n const { exact, status, predicate, mutationKey } = filters\n if (mutationKey) {\n if (!mutation.options.mutationKey) {\n return false\n }\n if (exact) {\n if (hashKey(mutation.options.mutationKey) !== hashKey(mutationKey)) {\n return false\n }\n } else if (!partialMatchKey(mutation.options.mutationKey, mutationKey)) {\n return false\n }\n }\n\n if (status && mutation.state.status !== status) {\n return false\n }\n\n if (predicate && !predicate(mutation)) {\n return false\n }\n\n return true\n}\n\nexport function hashQueryKeyByOptions<TQueryKey extends QueryKey = QueryKey>(\n queryKey: TQueryKey,\n options?: Pick<QueryOptions<any, any, any, any>, 'queryKeyHashFn'>,\n): string {\n const hashFn = options?.queryKeyHashFn || hashKey\n return hashFn(queryKey)\n}\n\n/**\n * Default query & mutation keys hash function.\n * Hashes the value into a stable hash.\n */\nexport function hashKey(queryKey: QueryKey | MutationKey): string {\n return JSON.stringify(queryKey, (_, val) =>\n isPlainObject(val)\n ? Object.keys(val)\n .sort()\n .reduce((result, key) => {\n result[key] = val[key]\n return result\n }, {} as any)\n : val,\n )\n}\n\n/**\n * Checks if key `b` partially matches with key `a`.\n */\nexport function partialMatchKey(a: QueryKey, b: QueryKey): boolean\nexport function partialMatchKey(a: any, b: any): boolean {\n if (a === b) {\n return true\n }\n\n if (typeof a !== typeof b) {\n return false\n }\n\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n if (Array.isArray(a) && Array.isArray(b)) {\n for (let i = 0; i < b.length; i++) {\n if (!partialMatchKey(a[i], b[i])) {\n return false\n }\n }\n return true\n }\n\n const bKeys = Object.keys(b)\n for (const key of bKeys) {\n if (!partialMatchKey(a[key], b[key])) {\n return false\n }\n }\n return true\n }\n\n return false\n}\n\nconst hasOwn = Object.prototype.hasOwnProperty\n\n/**\n * This function returns `a` if `b` is deeply equal.\n * If not, it will replace any deeply equal children of `b` with those of `a`.\n * This can be used for structural sharing between JSON values for example.\n */\nexport function replaceEqualDeep<T>(a: unknown, b: T, depth?: number): T\nexport function replaceEqualDeep(a: any, b: any, depth = 0): any {\n if (a === b) {\n return a\n }\n\n if (depth > 500) return b\n\n const array = isPlainArray(a) && isPlainArray(b)\n\n if (!array && !(isPlainObject(a) && isPlainObject(b))) return b\n\n const aItems = array ? a : Object.keys(a)\n const aSize = aItems.length\n const bItems = array ? b : Object.keys(b)\n const bSize = bItems.length\n const copy: any = array ? new Array(bSize) : {}\n\n let equalItems = 0\n\n for (let i = 0; i < bSize; i++) {\n const key: any = array ? i : bItems[i]\n const aItem = a[key]\n const bItem = b[key]\n\n if (aItem === bItem) {\n copy[key] = aItem\n if (array ? i < aSize : hasOwn.call(a, key)) equalItems++\n continue\n }\n\n if (\n aItem === null ||\n bItem === null ||\n typeof aItem !== 'object' ||\n typeof bItem !== 'object'\n ) {\n copy[key] = bItem\n continue\n }\n\n const v = replaceEqualDeep(aItem, bItem, depth + 1)\n copy[key] = v\n if (v === aItem) equalItems++\n }\n\n return aSize === bSize && equalItems === aSize ? a : copy\n}\n\n/**\n * Shallow compare objects.\n */\nexport function shallowEqualObjects<T extends Record<string, any>>(\n a: T,\n b: T | undefined,\n): boolean {\n if (!b || Object.keys(a).length !== Object.keys(b).length) {\n return false\n }\n\n for (const key in a) {\n if (a[key] !== b[key]) {\n return false\n }\n }\n\n return true\n}\n\nexport function isPlainArray(value: unknown): value is Array<unknown> {\n return Array.isArray(value) && value.length === Object.keys(value).length\n}\n\n// Copied from: https://github.com/jonschlinkert/is-plain-object\nexport function isPlainObject(o: any): o is Record<PropertyKey, unknown> {\n if (!hasObjectPrototype(o)) {\n return false\n }\n\n // If has no constructor\n const ctor = o.constructor\n if (ctor === undefined) {\n return true\n }\n\n // If has modified prototype\n const prot = ctor.prototype\n if (!hasObjectPrototype(prot)) {\n return false\n }\n\n // If constructor does not have an Object-specific method\n if (!prot.hasOwnProperty('isPrototypeOf')) {\n return false\n }\n\n // Handles Objects created by Object.create(<arbitrary prototype>)\n if (Object.getPrototypeOf(o) !== Object.prototype) {\n return false\n }\n\n // Most likely a plain Object\n return true\n}\n\nfunction hasObjectPrototype(o: any): boolean {\n return Object.prototype.toString.call(o) === '[object Object]'\n}\n\nexport function sleep(timeout: number): Promise<void> {\n return new Promise((resolve) => {\n timeoutManager.setTimeout(resolve, timeout)\n })\n}\n\nexport function replaceData<\n TData,\n TOptions extends QueryOptions<any, any, any, any>,\n>(prevData: TData | undefined, data: TData, options: TOptions): TData {\n if (typeof options.structuralSharing === 'function') {\n return options.structuralSharing(prevData, data) as TData\n } else if (options.structuralSharing !== false) {\n if (process.env.NODE_ENV !== 'production') {\n try {\n return replaceEqualDeep(prevData, data)\n } catch (error) {\n console.error(\n `Structural sharing requires data to be JSON serializable. To fix this, turn off structuralSharing or return JSON-serializable data from your queryFn. [${options.queryHash}]: ${error}`,\n )\n\n // Prevent the replaceEqualDeep from being called again down below.\n throw error\n }\n }\n // Structurally share data between prev and new data if needed\n return replaceEqualDeep(prevData, data)\n }\n return data\n}\n\nexport function keepPreviousData<T>(\n previousData: T | undefined,\n): T | undefined {\n return previousData\n}\n\nexport function addToEnd<T>(items: Array<T>, item: T, max = 0): Array<T> {\n const newItems = [...items, item]\n return max && newItems.length > max ? newItems.slice(1) : newItems\n}\n\nexport function addToStart<T>(items: Array<T>, item: T, max = 0): Array<T> {\n const newItems = [item, ...items]\n return max && newItems.length > max ? newItems.slice(0, -1) : newItems\n}\n\nexport const skipToken = Symbol()\nexport type SkipToken = typeof skipToken\n\nexport function ensureQueryFn<\n TQueryFnData = unknown,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: {\n queryFn?: QueryFunction<TQueryFnData, TQueryKey> | SkipToken\n queryHash?: string\n },\n fetchOptions?: FetchOptions<TQueryFnData>,\n): QueryFunction<TQueryFnData, TQueryKey> {\n if (process.env.NODE_ENV !== 'production') {\n if (options.queryFn === skipToken) {\n console.error(\n `Attempted to invoke queryFn when set to skipToken. This is likely a configuration error. Query hash: '${options.queryHash}'`,\n )\n }\n }\n\n // if we attempt to retry a fetch that was triggered from an initialPromise\n // when we don't have a queryFn yet, we can't retry, so we just return the already rejected initialPromise\n // if an observer has already mounted, we will be able to retry with that queryFn\n if (!options.queryFn && fetchOptions?.initialPromise) {\n return () => fetchOptions.initialPromise!\n }\n\n if (!options.queryFn || options.queryFn === skipToken) {\n return () =>\n Promise.reject(new Error(`Missing queryFn: '${options.queryHash}'`))\n }\n\n return options.queryFn\n}\n\nexport function shouldThrowError<T extends (...args: Array<any>) => boolean>(\n throwOnError: boolean | T | undefined,\n params: Parameters<T>,\n): boolean {\n // Allow throwOnError function to override throwing behavior on a per-error basis\n if (typeof throwOnError === 'function') {\n return throwOnError(...params)\n }\n\n return !!throwOnError\n}\n\nexport function addConsumeAwareSignal<T>(\n object: T,\n getSignal: () => AbortSignal,\n onCancelled: VoidFunction,\n): T & { signal: AbortSignal } {\n let consumed = false\n let signal: AbortSignal | undefined\n\n Object.defineProperty(object, 'signal', {\n enumerable: true,\n get: () => {\n signal ??= getSignal()\n if (consumed) {\n return signal\n }\n\n consumed = true\n if (signal.aborted) {\n onCancelled()\n } else {\n signal.addEventListener('abort', onCancelled, { once: true })\n }\n\n return signal\n },\n })\n\n return object as T & { signal: AbortSignal }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { An as noop, Bn as timeUntilStale, Cn as isPlainArray, Dn as keepPreviousData, En as isValidTimeout, Fn as resolveStaleTime, In as shallowEqualObjects, Ln as shouldThrowError, Mn as replaceData, Nn as replaceEqualDeep, On as matchMutation, Pn as resolveQueryBoolean, Rn as skipToken, Sn as hashQueryKeyByOptions, Tn as isServer, _n as addToEnd, bn as functionalUpdate, dn as MutationFilters, fn as QueryFilters, gn as addConsumeAwareSignal, hn as Updater, jn as partialMatchKey, kn as matchQuery, mn as SkipToken, pn as QueryTypeFilter, vn as addToStart, wn as isPlainObject, xn as hashKey, yn as ensureQueryFn, zn as sleep } from "./hydration-BoHd-X9T.cjs";
2
- export { MutationFilters, QueryFilters, QueryTypeFilter, SkipToken, Updater, addConsumeAwareSignal, addToEnd, addToStart, ensureQueryFn, functionalUpdate, hashKey, hashQueryKeyByOptions, isPlainArray, isPlainObject, isServer, isValidTimeout, keepPreviousData, matchMutation, matchQuery, noop, partialMatchKey, replaceData, replaceEqualDeep, resolveQueryBoolean, resolveStaleTime, shallowEqualObjects, shouldThrowError, skipToken, sleep, timeUntilStale };
1
+ import { An as noop, Cn as isPlainArray, Dn as keepPreviousData, En as isValidTimeout, Fn as shallowEqualObjects, In as shouldThrowError, Ln as skipToken, Mn as replaceData, Nn as replaceEqualDeep, On as matchMutation, Pn as resolveQueryValue, Rn as sleep, Sn as hashQueryKeyByOptions, Tn as isServer, _n as addToEnd, bn as functionalUpdate, dn as MutationFilters, fn as QueryFilters, gn as addConsumeAwareSignal, hn as Updater, jn as partialMatchKey, kn as matchQuery, mn as SkipToken, pn as QueryTypeFilter, vn as addToStart, wn as isPlainObject, xn as hashKey, yn as ensureQueryFn, zn as timeUntilStale } from "./hydration-DWGr3cFC.cjs";
2
+ export { MutationFilters, QueryFilters, QueryTypeFilter, SkipToken, Updater, addConsumeAwareSignal, addToEnd, addToStart, ensureQueryFn, functionalUpdate, hashKey, hashQueryKeyByOptions, isPlainArray, isPlainObject, isServer, isValidTimeout, keepPreviousData, matchMutation, matchQuery, noop, partialMatchKey, replaceData, replaceEqualDeep, resolveQueryValue, shallowEqualObjects, shouldThrowError, skipToken, sleep, timeUntilStale };
@@ -1,2 +1,2 @@
1
- import { An as noop, Bn as timeUntilStale, Cn as isPlainArray, Dn as keepPreviousData, En as isValidTimeout, Fn as resolveStaleTime, In as shallowEqualObjects, Ln as shouldThrowError, Mn as replaceData, Nn as replaceEqualDeep, On as matchMutation, Pn as resolveQueryBoolean, Rn as skipToken, Sn as hashQueryKeyByOptions, Tn as isServer, _n as addToEnd, bn as functionalUpdate, dn as MutationFilters, fn as QueryFilters, gn as addConsumeAwareSignal, hn as Updater, jn as partialMatchKey, kn as matchQuery, mn as SkipToken, pn as QueryTypeFilter, vn as addToStart, wn as isPlainObject, xn as hashKey, yn as ensureQueryFn, zn as sleep } from "./hydration-DFwTM9vM.js";
2
- export { MutationFilters, QueryFilters, QueryTypeFilter, SkipToken, Updater, addConsumeAwareSignal, addToEnd, addToStart, ensureQueryFn, functionalUpdate, hashKey, hashQueryKeyByOptions, isPlainArray, isPlainObject, isServer, isValidTimeout, keepPreviousData, matchMutation, matchQuery, noop, partialMatchKey, replaceData, replaceEqualDeep, resolveQueryBoolean, resolveStaleTime, shallowEqualObjects, shouldThrowError, skipToken, sleep, timeUntilStale };
1
+ import { An as noop, Cn as isPlainArray, Dn as keepPreviousData, En as isValidTimeout, Fn as shallowEqualObjects, In as shouldThrowError, Ln as skipToken, Mn as replaceData, Nn as replaceEqualDeep, On as matchMutation, Pn as resolveQueryValue, Rn as sleep, Sn as hashQueryKeyByOptions, Tn as isServer, _n as addToEnd, bn as functionalUpdate, dn as MutationFilters, fn as QueryFilters, gn as addConsumeAwareSignal, hn as Updater, jn as partialMatchKey, kn as matchQuery, mn as SkipToken, pn as QueryTypeFilter, vn as addToStart, wn as isPlainObject, xn as hashKey, yn as ensureQueryFn, zn as timeUntilStale } from "./hydration-Bjs0MSgg.js";
2
+ export { MutationFilters, QueryFilters, QueryTypeFilter, SkipToken, Updater, addConsumeAwareSignal, addToEnd, addToStart, ensureQueryFn, functionalUpdate, hashKey, hashQueryKeyByOptions, isPlainArray, isPlainObject, isServer, isValidTimeout, keepPreviousData, matchMutation, matchQuery, noop, partialMatchKey, replaceData, replaceEqualDeep, resolveQueryValue, shallowEqualObjects, shouldThrowError, skipToken, sleep, timeUntilStale };
@@ -14,11 +14,8 @@ function isValidTimeout(value) {
14
14
  function timeUntilStale(updatedAt, staleTime) {
15
15
  return Math.max(updatedAt + (staleTime || 0) - Date.now(), 0);
16
16
  }
17
- function resolveStaleTime(staleTime, query) {
18
- return typeof staleTime === "function" ? staleTime(query) : staleTime;
19
- }
20
- function resolveQueryBoolean(option, query) {
21
- return typeof option === "function" ? option(query) : option;
17
+ function resolveQueryValue(value, query) {
18
+ return typeof value === "function" ? value(query) : value;
22
19
  }
23
20
  function matchQuery(filters, query) {
24
21
  const { type = "all", exact, fetchStatus, predicate, queryKey, stale } = filters;
@@ -189,6 +186,6 @@ function addConsumeAwareSignal(object, getSignal, onCancelled) {
189
186
  return object;
190
187
  }
191
188
  //#endregion
192
- export { addConsumeAwareSignal, addToEnd, addToStart, ensureQueryFn, functionalUpdate, hashKey, hashQueryKeyByOptions, isPlainArray, isPlainObject, isServer, isValidTimeout, keepPreviousData, matchMutation, matchQuery, noop, partialMatchKey, replaceData, replaceEqualDeep, resolveQueryBoolean, resolveStaleTime, shallowEqualObjects, shouldThrowError, skipToken, sleep, timeUntilStale };
189
+ export { addConsumeAwareSignal, addToEnd, addToStart, ensureQueryFn, functionalUpdate, hashKey, hashQueryKeyByOptions, isPlainArray, isPlainObject, isServer, isValidTimeout, keepPreviousData, matchMutation, matchQuery, noop, partialMatchKey, replaceData, replaceEqualDeep, resolveQueryValue, shallowEqualObjects, shouldThrowError, skipToken, sleep, timeUntilStale };
193
190
 
194
191
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../src/utils.ts"],"sourcesContent":["import { timeoutManager } from './timeoutManager'\nimport type {\n DefaultError,\n FetchStatus,\n MutationKey,\n MutationStatus,\n QueryBooleanOption,\n QueryFunction,\n QueryKey,\n QueryOptions,\n StaleTime,\n StaleTimeFunction,\n} from './types'\nimport type { Mutation } from './mutation'\nimport type { FetchOptions, Query } from './query'\n\n// TYPES\n\ntype DropLast<T extends ReadonlyArray<unknown>> = T extends readonly [\n ...infer R,\n unknown,\n]\n ? readonly [...R]\n : never\n\ntype TuplePrefixes<T extends ReadonlyArray<unknown>> = T extends readonly []\n ? readonly []\n : TuplePrefixes<DropLast<T>> | T\n\nexport interface QueryFilters<TQueryKey extends QueryKey = QueryKey> {\n /**\n * Filter to active queries, inactive queries or all queries\n */\n type?: QueryTypeFilter\n /**\n * Match query key exactly\n */\n exact?: boolean\n /**\n * Include queries matching this predicate function\n */\n predicate?: (query: Query) => boolean\n /**\n * Include queries matching this query key\n */\n queryKey?: TQueryKey | TuplePrefixes<TQueryKey>\n /**\n * Include or exclude stale queries\n */\n stale?: boolean\n /**\n * Include queries matching their fetchStatus\n */\n fetchStatus?: FetchStatus\n}\n\nexport interface MutationFilters<\n TData = unknown,\n TError = DefaultError,\n TVariables = unknown,\n TOnMutateResult = unknown,\n> {\n /**\n * Match mutation key exactly\n */\n exact?: boolean\n /**\n * Include mutations matching this predicate function\n */\n predicate?: (\n mutation: Mutation<TData, TError, TVariables, TOnMutateResult>,\n ) => boolean\n /**\n * Include mutations matching this mutation key\n */\n mutationKey?: TuplePrefixes<MutationKey>\n /**\n * Filter by mutation status\n */\n status?: MutationStatus\n}\n\nexport type Updater<TInput, TOutput> = TOutput | ((input: TInput) => TOutput)\n\nexport type QueryTypeFilter = 'all' | 'active' | 'inactive'\n\n// UTILS\n\n/** @deprecated\n * use `environmentManager.isServer()` instead.\n */\nexport const isServer = typeof window === 'undefined' || 'Deno' in globalThis\n\nexport function noop(): void\nexport function noop(): undefined\nexport function noop() {}\n\nexport function functionalUpdate<TInput, TOutput>(\n updater: Updater<TInput, TOutput>,\n input: TInput,\n): TOutput {\n return typeof updater === 'function'\n ? (updater as (_: TInput) => TOutput)(input)\n : updater\n}\n\nexport function isValidTimeout(value: unknown): value is number {\n return typeof value === 'number' && value >= 0 && value !== Infinity\n}\n\nexport function timeUntilStale(updatedAt: number, staleTime?: number): number {\n return Math.max(updatedAt + (staleTime || 0) - Date.now(), 0)\n}\n\nexport function resolveStaleTime<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n staleTime:\n | undefined\n | StaleTimeFunction<TQueryFnData, TError, TData, TQueryKey>,\n query: Query<TQueryFnData, TError, TData, TQueryKey>,\n): StaleTime | undefined {\n return typeof staleTime === 'function' ? staleTime(query) : staleTime\n}\n\nexport function resolveQueryBoolean<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n option:\n | undefined\n | QueryBooleanOption<TQueryFnData, TError, TData, TQueryKey>,\n query: Query<TQueryFnData, TError, TData, TQueryKey>,\n): boolean | undefined {\n return typeof option === 'function' ? option(query) : option\n}\n\nexport function matchQuery(\n filters: QueryFilters,\n query: Query<any, any, any, any>,\n): boolean {\n const {\n type = 'all',\n exact,\n fetchStatus,\n predicate,\n queryKey,\n stale,\n } = filters\n\n if (queryKey) {\n if (exact) {\n if (query.queryHash !== hashQueryKeyByOptions(queryKey, query.options)) {\n return false\n }\n } else if (!partialMatchKey(query.queryKey, queryKey)) {\n return false\n }\n }\n\n if (type !== 'all') {\n const isActive = query.isActive()\n if (type === 'active' && !isActive) {\n return false\n }\n if (type === 'inactive' && isActive) {\n return false\n }\n }\n\n if (typeof stale === 'boolean' && query.isStale() !== stale) {\n return false\n }\n\n if (fetchStatus && fetchStatus !== query.state.fetchStatus) {\n return false\n }\n\n if (predicate && !predicate(query)) {\n return false\n }\n\n return true\n}\n\nexport function matchMutation(\n filters: MutationFilters,\n mutation: Mutation<any, any>,\n): boolean {\n const { exact, status, predicate, mutationKey } = filters\n if (mutationKey) {\n if (!mutation.options.mutationKey) {\n return false\n }\n if (exact) {\n if (hashKey(mutation.options.mutationKey) !== hashKey(mutationKey)) {\n return false\n }\n } else if (!partialMatchKey(mutation.options.mutationKey, mutationKey)) {\n return false\n }\n }\n\n if (status && mutation.state.status !== status) {\n return false\n }\n\n if (predicate && !predicate(mutation)) {\n return false\n }\n\n return true\n}\n\nexport function hashQueryKeyByOptions<TQueryKey extends QueryKey = QueryKey>(\n queryKey: TQueryKey,\n options?: Pick<QueryOptions<any, any, any, any>, 'queryKeyHashFn'>,\n): string {\n const hashFn = options?.queryKeyHashFn || hashKey\n return hashFn(queryKey)\n}\n\n/**\n * Default query & mutation keys hash function.\n * Hashes the value into a stable hash.\n */\nexport function hashKey(queryKey: QueryKey | MutationKey): string {\n return JSON.stringify(queryKey, (_, val) =>\n isPlainObject(val)\n ? Object.keys(val)\n .sort()\n .reduce((result, key) => {\n result[key] = val[key]\n return result\n }, {} as any)\n : val,\n )\n}\n\n/**\n * Checks if key `b` partially matches with key `a`.\n */\nexport function partialMatchKey(a: QueryKey, b: QueryKey): boolean\nexport function partialMatchKey(a: any, b: any): boolean {\n if (a === b) {\n return true\n }\n\n if (typeof a !== typeof b) {\n return false\n }\n\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n if (Array.isArray(a) && Array.isArray(b)) {\n for (let i = 0; i < b.length; i++) {\n if (!partialMatchKey(a[i], b[i])) {\n return false\n }\n }\n return true\n }\n\n const bKeys = Object.keys(b)\n for (const key of bKeys) {\n if (!partialMatchKey(a[key], b[key])) {\n return false\n }\n }\n return true\n }\n\n return false\n}\n\nconst hasOwn = Object.prototype.hasOwnProperty\n\n/**\n * This function returns `a` if `b` is deeply equal.\n * If not, it will replace any deeply equal children of `b` with those of `a`.\n * This can be used for structural sharing between JSON values for example.\n */\nexport function replaceEqualDeep<T>(a: unknown, b: T, depth?: number): T\nexport function replaceEqualDeep(a: any, b: any, depth = 0): any {\n if (a === b) {\n return a\n }\n\n if (depth > 500) return b\n\n const array = isPlainArray(a) && isPlainArray(b)\n\n if (!array && !(isPlainObject(a) && isPlainObject(b))) return b\n\n const aItems = array ? a : Object.keys(a)\n const aSize = aItems.length\n const bItems = array ? b : Object.keys(b)\n const bSize = bItems.length\n const copy: any = array ? new Array(bSize) : {}\n\n let equalItems = 0\n\n for (let i = 0; i < bSize; i++) {\n const key: any = array ? i : bItems[i]\n const aItem = a[key]\n const bItem = b[key]\n\n if (aItem === bItem) {\n copy[key] = aItem\n if (array ? i < aSize : hasOwn.call(a, key)) equalItems++\n continue\n }\n\n if (\n aItem === null ||\n bItem === null ||\n typeof aItem !== 'object' ||\n typeof bItem !== 'object'\n ) {\n copy[key] = bItem\n continue\n }\n\n const v = replaceEqualDeep(aItem, bItem, depth + 1)\n copy[key] = v\n if (v === aItem) equalItems++\n }\n\n return aSize === bSize && equalItems === aSize ? a : copy\n}\n\n/**\n * Shallow compare objects.\n */\nexport function shallowEqualObjects<T extends Record<string, any>>(\n a: T,\n b: T | undefined,\n): boolean {\n if (!b || Object.keys(a).length !== Object.keys(b).length) {\n return false\n }\n\n for (const key in a) {\n if (a[key] !== b[key]) {\n return false\n }\n }\n\n return true\n}\n\nexport function isPlainArray(value: unknown): value is Array<unknown> {\n return Array.isArray(value) && value.length === Object.keys(value).length\n}\n\n// Copied from: https://github.com/jonschlinkert/is-plain-object\nexport function isPlainObject(o: any): o is Record<PropertyKey, unknown> {\n if (!hasObjectPrototype(o)) {\n return false\n }\n\n // If has no constructor\n const ctor = o.constructor\n if (ctor === undefined) {\n return true\n }\n\n // If has modified prototype\n const prot = ctor.prototype\n if (!hasObjectPrototype(prot)) {\n return false\n }\n\n // If constructor does not have an Object-specific method\n if (!prot.hasOwnProperty('isPrototypeOf')) {\n return false\n }\n\n // Handles Objects created by Object.create(<arbitrary prototype>)\n if (Object.getPrototypeOf(o) !== Object.prototype) {\n return false\n }\n\n // Most likely a plain Object\n return true\n}\n\nfunction hasObjectPrototype(o: any): boolean {\n return Object.prototype.toString.call(o) === '[object Object]'\n}\n\nexport function sleep(timeout: number): Promise<void> {\n return new Promise((resolve) => {\n timeoutManager.setTimeout(resolve, timeout)\n })\n}\n\nexport function replaceData<\n TData,\n TOptions extends QueryOptions<any, any, any, any>,\n>(prevData: TData | undefined, data: TData, options: TOptions): TData {\n if (typeof options.structuralSharing === 'function') {\n return options.structuralSharing(prevData, data) as TData\n } else if (options.structuralSharing !== false) {\n if (process.env.NODE_ENV !== 'production') {\n try {\n return replaceEqualDeep(prevData, data)\n } catch (error) {\n console.error(\n `Structural sharing requires data to be JSON serializable. To fix this, turn off structuralSharing or return JSON-serializable data from your queryFn. [${options.queryHash}]: ${error}`,\n )\n\n // Prevent the replaceEqualDeep from being called again down below.\n throw error\n }\n }\n // Structurally share data between prev and new data if needed\n return replaceEqualDeep(prevData, data)\n }\n return data\n}\n\nexport function keepPreviousData<T>(\n previousData: T | undefined,\n): T | undefined {\n return previousData\n}\n\nexport function addToEnd<T>(items: Array<T>, item: T, max = 0): Array<T> {\n const newItems = [...items, item]\n return max && newItems.length > max ? newItems.slice(1) : newItems\n}\n\nexport function addToStart<T>(items: Array<T>, item: T, max = 0): Array<T> {\n const newItems = [item, ...items]\n return max && newItems.length > max ? newItems.slice(0, -1) : newItems\n}\n\nexport const skipToken = Symbol()\nexport type SkipToken = typeof skipToken\n\nexport function ensureQueryFn<\n TQueryFnData = unknown,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: {\n queryFn?: QueryFunction<TQueryFnData, TQueryKey> | SkipToken\n queryHash?: string\n },\n fetchOptions?: FetchOptions<TQueryFnData>,\n): QueryFunction<TQueryFnData, TQueryKey> {\n if (process.env.NODE_ENV !== 'production') {\n if (options.queryFn === skipToken) {\n console.error(\n `Attempted to invoke queryFn when set to skipToken. This is likely a configuration error. Query hash: '${options.queryHash}'`,\n )\n }\n }\n\n // if we attempt to retry a fetch that was triggered from an initialPromise\n // when we don't have a queryFn yet, we can't retry, so we just return the already rejected initialPromise\n // if an observer has already mounted, we will be able to retry with that queryFn\n if (!options.queryFn && fetchOptions?.initialPromise) {\n return () => fetchOptions.initialPromise!\n }\n\n if (!options.queryFn || options.queryFn === skipToken) {\n return () =>\n Promise.reject(new Error(`Missing queryFn: '${options.queryHash}'`))\n }\n\n return options.queryFn\n}\n\nexport function shouldThrowError<T extends (...args: Array<any>) => boolean>(\n throwOnError: boolean | T | undefined,\n params: Parameters<T>,\n): boolean {\n // Allow throwOnError function to override throwing behavior on a per-error basis\n if (typeof throwOnError === 'function') {\n return throwOnError(...params)\n }\n\n return !!throwOnError\n}\n\nexport function addConsumeAwareSignal<T>(\n object: T,\n getSignal: () => AbortSignal,\n onCancelled: VoidFunction,\n): T & { signal: AbortSignal } {\n let consumed = false\n let signal: AbortSignal | undefined\n\n Object.defineProperty(object, 'signal', {\n enumerable: true,\n get: () => {\n signal ??= getSignal()\n if (consumed) {\n return signal\n }\n\n consumed = true\n if (signal.aborted) {\n onCancelled()\n } else {\n signal.addEventListener('abort', onCancelled, { once: true })\n }\n\n return signal\n },\n })\n\n return object as T & { signal: AbortSignal }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../src/utils.ts"],"sourcesContent":["import { timeoutManager } from './timeoutManager'\nimport type {\n DefaultError,\n FetchStatus,\n MutationKey,\n MutationStatus,\n QueryFunction,\n QueryKey,\n QueryOptions,\n} from './types'\nimport type { Mutation } from './mutation'\nimport type { FetchOptions, Query } from './query'\n\n// TYPES\n\ntype DropLast<T extends ReadonlyArray<unknown>> = T extends readonly [\n ...infer R,\n unknown,\n]\n ? readonly [...R]\n : never\n\ntype TuplePrefixes<T extends ReadonlyArray<unknown>> = T extends readonly []\n ? readonly []\n : TuplePrefixes<DropLast<T>> | T\n\nexport interface QueryFilters<TQueryKey extends QueryKey = QueryKey> {\n /**\n * Filter to active queries, inactive queries or all queries\n */\n type?: QueryTypeFilter\n /**\n * Match query key exactly\n */\n exact?: boolean\n /**\n * Include queries matching this predicate function\n */\n predicate?: (query: Query) => boolean\n /**\n * Include queries matching this query key\n */\n queryKey?: TQueryKey | TuplePrefixes<TQueryKey>\n /**\n * Include or exclude stale queries\n */\n stale?: boolean\n /**\n * Include queries matching their fetchStatus\n */\n fetchStatus?: FetchStatus\n}\n\nexport interface MutationFilters<\n TData = unknown,\n TError = DefaultError,\n TVariables = unknown,\n TOnMutateResult = unknown,\n> {\n /**\n * Match mutation key exactly\n */\n exact?: boolean\n /**\n * Include mutations matching this predicate function\n */\n predicate?: (\n mutation: Mutation<TData, TError, TVariables, TOnMutateResult>,\n ) => boolean\n /**\n * Include mutations matching this mutation key\n */\n mutationKey?: TuplePrefixes<MutationKey>\n /**\n * Filter by mutation status\n */\n status?: MutationStatus\n}\n\nexport type Updater<TInput, TOutput> = TOutput | ((input: TInput) => TOutput)\n\nexport type QueryTypeFilter = 'all' | 'active' | 'inactive'\n\n// UTILS\n\n/** @deprecated\n * use `environmentManager.isServer()` instead.\n */\nexport const isServer = typeof window === 'undefined' || 'Deno' in globalThis\n\nexport function noop(): void\nexport function noop(): undefined\nexport function noop() {}\n\nexport function functionalUpdate<TInput, TOutput>(\n updater: Updater<TInput, TOutput>,\n input: TInput,\n): TOutput {\n return typeof updater === 'function'\n ? (updater as (_: TInput) => TOutput)(input)\n : updater\n}\n\nexport function isValidTimeout(value: unknown): value is number {\n return typeof value === 'number' && value >= 0 && value !== Infinity\n}\n\nexport function timeUntilStale(updatedAt: number, staleTime?: number): number {\n return Math.max(updatedAt + (staleTime || 0) - Date.now(), 0)\n}\n\nexport function resolveQueryValue<\n TValue,\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n value:\n | undefined\n | TValue\n | ((query: Query<TQueryFnData, TError, TData, TQueryKey>) => TValue),\n query: Query<TQueryFnData, TError, TData, TQueryKey>,\n): TValue | undefined {\n return typeof value === 'function'\n ? (\n value as (\n query: Query<TQueryFnData, TError, TData, TQueryKey>,\n ) => TValue\n )(query)\n : value\n}\n\nexport function matchQuery(\n filters: QueryFilters,\n query: Query<any, any, any, any>,\n): boolean {\n const {\n type = 'all',\n exact,\n fetchStatus,\n predicate,\n queryKey,\n stale,\n } = filters\n\n if (queryKey) {\n if (exact) {\n if (query.queryHash !== hashQueryKeyByOptions(queryKey, query.options)) {\n return false\n }\n } else if (!partialMatchKey(query.queryKey, queryKey)) {\n return false\n }\n }\n\n if (type !== 'all') {\n const isActive = query.isActive()\n if (type === 'active' && !isActive) {\n return false\n }\n if (type === 'inactive' && isActive) {\n return false\n }\n }\n\n if (typeof stale === 'boolean' && query.isStale() !== stale) {\n return false\n }\n\n if (fetchStatus && fetchStatus !== query.state.fetchStatus) {\n return false\n }\n\n if (predicate && !predicate(query)) {\n return false\n }\n\n return true\n}\n\nexport function matchMutation(\n filters: MutationFilters,\n mutation: Mutation<any, any>,\n): boolean {\n const { exact, status, predicate, mutationKey } = filters\n if (mutationKey) {\n if (!mutation.options.mutationKey) {\n return false\n }\n if (exact) {\n if (hashKey(mutation.options.mutationKey) !== hashKey(mutationKey)) {\n return false\n }\n } else if (!partialMatchKey(mutation.options.mutationKey, mutationKey)) {\n return false\n }\n }\n\n if (status && mutation.state.status !== status) {\n return false\n }\n\n if (predicate && !predicate(mutation)) {\n return false\n }\n\n return true\n}\n\nexport function hashQueryKeyByOptions<TQueryKey extends QueryKey = QueryKey>(\n queryKey: TQueryKey,\n options?: Pick<QueryOptions<any, any, any, any>, 'queryKeyHashFn'>,\n): string {\n const hashFn = options?.queryKeyHashFn || hashKey\n return hashFn(queryKey)\n}\n\n/**\n * Default query & mutation keys hash function.\n * Hashes the value into a stable hash.\n */\nexport function hashKey(queryKey: QueryKey | MutationKey): string {\n return JSON.stringify(queryKey, (_, val) =>\n isPlainObject(val)\n ? Object.keys(val)\n .sort()\n .reduce((result, key) => {\n result[key] = val[key]\n return result\n }, {} as any)\n : val,\n )\n}\n\n/**\n * Checks if key `b` partially matches with key `a`.\n */\nexport function partialMatchKey(a: QueryKey, b: QueryKey): boolean\nexport function partialMatchKey(a: any, b: any): boolean {\n if (a === b) {\n return true\n }\n\n if (typeof a !== typeof b) {\n return false\n }\n\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n if (Array.isArray(a) && Array.isArray(b)) {\n for (let i = 0; i < b.length; i++) {\n if (!partialMatchKey(a[i], b[i])) {\n return false\n }\n }\n return true\n }\n\n const bKeys = Object.keys(b)\n for (const key of bKeys) {\n if (!partialMatchKey(a[key], b[key])) {\n return false\n }\n }\n return true\n }\n\n return false\n}\n\nconst hasOwn = Object.prototype.hasOwnProperty\n\n/**\n * This function returns `a` if `b` is deeply equal.\n * If not, it will replace any deeply equal children of `b` with those of `a`.\n * This can be used for structural sharing between JSON values for example.\n */\nexport function replaceEqualDeep<T>(a: unknown, b: T, depth?: number): T\nexport function replaceEqualDeep(a: any, b: any, depth = 0): any {\n if (a === b) {\n return a\n }\n\n if (depth > 500) return b\n\n const array = isPlainArray(a) && isPlainArray(b)\n\n if (!array && !(isPlainObject(a) && isPlainObject(b))) return b\n\n const aItems = array ? a : Object.keys(a)\n const aSize = aItems.length\n const bItems = array ? b : Object.keys(b)\n const bSize = bItems.length\n const copy: any = array ? new Array(bSize) : {}\n\n let equalItems = 0\n\n for (let i = 0; i < bSize; i++) {\n const key: any = array ? i : bItems[i]\n const aItem = a[key]\n const bItem = b[key]\n\n if (aItem === bItem) {\n copy[key] = aItem\n if (array ? i < aSize : hasOwn.call(a, key)) equalItems++\n continue\n }\n\n if (\n aItem === null ||\n bItem === null ||\n typeof aItem !== 'object' ||\n typeof bItem !== 'object'\n ) {\n copy[key] = bItem\n continue\n }\n\n const v = replaceEqualDeep(aItem, bItem, depth + 1)\n copy[key] = v\n if (v === aItem) equalItems++\n }\n\n return aSize === bSize && equalItems === aSize ? a : copy\n}\n\n/**\n * Shallow compare objects.\n */\nexport function shallowEqualObjects<T extends Record<string, any>>(\n a: T,\n b: T | undefined,\n): boolean {\n if (!b || Object.keys(a).length !== Object.keys(b).length) {\n return false\n }\n\n for (const key in a) {\n if (a[key] !== b[key]) {\n return false\n }\n }\n\n return true\n}\n\nexport function isPlainArray(value: unknown): value is Array<unknown> {\n return Array.isArray(value) && value.length === Object.keys(value).length\n}\n\n// Copied from: https://github.com/jonschlinkert/is-plain-object\nexport function isPlainObject(o: any): o is Record<PropertyKey, unknown> {\n if (!hasObjectPrototype(o)) {\n return false\n }\n\n // If has no constructor\n const ctor = o.constructor\n if (ctor === undefined) {\n return true\n }\n\n // If has modified prototype\n const prot = ctor.prototype\n if (!hasObjectPrototype(prot)) {\n return false\n }\n\n // If constructor does not have an Object-specific method\n if (!prot.hasOwnProperty('isPrototypeOf')) {\n return false\n }\n\n // Handles Objects created by Object.create(<arbitrary prototype>)\n if (Object.getPrototypeOf(o) !== Object.prototype) {\n return false\n }\n\n // Most likely a plain Object\n return true\n}\n\nfunction hasObjectPrototype(o: any): boolean {\n return Object.prototype.toString.call(o) === '[object Object]'\n}\n\nexport function sleep(timeout: number): Promise<void> {\n return new Promise((resolve) => {\n timeoutManager.setTimeout(resolve, timeout)\n })\n}\n\nexport function replaceData<\n TData,\n TOptions extends QueryOptions<any, any, any, any>,\n>(prevData: TData | undefined, data: TData, options: TOptions): TData {\n if (typeof options.structuralSharing === 'function') {\n return options.structuralSharing(prevData, data) as TData\n } else if (options.structuralSharing !== false) {\n if (process.env.NODE_ENV !== 'production') {\n try {\n return replaceEqualDeep(prevData, data)\n } catch (error) {\n console.error(\n `Structural sharing requires data to be JSON serializable. To fix this, turn off structuralSharing or return JSON-serializable data from your queryFn. [${options.queryHash}]: ${error}`,\n )\n\n // Prevent the replaceEqualDeep from being called again down below.\n throw error\n }\n }\n // Structurally share data between prev and new data if needed\n return replaceEqualDeep(prevData, data)\n }\n return data\n}\n\nexport function keepPreviousData<T>(\n previousData: T | undefined,\n): T | undefined {\n return previousData\n}\n\nexport function addToEnd<T>(items: Array<T>, item: T, max = 0): Array<T> {\n const newItems = [...items, item]\n return max && newItems.length > max ? newItems.slice(1) : newItems\n}\n\nexport function addToStart<T>(items: Array<T>, item: T, max = 0): Array<T> {\n const newItems = [item, ...items]\n return max && newItems.length > max ? newItems.slice(0, -1) : newItems\n}\n\nexport const skipToken = Symbol()\nexport type SkipToken = typeof skipToken\n\nexport function ensureQueryFn<\n TQueryFnData = unknown,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: {\n queryFn?: QueryFunction<TQueryFnData, TQueryKey> | SkipToken\n queryHash?: string\n },\n fetchOptions?: FetchOptions<TQueryFnData>,\n): QueryFunction<TQueryFnData, TQueryKey> {\n if (process.env.NODE_ENV !== 'production') {\n if (options.queryFn === skipToken) {\n console.error(\n `Attempted to invoke queryFn when set to skipToken. This is likely a configuration error. Query hash: '${options.queryHash}'`,\n )\n }\n }\n\n // if we attempt to retry a fetch that was triggered from an initialPromise\n // when we don't have a queryFn yet, we can't retry, so we just return the already rejected initialPromise\n // if an observer has already mounted, we will be able to retry with that queryFn\n if (!options.queryFn && fetchOptions?.initialPromise) {\n return () => fetchOptions.initialPromise!\n }\n\n if (!options.queryFn || options.queryFn === skipToken) {\n return () =>\n Promise.reject(new Error(`Missing queryFn: '${options.queryHash}'`))\n }\n\n return options.queryFn\n}\n\nexport function shouldThrowError<T extends (...args: Array<any>) => boolean>(\n throwOnError: boolean | T | undefined,\n params: Parameters<T>,\n): boolean {\n // Allow throwOnError function to override throwing behavior on a per-error basis\n if (typeof throwOnError === 'function') {\n return throwOnError(...params)\n }\n\n return !!throwOnError\n}\n\nexport function addConsumeAwareSignal<T>(\n object: T,\n getSignal: () => AbortSignal,\n onCancelled: VoidFunction,\n): T & { signal: AbortSignal } {\n let consumed = false\n let signal: AbortSignal | undefined\n\n Object.defineProperty(object, 'signal', {\n enumerable: true,\n get: () => {\n signal ??= getSignal()\n if (consumed) {\n return signal\n }\n\n consumed = true\n if (signal.aborted) {\n onCancelled()\n } else {\n signal.addEventListener('abort', onCancelled, { once: true })\n }\n\n return signal\n },\n })\n\n return object as T & { signal: AbortSignal }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/query-core",
3
- "version": "5.102.4",
3
+ "version": "5.102.5",
4
4
  "description": "The framework agnostic core that powers TanStack Query",
5
5
  "author": "tannerlinsley",
6
6
  "license": "MIT",
@@ -1,25 +1,23 @@
1
- import { isServer } from './utils'
1
+ import { isServer as defaultIsServer } from './utils'
2
2
 
3
3
  export type IsServerValue = () => boolean
4
4
 
5
+ let isServerFn: IsServerValue = () => defaultIsServer
6
+
5
7
  /**
6
- * Manages environment detection used by TanStack Query internals.
8
+ * Returns whether the current runtime should be treated as a server environment.
7
9
  */
8
- export const environmentManager = (() => {
9
- let isServerFn: IsServerValue = () => isServer
10
+ export const isServer = (): boolean => isServerFn()
10
11
 
11
- return {
12
- /**
13
- * Returns whether the current runtime should be treated as a server environment.
14
- */
15
- isServer(): boolean {
16
- return isServerFn()
17
- },
18
- /**
19
- * Overrides the server check globally.
20
- */
21
- setIsServer(isServerValue: IsServerValue): void {
22
- isServerFn = isServerValue
23
- },
24
- }
25
- })()
12
+ /**
13
+ * Manages environment detection used by TanStack Query internals.
14
+ */
15
+ export const environmentManager = {
16
+ isServer,
17
+ /**
18
+ * Overrides the server check globally.
19
+ */
20
+ setIsServer(isServerValue: IsServerValue): void {
21
+ isServerFn = isServerValue
22
+ },
23
+ }
@@ -14,12 +14,6 @@ function difference<T>(array1: Array<T>, array2: Array<T>): Array<T> {
14
14
  return array1.filter((x) => !excludeSet.has(x))
15
15
  }
16
16
 
17
- function replaceAt<T>(array: Array<T>, index: number, value: T): Array<T> {
18
- const copy = array.slice(0)
19
- copy[index] = value
20
- return copy
21
- }
22
-
23
17
  type QueriesObserverListener = (result: Array<QueryObserverResult>) => void
24
18
 
25
19
  type CombineFn<TCombinedResult> = (
@@ -302,7 +296,8 @@ export class QueriesObserver<
302
296
  #onUpdate(observer: QueryObserver, result: QueryObserverResult): void {
303
297
  const index = this.#observers.indexOf(observer)
304
298
  if (index !== -1) {
305
- this.#result = replaceAt(this.#result, index, result)
299
+ this.#result = this.#result.slice()
300
+ this.#result[index] = result
306
301
  this.#notify()
307
302
  }
308
303
  }
package/src/query.ts CHANGED
@@ -2,8 +2,7 @@ import {
2
2
  ensureQueryFn,
3
3
  noop,
4
4
  replaceData,
5
- resolveQueryBoolean,
6
- resolveStaleTime,
5
+ resolveQueryValue,
7
6
  skipToken,
8
7
  timeUntilStale,
9
8
  } from './utils'
@@ -273,8 +272,7 @@ export class Query<
273
272
 
274
273
  isActive(): boolean {
275
274
  return this.observers.some(
276
- (observer) =>
277
- resolveQueryBoolean(observer.options.enabled, this) !== false,
275
+ (observer) => resolveQueryValue(observer.options.enabled, this) !== false,
278
276
  )
279
277
  }
280
278
 
@@ -294,7 +292,7 @@ export class Query<
294
292
  if (this.getObserversCount() > 0) {
295
293
  return this.observers.some(
296
294
  (observer) =>
297
- resolveStaleTime(observer.options.staleTime, this) === 'static',
295
+ resolveQueryValue(observer.options.staleTime, this) === 'static',
298
296
  )
299
297
  }
300
298
 
@@ -368,7 +366,11 @@ export class Query<
368
366
  // If the transport layer does not support cancellation
369
367
  // we'll let the query continue so the result can be cached
370
368
  if (this.#retryer) {
371
- if (this.#abortSignalConsumed || this.#isInitialPausedFetch()) {
369
+ if (
370
+ this.#abortSignalConsumed ||
371
+ (this.state.fetchStatus === 'paused' &&
372
+ this.state.status === 'pending')
373
+ ) {
372
374
  this.#retryer.cancel({ revert: true })
373
375
  } else {
374
376
  this.#retryer.cancelRetry()
@@ -386,12 +388,6 @@ export class Query<
386
388
  return this.observers.length
387
389
  }
388
390
 
389
- #isInitialPausedFetch(): boolean {
390
- return (
391
- this.state.fetchStatus === 'paused' && this.state.status === 'pending'
392
- )
393
- }
394
-
395
391
  invalidate(): void {
396
392
  if (!this.state.isInvalidated) {
397
393
  this.#dispatch({ type: 'invalidate' })
@@ -4,7 +4,7 @@ import {
4
4
  hashQueryKeyByOptions,
5
5
  noop,
6
6
  partialMatchKey,
7
- resolveStaleTime,
7
+ resolveQueryValue,
8
8
  skipToken,
9
9
  } from './utils'
10
10
  import { QueryCache } from './queryCache'
@@ -158,7 +158,7 @@ export class QueryClient {
158
158
 
159
159
  if (
160
160
  options.revalidateIfStale &&
161
- query.isStaleByTime(resolveStaleTime(defaultedOptions.staleTime, query))
161
+ query.isStaleByTime(resolveQueryValue(defaultedOptions.staleTime, query))
162
162
  ) {
163
163
  void this.prefetchQuery(defaultedOptions)
164
164
  }
@@ -370,7 +370,7 @@ export class QueryClient {
370
370
  const query = this.#queryCache.build(this, defaultedOptions)
371
371
 
372
372
  const isStale = query.isStaleByTime(
373
- resolveStaleTime(defaultedOptions.staleTime, query),
373
+ resolveQueryValue(defaultedOptions.staleTime, query),
374
374
  )
375
375
 
376
376
  const queryData = isStale
@@ -414,7 +414,7 @@ export class QueryClient {
414
414
  const query = this.#queryCache.build(this, defaultedOptions)
415
415
 
416
416
  return query.isStaleByTime(
417
- resolveStaleTime(defaultedOptions.staleTime, query),
417
+ resolveQueryValue(defaultedOptions.staleTime, query),
418
418
  )
419
419
  ? query.fetch(defaultedOptions)
420
420
  : Promise.resolve(query.state.data as TData)
@@ -1,5 +1,5 @@
1
1
  import { focusManager } from './focusManager'
2
- import { environmentManager } from './environmentManager'
2
+ import { isServer as isServerEnvironment } from './environmentManager'
3
3
  import { notifyManager } from './notifyManager'
4
4
  import { fetchState } from './query'
5
5
  import { Subscribable } from './subscribable'
@@ -7,8 +7,7 @@ import {
7
7
  isValidTimeout,
8
8
  noop,
9
9
  replaceData,
10
- resolveQueryBoolean,
11
- resolveStaleTime,
10
+ resolveQueryValue,
12
11
  shallowEqualObjects,
13
12
  timeUntilStale,
14
13
  } from './utils'
@@ -149,7 +148,7 @@ export class QueryObserver<
149
148
  this.options.enabled !== undefined &&
150
149
  typeof this.options.enabled !== 'boolean' &&
151
150
  typeof this.options.enabled !== 'function' &&
152
- typeof resolveQueryBoolean(this.options.enabled, this.#currentQuery) !==
151
+ typeof resolveQueryValue(this.options.enabled, this.#currentQuery) !==
153
152
  'boolean'
154
153
  ) {
155
154
  throw new Error(
@@ -193,10 +192,10 @@ export class QueryObserver<
193
192
  if (
194
193
  mounted &&
195
194
  (this.#currentQuery !== prevQuery ||
196
- resolveQueryBoolean(this.options.enabled, this.#currentQuery) !==
197
- resolveQueryBoolean(prevOptions.enabled, this.#currentQuery) ||
198
- resolveStaleTime(this.options.staleTime, this.#currentQuery) !==
199
- resolveStaleTime(prevOptions.staleTime, this.#currentQuery))
195
+ resolveQueryValue(this.options.enabled, this.#currentQuery) !==
196
+ resolveQueryValue(prevOptions.enabled, this.#currentQuery) ||
197
+ resolveQueryValue(this.options.staleTime, this.#currentQuery) !==
198
+ resolveQueryValue(prevOptions.staleTime, this.#currentQuery))
200
199
  ) {
201
200
  this.#updateStaleTimeout()
202
201
  }
@@ -207,8 +206,8 @@ export class QueryObserver<
207
206
  if (
208
207
  mounted &&
209
208
  (this.#currentQuery !== prevQuery ||
210
- resolveQueryBoolean(this.options.enabled, this.#currentQuery) !==
211
- resolveQueryBoolean(prevOptions.enabled, this.#currentQuery) ||
209
+ resolveQueryValue(this.options.enabled, this.#currentQuery) !==
210
+ resolveQueryValue(prevOptions.enabled, this.#currentQuery) ||
212
211
  nextRefetchInterval !== this.#currentRefetchInterval)
213
212
  ) {
214
213
  this.#updateRefetchInterval(nextRefetchInterval)
@@ -228,7 +227,7 @@ export class QueryObserver<
228
227
 
229
228
  const result = this.createResult(query, options)
230
229
 
231
- if (shouldAssignObserverCurrentProperties(this, result)) {
230
+ if (!shallowEqualObjects(this.getCurrentResult(), result)) {
232
231
  // this assigns the optimistic result to the current Observer
233
232
  // because if the query function changes, useQuery will be performing
234
233
  // an effect where it would fetch again.
@@ -371,15 +370,15 @@ export class QueryObserver<
371
370
 
372
371
  #shouldScheduleTimer(timeout: unknown): timeout is number {
373
372
  return (
374
- !environmentManager.isServer() &&
375
- resolveQueryBoolean(this.options.enabled, this.#currentQuery) !== false &&
373
+ !isServerEnvironment() &&
374
+ resolveQueryValue(this.options.enabled, this.#currentQuery) !== false &&
376
375
  isValidTimeout(timeout)
377
376
  )
378
377
  }
379
378
 
380
379
  #updateStaleTimeout(): void {
381
380
  this.#clearStaleTimeout()
382
- const staleTime = resolveStaleTime(
381
+ const staleTime = resolveQueryValue(
383
382
  this.options.staleTime,
384
383
  this.#currentQuery,
385
384
  )
@@ -613,7 +612,7 @@ export class QueryObserver<
613
612
  isRefetchError: isError && hasData,
614
613
  isStale: isStale(query, options),
615
614
  refetch: this.refetch,
616
- isEnabled: resolveQueryBoolean(options.enabled, query) !== false,
615
+ isEnabled: resolveQueryValue(options.enabled, query) !== false,
617
616
  }
618
617
 
619
618
  const nextResult = result as QueryObserverResult<TData, TError>
@@ -676,7 +675,22 @@ export class QueryObserver<
676
675
  })
677
676
  }
678
677
 
679
- this.#notify({ listeners: shouldNotifyListeners() })
678
+ const notifyListeners = shouldNotifyListeners()
679
+
680
+ notifyManager.batch(() => {
681
+ // First, trigger the listeners
682
+ if (notifyListeners) {
683
+ this.listeners.forEach((listener) => {
684
+ listener(this.#currentResult)
685
+ })
686
+ }
687
+
688
+ // Then the cache listeners
689
+ this.#client.getQueryCache().notify({
690
+ query: this.#currentQuery,
691
+ type: 'observerResultsUpdated',
692
+ })
693
+ })
680
694
  }
681
695
 
682
696
  #updateQuery(): void {
@@ -705,23 +719,6 @@ export class QueryObserver<
705
719
  this.#updateTimers()
706
720
  }
707
721
  }
708
-
709
- #notify(notifyOptions: { listeners: boolean }): void {
710
- notifyManager.batch(() => {
711
- // First, trigger the listeners
712
- if (notifyOptions.listeners) {
713
- this.listeners.forEach((listener) => {
714
- listener(this.#currentResult)
715
- })
716
- }
717
-
718
- // Then the cache listeners
719
- this.#client.getQueryCache().notify({
720
- query: this.#currentQuery,
721
- type: 'observerResultsUpdated',
722
- })
723
- })
724
- }
725
722
  }
726
723
 
727
724
  function shouldLoadOnMount(
@@ -729,11 +726,11 @@ function shouldLoadOnMount(
729
726
  options: QueryObserverOptions<any, any, any, any>,
730
727
  ): boolean {
731
728
  return (
732
- resolveQueryBoolean(options.enabled, query) !== false &&
729
+ resolveQueryValue(options.enabled, query) !== false &&
733
730
  query.state.data === undefined &&
734
731
  !(
735
732
  query.state.status === 'error' &&
736
- resolveQueryBoolean(options.retryOnMount, query) === false
733
+ resolveQueryValue(options.retryOnMount, query) === false
737
734
  )
738
735
  )
739
736
  }
@@ -757,8 +754,8 @@ function shouldFetchOn(
757
754
  (typeof options)['refetchOnReconnect'],
758
755
  ) {
759
756
  if (
760
- resolveQueryBoolean(options.enabled, query) !== false &&
761
- resolveStaleTime(options.staleTime, query) !== 'static'
757
+ resolveQueryValue(options.enabled, query) !== false &&
758
+ resolveQueryValue(options.staleTime, query) !== 'static'
762
759
  ) {
763
760
  const value = typeof field === 'function' ? field(query) : field
764
761
 
@@ -775,7 +772,7 @@ function shouldFetchOptionally(
775
772
  ): boolean {
776
773
  return (
777
774
  (query !== prevQuery ||
778
- resolveQueryBoolean(prevOptions.enabled, query) === false) &&
775
+ resolveQueryValue(prevOptions.enabled, query) === false) &&
779
776
  (!options.suspense || query.state.status !== 'error') &&
780
777
  isStale(query, options)
781
778
  )
@@ -786,29 +783,7 @@ function isStale(
786
783
  options: QueryObserverOptions<any, any, any, any, any>,
787
784
  ): boolean {
788
785
  return (
789
- resolveQueryBoolean(options.enabled, query) !== false &&
790
- query.isStaleByTime(resolveStaleTime(options.staleTime, query))
786
+ resolveQueryValue(options.enabled, query) !== false &&
787
+ query.isStaleByTime(resolveQueryValue(options.staleTime, query))
791
788
  )
792
789
  }
793
-
794
- // this function would decide if we will update the observer's 'current'
795
- // properties after an optimistic reading via getOptimisticResult
796
- function shouldAssignObserverCurrentProperties<
797
- TQueryFnData = unknown,
798
- TError = unknown,
799
- TData = TQueryFnData,
800
- TQueryData = TQueryFnData,
801
- TQueryKey extends QueryKey = QueryKey,
802
- >(
803
- observer: QueryObserver<TQueryFnData, TError, TData, TQueryData, TQueryKey>,
804
- optimisticResult: QueryObserverResult<TData, TError>,
805
- ) {
806
- // if the newly created result isn't what the observer is holding as current,
807
- // then we'll need to update the properties as well
808
- if (!shallowEqualObjects(observer.getCurrentResult(), optimisticResult)) {
809
- return true
810
- }
811
-
812
- // basically, just keep previous properties if nothing changed
813
- return false
814
- }
package/src/removable.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { timeoutManager } from './timeoutManager'
2
- import { environmentManager } from './environmentManager'
2
+ import { isServer as isServerEnvironment } from './environmentManager'
3
3
  import { isValidTimeout } from './utils'
4
4
  import type { ManagedTimerId } from './timeoutManager'
5
5
 
@@ -25,7 +25,7 @@ export abstract class Removable {
25
25
  // Default to 5 minutes (Infinity for server-side) if no gcTime is set
26
26
  this.gcTime = Math.max(
27
27
  this.gcTime || 0,
28
- newGcTime ?? (environmentManager.isServer() ? Infinity : 5 * 60 * 1000),
28
+ newGcTime ?? (isServerEnvironment() ? Infinity : 5 * 60 * 1000),
29
29
  )
30
30
  }
31
31
 
package/src/retryer.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { focusManager } from './focusManager'
2
2
  import { onlineManager } from './onlineManager'
3
- import { environmentManager } from './environmentManager'
3
+ import { isServer as isServerEnvironment } from './environmentManager'
4
4
  import { noop, sleep } from './utils'
5
5
  import type { CancelOptions, DefaultError, NetworkMode } from './types'
6
6
 
@@ -175,7 +175,7 @@ export function createRetryer<TData = unknown, TError = DefaultError>(
175
175
  }
176
176
 
177
177
  // Do we need to retry the request?
178
- const retry = config.retry ?? (environmentManager.isServer() ? 0 : 3)
178
+ const retry = config.retry ?? (isServerEnvironment() ? 0 : 3)
179
179
  const retryDelay = config.retryDelay ?? defaultRetryDelay
180
180
  const delay =
181
181
  typeof retryDelay === 'function'
package/src/types.ts CHANGED
@@ -58,11 +58,11 @@ export type QueryKey = Register extends {
58
58
  : ReadonlyArray<unknown>
59
59
  : ReadonlyArray<unknown>
60
60
 
61
- export const dataTagSymbol = Symbol('dataTagSymbol')
61
+ export const dataTagSymbol = Symbol()
62
62
  export type dataTagSymbol = typeof dataTagSymbol
63
- export const dataTagErrorSymbol = Symbol('dataTagErrorSymbol')
63
+ export const dataTagErrorSymbol = Symbol()
64
64
  export type dataTagErrorSymbol = typeof dataTagErrorSymbol
65
- export const unsetMarker = Symbol('unsetMarker')
65
+ export const unsetMarker = Symbol()
66
66
  export type UnsetMarker = typeof unsetMarker
67
67
  export type AnyDataTag = {
68
68
  [dataTagSymbol]: any