@tanstack/query-core 5.0.0-alpha.5 → 5.0.0-alpha.51

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 (221) hide show
  1. package/build/lib/{focusManager.esm.js → focusManager.cjs} +9 -6
  2. package/build/lib/{focusManager.mjs.map → focusManager.cjs.map} +1 -1
  3. package/build/lib/focusManager.d.ts +2 -1
  4. package/build/lib/focusManager.d.ts.map +1 -0
  5. package/build/lib/focusManager.js +5 -8
  6. package/build/lib/focusManager.js.map +1 -1
  7. package/build/lib/{hydration.mjs → hydration.cjs} +11 -20
  8. package/build/lib/hydration.cjs.map +1 -0
  9. package/build/lib/hydration.d.ts +3 -6
  10. package/build/lib/hydration.d.ts.map +1 -0
  11. package/build/lib/hydration.js +5 -24
  12. package/build/lib/hydration.js.map +1 -1
  13. package/build/lib/index.cjs +40 -0
  14. package/build/lib/index.cjs.map +1 -0
  15. package/build/lib/index.d.ts +5 -3
  16. package/build/lib/index.d.ts.map +1 -0
  17. package/build/lib/index.js +13 -39
  18. package/build/lib/index.js.map +1 -1
  19. package/build/lib/{infiniteQueryBehavior.esm.js → infiniteQueryBehavior.cjs} +9 -4
  20. package/build/lib/infiniteQueryBehavior.cjs.map +1 -0
  21. package/build/lib/infiniteQueryBehavior.d.ts +1 -0
  22. package/build/lib/infiniteQueryBehavior.d.ts.map +1 -0
  23. package/build/lib/infiniteQueryBehavior.js +4 -7
  24. package/build/lib/infiniteQueryBehavior.js.map +1 -1
  25. package/build/lib/{infiniteQueryObserver.esm.js → infiniteQueryObserver.cjs} +11 -9
  26. package/build/lib/{infiniteQueryObserver.mjs.map → infiniteQueryObserver.cjs.map} +1 -1
  27. package/build/lib/infiniteQueryObserver.d.ts +2 -1
  28. package/build/lib/infiniteQueryObserver.d.ts.map +1 -0
  29. package/build/lib/infiniteQueryObserver.js +8 -10
  30. package/build/lib/infiniteQueryObserver.js.map +1 -1
  31. package/build/lib/{mutation.esm.js → mutation.cjs} +12 -9
  32. package/build/lib/{mutation.mjs.map → mutation.cjs.map} +1 -1
  33. package/build/lib/mutation.d.ts +2 -1
  34. package/build/lib/mutation.d.ts.map +1 -0
  35. package/build/lib/mutation.js +8 -11
  36. package/build/lib/mutation.js.map +1 -1
  37. package/build/lib/{mutationCache.esm.js → mutationCache.cjs} +21 -18
  38. package/build/lib/mutationCache.cjs.map +1 -0
  39. package/build/lib/mutationCache.d.ts +3 -2
  40. package/build/lib/mutationCache.d.ts.map +1 -0
  41. package/build/lib/mutationCache.js +18 -19
  42. package/build/lib/mutationCache.js.map +1 -1
  43. package/build/lib/{mutationObserver.esm.js → mutationObserver.cjs} +13 -11
  44. package/build/lib/mutationObserver.cjs.map +1 -0
  45. package/build/lib/mutationObserver.d.ts +2 -1
  46. package/build/lib/mutationObserver.d.ts.map +1 -0
  47. package/build/lib/mutationObserver.js +10 -12
  48. package/build/lib/mutationObserver.js.map +1 -1
  49. package/build/lib/{notifyManager.esm.js → notifyManager.cjs} +8 -5
  50. package/build/lib/{notifyManager.mjs.map → notifyManager.cjs.map} +1 -1
  51. package/build/lib/notifyManager.d.ts +4 -3
  52. package/build/lib/notifyManager.d.ts.map +1 -0
  53. package/build/lib/notifyManager.js +4 -7
  54. package/build/lib/notifyManager.js.map +1 -1
  55. package/build/lib/{onlineManager.esm.js → onlineManager.cjs} +9 -6
  56. package/build/lib/{onlineManager.mjs.map → onlineManager.cjs.map} +1 -1
  57. package/build/lib/onlineManager.d.ts +2 -1
  58. package/build/lib/onlineManager.d.ts.map +1 -0
  59. package/build/lib/onlineManager.js +5 -8
  60. package/build/lib/onlineManager.js.map +1 -1
  61. package/build/lib/{queriesObserver.esm.js → queriesObserver.cjs} +50 -25
  62. package/build/lib/queriesObserver.cjs.map +1 -0
  63. package/build/lib/queriesObserver.d.ts +14 -6
  64. package/build/lib/queriesObserver.d.ts.map +1 -0
  65. package/build/lib/queriesObserver.js +47 -26
  66. package/build/lib/queriesObserver.js.map +1 -1
  67. package/build/lib/{query.mjs → query.cjs} +20 -18
  68. package/build/lib/query.cjs.map +1 -0
  69. package/build/lib/query.d.ts +6 -4
  70. package/build/lib/query.d.ts.map +1 -0
  71. package/build/lib/query.js +17 -19
  72. package/build/lib/query.js.map +1 -1
  73. package/build/lib/{queryCache.mjs → queryCache.cjs} +28 -23
  74. package/build/lib/queryCache.cjs.map +1 -0
  75. package/build/lib/queryCache.d.ts +3 -3
  76. package/build/lib/queryCache.d.ts.map +1 -0
  77. package/build/lib/queryCache.js +24 -23
  78. package/build/lib/queryCache.js.map +1 -1
  79. package/build/lib/{queryClient.esm.js → queryClient.cjs} +50 -42
  80. package/build/lib/queryClient.cjs.map +1 -0
  81. package/build/lib/queryClient.d.ts +2 -2
  82. package/build/lib/queryClient.d.ts.map +1 -0
  83. package/build/lib/queryClient.js +46 -42
  84. package/build/lib/queryClient.js.map +1 -1
  85. package/build/lib/{queryObserver.mjs → queryObserver.cjs} +36 -46
  86. package/build/lib/queryObserver.cjs.map +1 -0
  87. package/build/lib/queryObserver.d.ts +5 -7
  88. package/build/lib/queryObserver.d.ts.map +1 -0
  89. package/build/lib/queryObserver.js +33 -47
  90. package/build/lib/queryObserver.js.map +1 -1
  91. package/build/lib/{removable.esm.js → removable.cjs} +7 -5
  92. package/build/lib/{removable.mjs.map → removable.cjs.map} +1 -1
  93. package/build/lib/removable.d.ts +1 -0
  94. package/build/lib/removable.d.ts.map +1 -0
  95. package/build/lib/removable.js +4 -6
  96. package/build/lib/removable.js.map +1 -1
  97. package/build/lib/{retryer.esm.js → retryer.cjs} +15 -8
  98. package/build/lib/{retryer.mjs.map → retryer.cjs.map} +1 -1
  99. package/build/lib/retryer.d.ts +5 -4
  100. package/build/lib/retryer.d.ts.map +1 -0
  101. package/build/lib/retryer.js +8 -11
  102. package/build/lib/retryer.js.map +1 -1
  103. package/build/lib/{subscribable.esm.js → subscribable.cjs} +8 -6
  104. package/build/lib/subscribable.cjs.map +1 -0
  105. package/build/lib/subscribable.d.ts +3 -2
  106. package/build/lib/subscribable.d.ts.map +1 -0
  107. package/build/lib/subscribable.js +5 -7
  108. package/build/lib/subscribable.js.map +1 -1
  109. package/build/lib/tests/focusManager.test.d.ts +1 -0
  110. package/build/lib/tests/focusManager.test.d.ts.map +1 -0
  111. package/build/lib/tests/hydration.test.d.ts +1 -0
  112. package/build/lib/tests/hydration.test.d.ts.map +1 -0
  113. package/build/lib/tests/infiniteQueryBehavior.test.d.ts +1 -0
  114. package/build/lib/tests/infiniteQueryBehavior.test.d.ts.map +1 -0
  115. package/build/lib/tests/infiniteQueryObserver.test.d.ts +1 -0
  116. package/build/lib/tests/infiniteQueryObserver.test.d.ts.map +1 -0
  117. package/build/lib/tests/mutationCache.test.d.ts +1 -0
  118. package/build/lib/tests/mutationCache.test.d.ts.map +1 -0
  119. package/build/lib/tests/mutationObserver.test.d.ts +1 -0
  120. package/build/lib/tests/mutationObserver.test.d.ts.map +1 -0
  121. package/build/lib/tests/mutations.test.d.ts +1 -0
  122. package/build/lib/tests/mutations.test.d.ts.map +1 -0
  123. package/build/lib/tests/notifyManager.test.d.ts +1 -0
  124. package/build/lib/tests/notifyManager.test.d.ts.map +1 -0
  125. package/build/lib/tests/onlineManager.test.d.ts +1 -0
  126. package/build/lib/tests/onlineManager.test.d.ts.map +1 -0
  127. package/build/lib/tests/queriesObserver.test.d.ts +1 -0
  128. package/build/lib/tests/queriesObserver.test.d.ts.map +1 -0
  129. package/build/lib/tests/query.test.d.ts +1 -0
  130. package/build/lib/tests/query.test.d.ts.map +1 -0
  131. package/build/lib/tests/queryCache.test.d.ts +1 -0
  132. package/build/lib/tests/queryCache.test.d.ts.map +1 -0
  133. package/build/lib/tests/queryClient.test.d.ts +1 -0
  134. package/build/lib/tests/queryClient.test.d.ts.map +1 -0
  135. package/build/lib/tests/queryObserver.test.d.ts +1 -0
  136. package/build/lib/tests/queryObserver.test.d.ts.map +1 -0
  137. package/build/lib/tests/utils.d.ts +3 -2
  138. package/build/lib/tests/utils.d.ts.map +1 -0
  139. package/build/lib/tests/utils.test.d.ts +1 -0
  140. package/build/lib/tests/utils.test.d.ts.map +1 -0
  141. package/build/lib/types.d.ts +35 -45
  142. package/build/lib/types.d.ts.map +1 -0
  143. package/build/lib/{utils.esm.js → utils.cjs} +23 -2
  144. package/build/lib/{utils.mjs.map → utils.cjs.map} +1 -1
  145. package/build/lib/utils.d.ts +4 -3
  146. package/build/lib/utils.d.ts.map +1 -0
  147. package/build/lib/utils.js +1 -22
  148. package/build/lib/utils.js.map +1 -1
  149. package/package.json +12 -9
  150. package/src/hydration.ts +18 -37
  151. package/src/index.ts +3 -4
  152. package/src/infiniteQueryBehavior.ts +1 -0
  153. package/src/mutationCache.ts +4 -4
  154. package/src/mutationObserver.ts +1 -1
  155. package/src/queriesObserver.ts +74 -24
  156. package/src/query.ts +7 -5
  157. package/src/queryCache.ts +5 -8
  158. package/src/queryClient.ts +20 -20
  159. package/src/queryObserver.ts +43 -51
  160. package/src/subscribable.ts +5 -5
  161. package/src/tests/hydration.test.tsx +7 -3
  162. package/src/tests/infiniteQueryBehavior.test.tsx +9 -0
  163. package/src/tests/query.test.tsx +1 -1
  164. package/src/tests/queryCache.test.tsx +1 -19
  165. package/src/tests/queryClient.test.tsx +39 -3
  166. package/src/tests/queryObserver.test.tsx +121 -0
  167. package/src/types.ts +15 -20
  168. package/build/lib/focusManager.esm.js.map +0 -1
  169. package/build/lib/focusManager.mjs +0 -71
  170. package/build/lib/hydration.esm.js +0 -98
  171. package/build/lib/hydration.esm.js.map +0 -1
  172. package/build/lib/hydration.mjs.map +0 -1
  173. package/build/lib/index.esm.js +0 -14
  174. package/build/lib/index.esm.js.map +0 -1
  175. package/build/lib/index.mjs +0 -14
  176. package/build/lib/index.mjs.map +0 -1
  177. package/build/lib/infiniteQueryBehavior.esm.js.map +0 -1
  178. package/build/lib/infiniteQueryBehavior.mjs +0 -125
  179. package/build/lib/infiniteQueryBehavior.mjs.map +0 -1
  180. package/build/lib/infiniteQueryObserver.esm.js.map +0 -1
  181. package/build/lib/infiniteQueryObserver.mjs +0 -75
  182. package/build/lib/mutation.esm.js.map +0 -1
  183. package/build/lib/mutation.mjs +0 -234
  184. package/build/lib/mutationCache.esm.js.map +0 -1
  185. package/build/lib/mutationCache.mjs +0 -82
  186. package/build/lib/mutationCache.mjs.map +0 -1
  187. package/build/lib/mutationObserver.esm.js.map +0 -1
  188. package/build/lib/mutationObserver.mjs +0 -96
  189. package/build/lib/mutationObserver.mjs.map +0 -1
  190. package/build/lib/notifyManager.esm.js.map +0 -1
  191. package/build/lib/notifyManager.mjs +0 -89
  192. package/build/lib/onlineManager.esm.js.map +0 -1
  193. package/build/lib/onlineManager.mjs +0 -73
  194. package/build/lib/queriesObserver.esm.js.map +0 -1
  195. package/build/lib/queriesObserver.mjs +0 -136
  196. package/build/lib/queriesObserver.mjs.map +0 -1
  197. package/build/lib/query.esm.js +0 -420
  198. package/build/lib/query.esm.js.map +0 -1
  199. package/build/lib/query.mjs.map +0 -1
  200. package/build/lib/queryCache.esm.js +0 -101
  201. package/build/lib/queryCache.esm.js.map +0 -1
  202. package/build/lib/queryCache.mjs.map +0 -1
  203. package/build/lib/queryClient.esm.js.map +0 -1
  204. package/build/lib/queryClient.mjs +0 -277
  205. package/build/lib/queryClient.mjs.map +0 -1
  206. package/build/lib/queryObserver.esm.js +0 -440
  207. package/build/lib/queryObserver.esm.js.map +0 -1
  208. package/build/lib/queryObserver.mjs.map +0 -1
  209. package/build/lib/removable.esm.js.map +0 -1
  210. package/build/lib/removable.mjs +0 -29
  211. package/build/lib/retryer.esm.js.map +0 -1
  212. package/build/lib/retryer.mjs +0 -150
  213. package/build/lib/subscribable.esm.js.map +0 -1
  214. package/build/lib/subscribable.mjs +0 -26
  215. package/build/lib/subscribable.mjs.map +0 -1
  216. package/build/lib/utils.esm.js.map +0 -1
  217. package/build/lib/utils.mjs +0 -227
  218. package/build/umd/index.development.js +0 -2682
  219. package/build/umd/index.development.js.map +0 -1
  220. package/build/umd/index.production.js +0 -2
  221. package/build/umd/index.production.js.map +0 -1
@@ -1,73 +0,0 @@
1
- import { Subscribable } from './subscribable.mjs';
2
- import { isServer } from './utils.mjs';
3
-
4
- class OnlineManager extends Subscribable {
5
- #online;
6
- #cleanup;
7
- #setup;
8
- constructor() {
9
- super();
10
- this.#setup = onOnline => {
11
- // addEventListener does not exist in React Native, but window does
12
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
13
- if (!isServer && window.addEventListener) {
14
- const listener = () => onOnline();
15
- // Listen to online
16
- window.addEventListener('online', listener, false);
17
- window.addEventListener('offline', listener, false);
18
- return () => {
19
- // Be sure to unsubscribe if a new handler is set
20
- window.removeEventListener('online', listener);
21
- window.removeEventListener('offline', listener);
22
- };
23
- }
24
- return;
25
- };
26
- }
27
- onSubscribe() {
28
- if (!this.#cleanup) {
29
- this.setEventListener(this.#setup);
30
- }
31
- }
32
- onUnsubscribe() {
33
- if (!this.hasListeners()) {
34
- this.#cleanup?.();
35
- this.#cleanup = undefined;
36
- }
37
- }
38
- setEventListener(setup) {
39
- this.#setup = setup;
40
- this.#cleanup?.();
41
- this.#cleanup = setup(online => {
42
- if (typeof online === 'boolean') {
43
- this.setOnline(online);
44
- } else {
45
- this.onOnline();
46
- }
47
- });
48
- }
49
- setOnline(online) {
50
- this.#online = online;
51
- if (online) {
52
- this.onOnline();
53
- }
54
- }
55
- onOnline() {
56
- this.listeners.forEach(listener => {
57
- listener();
58
- });
59
- }
60
- isOnline() {
61
- if (typeof this.#online === 'boolean') {
62
- return this.#online;
63
- }
64
- if (typeof navigator === 'undefined' || typeof navigator.onLine === 'undefined') {
65
- return true;
66
- }
67
- return navigator.onLine;
68
- }
69
- }
70
- const onlineManager = new OnlineManager();
71
-
72
- export { OnlineManager, onlineManager };
73
- //# sourceMappingURL=onlineManager.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"queriesObserver.esm.js","sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { notifyManager } from './notifyManager'\nimport type {\n QueryObserverOptions,\n QueryObserverResult,\n DefaultedQueryObserverOptions,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { NotifyOptions } from './queryObserver'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\n\nfunction difference<T>(array1: T[], array2: T[]): T[] {\n return array1.filter((x) => array2.indexOf(x) === -1)\n}\n\nfunction replaceAt<T>(array: T[], index: number, value: T): T[] {\n const copy = array.slice(0)\n copy[index] = value\n return copy\n}\n\ntype QueriesObserverListener = (result: QueryObserverResult[]) => void\n\nexport class QueriesObserver extends Subscribable<QueriesObserverListener> {\n #client: QueryClient\n #result: QueryObserverResult[]\n #queries: QueryObserverOptions[]\n #observers: QueryObserver[]\n\n constructor(client: QueryClient, queries?: QueryObserverOptions[]) {\n super()\n\n this.#client = client\n this.#queries = []\n this.#result = []\n this.#observers = []\n\n if (queries) {\n this.setQueries(queries)\n }\n }\n\n protected onSubscribe(): void {\n if (this.listeners.length === 1) {\n this.#observers.forEach((observer) => {\n observer.subscribe((result) => {\n this.#onUpdate(observer, result)\n })\n })\n }\n }\n\n protected onUnsubscribe(): void {\n if (!this.listeners.length) {\n this.destroy()\n }\n }\n\n destroy(): void {\n this.listeners = []\n this.#observers.forEach((observer) => {\n observer.destroy()\n })\n }\n\n setQueries(\n queries: QueryObserverOptions[],\n notifyOptions?: NotifyOptions,\n ): void {\n this.#queries = queries\n\n notifyManager.batch(() => {\n const prevObservers = this.#observers\n\n const newObserverMatches = this.#findMatchingObservers(this.#queries)\n\n // set options for the new observers to notify of changes\n newObserverMatches.forEach((match) =>\n match.observer.setOptions(match.defaultedQueryOptions, notifyOptions),\n )\n\n const newObservers = newObserverMatches.map((match) => match.observer)\n const newResult = newObservers.map((observer) =>\n observer.getCurrentResult(),\n )\n\n const hasIndexChange = newObservers.some(\n (observer, index) => observer !== prevObservers[index],\n )\n if (prevObservers.length === newObservers.length && !hasIndexChange) {\n return\n }\n\n this.#observers = newObservers\n this.#result = newResult\n\n if (!this.hasListeners()) {\n return\n }\n\n difference(prevObservers, newObservers).forEach((observer) => {\n observer.destroy()\n })\n\n difference(newObservers, prevObservers).forEach((observer) => {\n observer.subscribe((result) => {\n this.#onUpdate(observer, result)\n })\n })\n\n this.#notify()\n })\n }\n\n getCurrentResult(): QueryObserverResult[] {\n return this.#result\n }\n\n getQueries() {\n return this.#observers.map((observer) => observer.getCurrentQuery())\n }\n\n getObservers() {\n return this.#observers\n }\n\n getOptimisticResult(queries: QueryObserverOptions[]): QueryObserverResult[] {\n return this.#findMatchingObservers(queries).map((match) =>\n match.observer.getOptimisticResult(match.defaultedQueryOptions),\n )\n }\n\n #findMatchingObservers(\n queries: QueryObserverOptions[],\n ): QueryObserverMatch[] {\n const prevObservers = this.#observers\n const defaultedQueryOptions = queries.map((options) =>\n this.#client.defaultQueryOptions(options),\n )\n\n const matchingObservers: QueryObserverMatch[] =\n defaultedQueryOptions.flatMap((defaultedOptions) => {\n const match = prevObservers.find(\n (observer) =>\n observer.options.queryHash === defaultedOptions.queryHash,\n )\n if (match != null) {\n return [{ defaultedQueryOptions: defaultedOptions, observer: match }]\n }\n return []\n })\n\n const matchedQueryHashes = matchingObservers.map(\n (match) => match.defaultedQueryOptions.queryHash,\n )\n const unmatchedQueries = defaultedQueryOptions.filter(\n (defaultedOptions) =>\n !matchedQueryHashes.includes(defaultedOptions.queryHash),\n )\n\n const getObserver = (options: QueryObserverOptions): QueryObserver => {\n const defaultedOptions = this.#client.defaultQueryOptions(options)\n const currentObserver = this.#observers.find(\n (o) => o.options.queryHash === defaultedOptions.queryHash,\n )\n return (\n currentObserver ?? new QueryObserver(this.#client, defaultedOptions)\n )\n }\n\n const newOrReusedObservers: QueryObserverMatch[] = unmatchedQueries.map(\n (options) => {\n return {\n defaultedQueryOptions: options,\n observer: getObserver(options),\n }\n },\n )\n\n const sortMatchesByOrderOfQueries = (\n a: QueryObserverMatch,\n b: QueryObserverMatch,\n ): number =>\n defaultedQueryOptions.indexOf(a.defaultedQueryOptions) -\n defaultedQueryOptions.indexOf(b.defaultedQueryOptions)\n\n return matchingObservers\n .concat(newOrReusedObservers)\n .sort(sortMatchesByOrderOfQueries)\n }\n\n #onUpdate(observer: QueryObserver, result: QueryObserverResult): void {\n const index = this.#observers.indexOf(observer)\n if (index !== -1) {\n this.#result = replaceAt(this.#result, index, result)\n this.#notify()\n }\n }\n\n #notify(): void {\n notifyManager.batch(() => {\n this.listeners.forEach((listener) => {\n listener(this.#result)\n })\n })\n }\n}\n\ntype QueryObserverMatch = {\n defaultedQueryOptions: DefaultedQueryObserverOptions\n observer: QueryObserver\n}\n"],"names":["difference","array1","array2","filter","x","indexOf","replaceAt","array","index","value","copy","slice","QueriesObserver","Subscribable","constructor","client","queries","setQueries","onSubscribe","listeners","length","forEach","observer","subscribe","result","onUnsubscribe","destroy","notifyOptions","notifyManager","batch","prevObservers","newObserverMatches","match","setOptions","defaultedQueryOptions","newObservers","map","newResult","getCurrentResult","hasIndexChange","some","hasListeners","getQueries","getCurrentQuery","getObservers","getOptimisticResult","options","defaultQueryOptions","matchingObservers","flatMap","defaultedOptions","find","queryHash","matchedQueryHashes","unmatchedQueries","includes","getObserver","currentObserver","o","QueryObserver","newOrReusedObservers","sortMatchesByOrderOfQueries","a","b","concat","sort","listener"],"mappings":"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"}
@@ -1,136 +0,0 @@
1
- import { notifyManager } from './notifyManager.mjs';
2
- import { QueryObserver } from './queryObserver.mjs';
3
- import { Subscribable } from './subscribable.mjs';
4
-
5
- function difference(array1, array2) {
6
- return array1.filter(x => array2.indexOf(x) === -1);
7
- }
8
- function replaceAt(array, index, value) {
9
- const copy = array.slice(0);
10
- copy[index] = value;
11
- return copy;
12
- }
13
- class QueriesObserver extends Subscribable {
14
- #client;
15
- #result;
16
- #queries;
17
- #observers;
18
- constructor(client, queries) {
19
- super();
20
- this.#client = client;
21
- this.#queries = [];
22
- this.#result = [];
23
- this.#observers = [];
24
- if (queries) {
25
- this.setQueries(queries);
26
- }
27
- }
28
- onSubscribe() {
29
- if (this.listeners.length === 1) {
30
- this.#observers.forEach(observer => {
31
- observer.subscribe(result => {
32
- this.#onUpdate(observer, result);
33
- });
34
- });
35
- }
36
- }
37
- onUnsubscribe() {
38
- if (!this.listeners.length) {
39
- this.destroy();
40
- }
41
- }
42
- destroy() {
43
- this.listeners = [];
44
- this.#observers.forEach(observer => {
45
- observer.destroy();
46
- });
47
- }
48
- setQueries(queries, notifyOptions) {
49
- this.#queries = queries;
50
- notifyManager.batch(() => {
51
- const prevObservers = this.#observers;
52
- const newObserverMatches = this.#findMatchingObservers(this.#queries);
53
-
54
- // set options for the new observers to notify of changes
55
- newObserverMatches.forEach(match => match.observer.setOptions(match.defaultedQueryOptions, notifyOptions));
56
- const newObservers = newObserverMatches.map(match => match.observer);
57
- const newResult = newObservers.map(observer => observer.getCurrentResult());
58
- const hasIndexChange = newObservers.some((observer, index) => observer !== prevObservers[index]);
59
- if (prevObservers.length === newObservers.length && !hasIndexChange) {
60
- return;
61
- }
62
- this.#observers = newObservers;
63
- this.#result = newResult;
64
- if (!this.hasListeners()) {
65
- return;
66
- }
67
- difference(prevObservers, newObservers).forEach(observer => {
68
- observer.destroy();
69
- });
70
- difference(newObservers, prevObservers).forEach(observer => {
71
- observer.subscribe(result => {
72
- this.#onUpdate(observer, result);
73
- });
74
- });
75
- this.#notify();
76
- });
77
- }
78
- getCurrentResult() {
79
- return this.#result;
80
- }
81
- getQueries() {
82
- return this.#observers.map(observer => observer.getCurrentQuery());
83
- }
84
- getObservers() {
85
- return this.#observers;
86
- }
87
- getOptimisticResult(queries) {
88
- return this.#findMatchingObservers(queries).map(match => match.observer.getOptimisticResult(match.defaultedQueryOptions));
89
- }
90
- #findMatchingObservers(queries) {
91
- const prevObservers = this.#observers;
92
- const defaultedQueryOptions = queries.map(options => this.#client.defaultQueryOptions(options));
93
- const matchingObservers = defaultedQueryOptions.flatMap(defaultedOptions => {
94
- const match = prevObservers.find(observer => observer.options.queryHash === defaultedOptions.queryHash);
95
- if (match != null) {
96
- return [{
97
- defaultedQueryOptions: defaultedOptions,
98
- observer: match
99
- }];
100
- }
101
- return [];
102
- });
103
- const matchedQueryHashes = matchingObservers.map(match => match.defaultedQueryOptions.queryHash);
104
- const unmatchedQueries = defaultedQueryOptions.filter(defaultedOptions => !matchedQueryHashes.includes(defaultedOptions.queryHash));
105
- const getObserver = options => {
106
- const defaultedOptions = this.#client.defaultQueryOptions(options);
107
- const currentObserver = this.#observers.find(o => o.options.queryHash === defaultedOptions.queryHash);
108
- return currentObserver ?? new QueryObserver(this.#client, defaultedOptions);
109
- };
110
- const newOrReusedObservers = unmatchedQueries.map(options => {
111
- return {
112
- defaultedQueryOptions: options,
113
- observer: getObserver(options)
114
- };
115
- });
116
- const sortMatchesByOrderOfQueries = (a, b) => defaultedQueryOptions.indexOf(a.defaultedQueryOptions) - defaultedQueryOptions.indexOf(b.defaultedQueryOptions);
117
- return matchingObservers.concat(newOrReusedObservers).sort(sortMatchesByOrderOfQueries);
118
- }
119
- #onUpdate(observer, result) {
120
- const index = this.#observers.indexOf(observer);
121
- if (index !== -1) {
122
- this.#result = replaceAt(this.#result, index, result);
123
- this.#notify();
124
- }
125
- }
126
- #notify() {
127
- notifyManager.batch(() => {
128
- this.listeners.forEach(listener => {
129
- listener(this.#result);
130
- });
131
- });
132
- }
133
- }
134
-
135
- export { QueriesObserver };
136
- //# sourceMappingURL=queriesObserver.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"queriesObserver.mjs","sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { notifyManager } from './notifyManager'\nimport type {\n QueryObserverOptions,\n QueryObserverResult,\n DefaultedQueryObserverOptions,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { NotifyOptions } from './queryObserver'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\n\nfunction difference<T>(array1: T[], array2: T[]): T[] {\n return array1.filter((x) => array2.indexOf(x) === -1)\n}\n\nfunction replaceAt<T>(array: T[], index: number, value: T): T[] {\n const copy = array.slice(0)\n copy[index] = value\n return copy\n}\n\ntype QueriesObserverListener = (result: QueryObserverResult[]) => void\n\nexport class QueriesObserver extends Subscribable<QueriesObserverListener> {\n #client: QueryClient\n #result: QueryObserverResult[]\n #queries: QueryObserverOptions[]\n #observers: QueryObserver[]\n\n constructor(client: QueryClient, queries?: QueryObserverOptions[]) {\n super()\n\n this.#client = client\n this.#queries = []\n this.#result = []\n this.#observers = []\n\n if (queries) {\n this.setQueries(queries)\n }\n }\n\n protected onSubscribe(): void {\n if (this.listeners.length === 1) {\n this.#observers.forEach((observer) => {\n observer.subscribe((result) => {\n this.#onUpdate(observer, result)\n })\n })\n }\n }\n\n protected onUnsubscribe(): void {\n if (!this.listeners.length) {\n this.destroy()\n }\n }\n\n destroy(): void {\n this.listeners = []\n this.#observers.forEach((observer) => {\n observer.destroy()\n })\n }\n\n setQueries(\n queries: QueryObserverOptions[],\n notifyOptions?: NotifyOptions,\n ): void {\n this.#queries = queries\n\n notifyManager.batch(() => {\n const prevObservers = this.#observers\n\n const newObserverMatches = this.#findMatchingObservers(this.#queries)\n\n // set options for the new observers to notify of changes\n newObserverMatches.forEach((match) =>\n match.observer.setOptions(match.defaultedQueryOptions, notifyOptions),\n )\n\n const newObservers = newObserverMatches.map((match) => match.observer)\n const newResult = newObservers.map((observer) =>\n observer.getCurrentResult(),\n )\n\n const hasIndexChange = newObservers.some(\n (observer, index) => observer !== prevObservers[index],\n )\n if (prevObservers.length === newObservers.length && !hasIndexChange) {\n return\n }\n\n this.#observers = newObservers\n this.#result = newResult\n\n if (!this.hasListeners()) {\n return\n }\n\n difference(prevObservers, newObservers).forEach((observer) => {\n observer.destroy()\n })\n\n difference(newObservers, prevObservers).forEach((observer) => {\n observer.subscribe((result) => {\n this.#onUpdate(observer, result)\n })\n })\n\n this.#notify()\n })\n }\n\n getCurrentResult(): QueryObserverResult[] {\n return this.#result\n }\n\n getQueries() {\n return this.#observers.map((observer) => observer.getCurrentQuery())\n }\n\n getObservers() {\n return this.#observers\n }\n\n getOptimisticResult(queries: QueryObserverOptions[]): QueryObserverResult[] {\n return this.#findMatchingObservers(queries).map((match) =>\n match.observer.getOptimisticResult(match.defaultedQueryOptions),\n )\n }\n\n #findMatchingObservers(\n queries: QueryObserverOptions[],\n ): QueryObserverMatch[] {\n const prevObservers = this.#observers\n const defaultedQueryOptions = queries.map((options) =>\n this.#client.defaultQueryOptions(options),\n )\n\n const matchingObservers: QueryObserverMatch[] =\n defaultedQueryOptions.flatMap((defaultedOptions) => {\n const match = prevObservers.find(\n (observer) =>\n observer.options.queryHash === defaultedOptions.queryHash,\n )\n if (match != null) {\n return [{ defaultedQueryOptions: defaultedOptions, observer: match }]\n }\n return []\n })\n\n const matchedQueryHashes = matchingObservers.map(\n (match) => match.defaultedQueryOptions.queryHash,\n )\n const unmatchedQueries = defaultedQueryOptions.filter(\n (defaultedOptions) =>\n !matchedQueryHashes.includes(defaultedOptions.queryHash),\n )\n\n const getObserver = (options: QueryObserverOptions): QueryObserver => {\n const defaultedOptions = this.#client.defaultQueryOptions(options)\n const currentObserver = this.#observers.find(\n (o) => o.options.queryHash === defaultedOptions.queryHash,\n )\n return (\n currentObserver ?? new QueryObserver(this.#client, defaultedOptions)\n )\n }\n\n const newOrReusedObservers: QueryObserverMatch[] = unmatchedQueries.map(\n (options) => {\n return {\n defaultedQueryOptions: options,\n observer: getObserver(options),\n }\n },\n )\n\n const sortMatchesByOrderOfQueries = (\n a: QueryObserverMatch,\n b: QueryObserverMatch,\n ): number =>\n defaultedQueryOptions.indexOf(a.defaultedQueryOptions) -\n defaultedQueryOptions.indexOf(b.defaultedQueryOptions)\n\n return matchingObservers\n .concat(newOrReusedObservers)\n .sort(sortMatchesByOrderOfQueries)\n }\n\n #onUpdate(observer: QueryObserver, result: QueryObserverResult): void {\n const index = this.#observers.indexOf(observer)\n if (index !== -1) {\n this.#result = replaceAt(this.#result, index, result)\n this.#notify()\n }\n }\n\n #notify(): void {\n notifyManager.batch(() => {\n this.listeners.forEach((listener) => {\n listener(this.#result)\n })\n })\n }\n}\n\ntype QueryObserverMatch = {\n defaultedQueryOptions: DefaultedQueryObserverOptions\n observer: QueryObserver\n}\n"],"names":["difference","array1","array2","filter","x","indexOf","replaceAt","array","index","value","copy","slice","QueriesObserver","Subscribable","constructor","client","queries","setQueries","onSubscribe","listeners","length","forEach","observer","subscribe","result","onUnsubscribe","destroy","notifyOptions","notifyManager","batch","prevObservers","newObserverMatches","match","setOptions","defaultedQueryOptions","newObservers","map","newResult","getCurrentResult","hasIndexChange","some","hasListeners","getQueries","getCurrentQuery","getObservers","getOptimisticResult","options","defaultQueryOptions","matchingObservers","flatMap","defaultedOptions","find","queryHash","matchedQueryHashes","unmatchedQueries","includes","getObserver","currentObserver","o","QueryObserver","newOrReusedObservers","sortMatchesByOrderOfQueries","a","b","concat","sort","listener"],"mappings":"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"}
@@ -1,420 +0,0 @@
1
- import { replaceData, noop, timeUntilStale } from './utils.esm.js';
2
- import { notifyManager } from './notifyManager.esm.js';
3
- import { createRetryer, isCancelledError, canFetch } from './retryer.esm.js';
4
- import { Removable } from './removable.esm.js';
5
-
6
- // TYPES
7
-
8
- // CLASS
9
-
10
- class Query extends Removable {
11
- #initialState;
12
- #revertState;
13
- #cache;
14
- #promise;
15
- #retryer;
16
- #observers;
17
- #defaultOptions;
18
- #abortSignalConsumed;
19
- constructor(config) {
20
- super();
21
- this.#abortSignalConsumed = false;
22
- this.#defaultOptions = config.defaultOptions;
23
- this.#setOptions(config.options);
24
- this.#observers = [];
25
- this.#cache = config.cache;
26
- this.queryKey = config.queryKey;
27
- this.queryHash = config.queryHash;
28
- this.#initialState = config.state || getDefaultState(this.options);
29
- this.state = this.#initialState;
30
- this.scheduleGc();
31
- }
32
- get meta() {
33
- return this.options.meta;
34
- }
35
- #setOptions(options) {
36
- this.options = {
37
- ...this.#defaultOptions,
38
- ...options
39
- };
40
- this.updateGcTime(this.options.gcTime);
41
- }
42
- optionalRemove() {
43
- if (!this.#observers.length && this.state.fetchStatus === 'idle') {
44
- this.#cache.remove(this);
45
- }
46
- }
47
- setData(newData, options) {
48
- const data = replaceData(this.state.data, newData, this.options);
49
-
50
- // Set data and mark it as cached
51
- this.#dispatch({
52
- data,
53
- type: 'success',
54
- dataUpdatedAt: options?.updatedAt,
55
- manual: options?.manual
56
- });
57
- return data;
58
- }
59
- setState(state, setStateOptions) {
60
- this.#dispatch({
61
- type: 'setState',
62
- state,
63
- setStateOptions
64
- });
65
- }
66
- cancel(options) {
67
- const promise = this.#promise;
68
- this.#retryer?.cancel(options);
69
- return promise ? promise.then(noop).catch(noop) : Promise.resolve();
70
- }
71
- destroy() {
72
- super.destroy();
73
- this.cancel({
74
- silent: true
75
- });
76
- }
77
- reset() {
78
- this.destroy();
79
- this.setState(this.#initialState);
80
- }
81
- isActive() {
82
- return this.#observers.some(observer => observer.options.enabled !== false);
83
- }
84
- isDisabled() {
85
- return this.getObserversCount() > 0 && !this.isActive();
86
- }
87
- isStale() {
88
- return this.state.isInvalidated || !this.state.dataUpdatedAt || this.#observers.some(observer => observer.getCurrentResult().isStale);
89
- }
90
- isStaleByTime(staleTime = 0) {
91
- return this.state.isInvalidated || !this.state.dataUpdatedAt || !timeUntilStale(this.state.dataUpdatedAt, staleTime);
92
- }
93
- onFocus() {
94
- const observer = this.#observers.find(x => x.shouldFetchOnWindowFocus());
95
- observer?.refetch({
96
- cancelRefetch: false
97
- });
98
-
99
- // Continue fetch if currently paused
100
- this.#retryer?.continue();
101
- }
102
- onOnline() {
103
- const observer = this.#observers.find(x => x.shouldFetchOnReconnect());
104
- observer?.refetch({
105
- cancelRefetch: false
106
- });
107
-
108
- // Continue fetch if currently paused
109
- this.#retryer?.continue();
110
- }
111
- addObserver(observer) {
112
- if (this.#observers.indexOf(observer) === -1) {
113
- this.#observers.push(observer);
114
-
115
- // Stop the query from being garbage collected
116
- this.clearGcTimeout();
117
- this.#cache.notify({
118
- type: 'observerAdded',
119
- query: this,
120
- observer
121
- });
122
- }
123
- }
124
- removeObserver(observer) {
125
- if (this.#observers.indexOf(observer) !== -1) {
126
- this.#observers = this.#observers.filter(x => x !== observer);
127
- if (!this.#observers.length) {
128
- // If the transport layer does not support cancellation
129
- // we'll let the query continue so the result can be cached
130
- if (this.#retryer) {
131
- if (this.#abortSignalConsumed) {
132
- this.#retryer.cancel({
133
- revert: true
134
- });
135
- } else {
136
- this.#retryer.cancelRetry();
137
- }
138
- }
139
- this.scheduleGc();
140
- }
141
- this.#cache.notify({
142
- type: 'observerRemoved',
143
- query: this,
144
- observer
145
- });
146
- }
147
- }
148
- getObserversCount() {
149
- return this.#observers.length;
150
- }
151
- invalidate() {
152
- if (!this.state.isInvalidated) {
153
- this.#dispatch({
154
- type: 'invalidate'
155
- });
156
- }
157
- }
158
- fetch(options, fetchOptions) {
159
- if (this.state.fetchStatus !== 'idle') {
160
- if (this.state.dataUpdatedAt && fetchOptions?.cancelRefetch) {
161
- // Silently cancel current fetch if the user wants to cancel refetches
162
- this.cancel({
163
- silent: true
164
- });
165
- } else if (this.#promise) {
166
- // make sure that retries that were potentially cancelled due to unmounts can continue
167
- this.#retryer?.continueRetry();
168
- // Return current promise if we are already fetching
169
- return this.#promise;
170
- }
171
- }
172
-
173
- // Update config if passed, otherwise the config from the last execution is used
174
- if (options) {
175
- this.#setOptions(options);
176
- }
177
-
178
- // Use the options from the first observer with a query function if no function is found.
179
- // This can happen when the query is hydrated or created with setQueryData.
180
- if (!this.options.queryFn) {
181
- const observer = this.#observers.find(x => x.options.queryFn);
182
- if (observer) {
183
- this.#setOptions(observer.options);
184
- }
185
- }
186
- if (process.env.NODE_ENV !== 'production') {
187
- if (!Array.isArray(this.options.queryKey)) {
188
- console.error(`As of v4, queryKey needs to be an Array. If you are using a string like 'repoData', please change it to an Array, e.g. ['repoData']`);
189
- }
190
- }
191
- const abortController = new AbortController();
192
-
193
- // Create query function context
194
- const queryFnContext = {
195
- queryKey: this.queryKey,
196
- meta: this.meta
197
- };
198
-
199
- // Adds an enumerable signal property to the object that
200
- // which sets abortSignalConsumed to true when the signal
201
- // is read.
202
- const addSignalProperty = object => {
203
- Object.defineProperty(object, 'signal', {
204
- enumerable: true,
205
- get: () => {
206
- this.#abortSignalConsumed = true;
207
- return abortController.signal;
208
- }
209
- });
210
- };
211
- addSignalProperty(queryFnContext);
212
-
213
- // Create fetch function
214
- const fetchFn = () => {
215
- if (!this.options.queryFn) {
216
- return Promise.reject(new Error('Missing queryFn'));
217
- }
218
- this.#abortSignalConsumed = false;
219
- return this.options.queryFn(queryFnContext);
220
- };
221
-
222
- // Trigger behavior hook
223
- const context = {
224
- fetchOptions,
225
- options: this.options,
226
- queryKey: this.queryKey,
227
- state: this.state,
228
- fetchFn
229
- };
230
- addSignalProperty(context);
231
- this.options.behavior?.onFetch(context);
232
-
233
- // Store state in case the current fetch needs to be reverted
234
- this.#revertState = this.state;
235
-
236
- // Set to fetching state if not already in it
237
- if (this.state.fetchStatus === 'idle' || this.state.fetchMeta !== context.fetchOptions?.meta) {
238
- this.#dispatch({
239
- type: 'fetch',
240
- meta: context.fetchOptions?.meta
241
- });
242
- }
243
- const onError = error => {
244
- // Optimistically update state if needed
245
- if (!(isCancelledError(error) && error.silent)) {
246
- this.#dispatch({
247
- type: 'error',
248
- error: error
249
- });
250
- }
251
- if (!isCancelledError(error)) {
252
- // Notify cache callback
253
- this.#cache.config.onError?.(error, this);
254
- this.#cache.config.onSettled?.(this.state.data, error, this);
255
- }
256
- if (!this.isFetchingOptimistic) {
257
- // Schedule query gc after fetching
258
- this.scheduleGc();
259
- }
260
- this.isFetchingOptimistic = false;
261
- };
262
-
263
- // Try to fetch the data
264
- this.#retryer = createRetryer({
265
- fn: context.fetchFn,
266
- abort: abortController.abort.bind(abortController),
267
- onSuccess: data => {
268
- if (typeof data === 'undefined') {
269
- if (process.env.NODE_ENV !== 'production') {
270
- console.error(`Query data cannot be undefined. Please make sure to return a value other than undefined from your query function. Affected query key: ${this.queryHash}`);
271
- }
272
- onError(new Error('undefined'));
273
- return;
274
- }
275
- this.setData(data);
276
-
277
- // Notify cache callback
278
- this.#cache.config.onSuccess?.(data, this);
279
- this.#cache.config.onSettled?.(data, this.state.error, this);
280
- if (!this.isFetchingOptimistic) {
281
- // Schedule query gc after fetching
282
- this.scheduleGc();
283
- }
284
- this.isFetchingOptimistic = false;
285
- },
286
- onError,
287
- onFail: (failureCount, error) => {
288
- this.#dispatch({
289
- type: 'failed',
290
- failureCount,
291
- error
292
- });
293
- },
294
- onPause: () => {
295
- this.#dispatch({
296
- type: 'pause'
297
- });
298
- },
299
- onContinue: () => {
300
- this.#dispatch({
301
- type: 'continue'
302
- });
303
- },
304
- retry: context.options.retry,
305
- retryDelay: context.options.retryDelay,
306
- networkMode: context.options.networkMode
307
- });
308
- this.#promise = this.#retryer.promise;
309
- return this.#promise;
310
- }
311
- #dispatch(action) {
312
- const reducer = state => {
313
- switch (action.type) {
314
- case 'failed':
315
- return {
316
- ...state,
317
- fetchFailureCount: action.failureCount,
318
- fetchFailureReason: action.error
319
- };
320
- case 'pause':
321
- return {
322
- ...state,
323
- fetchStatus: 'paused'
324
- };
325
- case 'continue':
326
- return {
327
- ...state,
328
- fetchStatus: 'fetching'
329
- };
330
- case 'fetch':
331
- return {
332
- ...state,
333
- fetchFailureCount: 0,
334
- fetchFailureReason: null,
335
- fetchMeta: action.meta ?? null,
336
- fetchStatus: canFetch(this.options.networkMode) ? 'fetching' : 'paused',
337
- ...(!state.dataUpdatedAt && {
338
- error: null,
339
- status: 'pending'
340
- })
341
- };
342
- case 'success':
343
- return {
344
- ...state,
345
- data: action.data,
346
- dataUpdateCount: state.dataUpdateCount + 1,
347
- dataUpdatedAt: action.dataUpdatedAt ?? Date.now(),
348
- error: null,
349
- isInvalidated: false,
350
- status: 'success',
351
- ...(!action.manual && {
352
- fetchStatus: 'idle',
353
- fetchFailureCount: 0,
354
- fetchFailureReason: null
355
- })
356
- };
357
- case 'error':
358
- const error = action.error;
359
- if (isCancelledError(error) && error.revert && this.#revertState) {
360
- return {
361
- ...this.#revertState
362
- };
363
- }
364
- return {
365
- ...state,
366
- error: error,
367
- errorUpdateCount: state.errorUpdateCount + 1,
368
- errorUpdatedAt: Date.now(),
369
- fetchFailureCount: state.fetchFailureCount + 1,
370
- fetchFailureReason: error,
371
- fetchStatus: 'idle',
372
- status: 'error'
373
- };
374
- case 'invalidate':
375
- return {
376
- ...state,
377
- isInvalidated: true
378
- };
379
- case 'setState':
380
- return {
381
- ...state,
382
- ...action.state
383
- };
384
- }
385
- };
386
- this.state = reducer(this.state);
387
- notifyManager.batch(() => {
388
- this.#observers.forEach(observer => {
389
- observer.onQueryUpdate(action);
390
- });
391
- this.#cache.notify({
392
- query: this,
393
- type: 'updated',
394
- action
395
- });
396
- });
397
- }
398
- }
399
- function getDefaultState(options) {
400
- const data = typeof options.initialData === 'function' ? options.initialData() : options.initialData;
401
- const hasData = typeof data !== 'undefined';
402
- const initialDataUpdatedAt = hasData ? typeof options.initialDataUpdatedAt === 'function' ? options.initialDataUpdatedAt() : options.initialDataUpdatedAt : 0;
403
- return {
404
- data,
405
- dataUpdateCount: 0,
406
- dataUpdatedAt: hasData ? initialDataUpdatedAt ?? Date.now() : 0,
407
- error: null,
408
- errorUpdateCount: 0,
409
- errorUpdatedAt: 0,
410
- fetchFailureCount: 0,
411
- fetchFailureReason: null,
412
- fetchMeta: null,
413
- isInvalidated: false,
414
- status: hasData ? 'success' : 'pending',
415
- fetchStatus: 'idle'
416
- };
417
- }
418
-
419
- export { Query };
420
- //# sourceMappingURL=query.esm.js.map