@tanstack/query-core 5.0.0-alpha.3 → 5.0.0-alpha.31

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 (190) hide show
  1. package/build/lib/_virtual/_rollupPluginBabelHelpers.esm.js +13 -0
  2. package/build/lib/_virtual/_rollupPluginBabelHelpers.esm.js.map +1 -0
  3. package/build/lib/_virtual/_rollupPluginBabelHelpers.js +16 -0
  4. package/build/lib/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
  5. package/build/lib/focusManager.d.ts +1 -0
  6. package/build/lib/focusManager.d.ts.map +1 -0
  7. package/build/lib/focusManager.esm.js +31 -15
  8. package/build/lib/focusManager.esm.js.map +1 -1
  9. package/build/lib/focusManager.js +31 -15
  10. package/build/lib/focusManager.js.map +1 -1
  11. package/build/lib/hydration.d.ts +3 -6
  12. package/build/lib/hydration.d.ts.map +1 -0
  13. package/build/lib/hydration.esm.js +9 -20
  14. package/build/lib/hydration.esm.js.map +1 -1
  15. package/build/lib/hydration.js +9 -20
  16. package/build/lib/hydration.js.map +1 -1
  17. package/build/lib/hydration.mjs +4 -18
  18. package/build/lib/hydration.mjs.map +1 -1
  19. package/build/lib/index.d.ts +4 -3
  20. package/build/lib/index.d.ts.map +1 -0
  21. package/build/lib/infiniteQueryBehavior.d.ts +3 -2
  22. package/build/lib/infiniteQueryBehavior.d.ts.map +1 -0
  23. package/build/lib/infiniteQueryBehavior.esm.js +52 -48
  24. package/build/lib/infiniteQueryBehavior.esm.js.map +1 -1
  25. package/build/lib/infiniteQueryBehavior.js +52 -48
  26. package/build/lib/infiniteQueryBehavior.js.map +1 -1
  27. package/build/lib/infiniteQueryBehavior.mjs +48 -45
  28. package/build/lib/infiniteQueryBehavior.mjs.map +1 -1
  29. package/build/lib/infiniteQueryObserver.d.ts +7 -6
  30. package/build/lib/infiniteQueryObserver.d.ts.map +1 -0
  31. package/build/lib/infiniteQueryObserver.esm.js +7 -8
  32. package/build/lib/infiniteQueryObserver.esm.js.map +1 -1
  33. package/build/lib/infiniteQueryObserver.js +7 -8
  34. package/build/lib/infiniteQueryObserver.js.map +1 -1
  35. package/build/lib/infiniteQueryObserver.mjs +4 -6
  36. package/build/lib/infiniteQueryObserver.mjs.map +1 -1
  37. package/build/lib/mutation.d.ts +1 -0
  38. package/build/lib/mutation.d.ts.map +1 -0
  39. package/build/lib/mutation.esm.js +127 -102
  40. package/build/lib/mutation.esm.js.map +1 -1
  41. package/build/lib/mutation.js +127 -102
  42. package/build/lib/mutation.js.map +1 -1
  43. package/build/lib/mutationCache.d.ts +1 -0
  44. package/build/lib/mutationCache.d.ts.map +1 -0
  45. package/build/lib/mutationCache.esm.js +34 -20
  46. package/build/lib/mutationCache.esm.js.map +1 -1
  47. package/build/lib/mutationCache.js +34 -20
  48. package/build/lib/mutationCache.js.map +1 -1
  49. package/build/lib/mutationCache.mjs +5 -4
  50. package/build/lib/mutationCache.mjs.map +1 -1
  51. package/build/lib/mutationObserver.d.ts +1 -0
  52. package/build/lib/mutationObserver.d.ts.map +1 -0
  53. package/build/lib/mutationObserver.esm.js +81 -51
  54. package/build/lib/mutationObserver.esm.js.map +1 -1
  55. package/build/lib/mutationObserver.js +81 -51
  56. package/build/lib/mutationObserver.js.map +1 -1
  57. package/build/lib/notifyManager.d.ts +1 -0
  58. package/build/lib/notifyManager.d.ts.map +1 -0
  59. package/build/lib/onlineManager.d.ts +1 -0
  60. package/build/lib/onlineManager.d.ts.map +1 -0
  61. package/build/lib/onlineManager.esm.js +29 -14
  62. package/build/lib/onlineManager.esm.js.map +1 -1
  63. package/build/lib/onlineManager.js +29 -14
  64. package/build/lib/onlineManager.js.map +1 -1
  65. package/build/lib/queriesObserver.d.ts +1 -0
  66. package/build/lib/queriesObserver.d.ts.map +1 -0
  67. package/build/lib/queriesObserver.esm.js +95 -65
  68. package/build/lib/queriesObserver.esm.js.map +1 -1
  69. package/build/lib/queriesObserver.js +95 -65
  70. package/build/lib/queriesObserver.js.map +1 -1
  71. package/build/lib/queriesObserver.mjs +4 -3
  72. package/build/lib/queriesObserver.mjs.map +1 -1
  73. package/build/lib/query.d.ts +5 -3
  74. package/build/lib/query.d.ts.map +1 -0
  75. package/build/lib/query.esm.js +211 -162
  76. package/build/lib/query.esm.js.map +1 -1
  77. package/build/lib/query.js +211 -162
  78. package/build/lib/query.js.map +1 -1
  79. package/build/lib/query.mjs +2 -2
  80. package/build/lib/query.mjs.map +1 -1
  81. package/build/lib/queryCache.d.ts +1 -1
  82. package/build/lib/queryCache.d.ts.map +1 -0
  83. package/build/lib/queryCache.esm.js +20 -13
  84. package/build/lib/queryCache.esm.js.map +1 -1
  85. package/build/lib/queryCache.js +20 -13
  86. package/build/lib/queryCache.js.map +1 -1
  87. package/build/lib/queryCache.mjs +6 -5
  88. package/build/lib/queryCache.mjs.map +1 -1
  89. package/build/lib/queryClient.d.ts +1 -0
  90. package/build/lib/queryClient.d.ts.map +1 -0
  91. package/build/lib/queryClient.esm.js +113 -71
  92. package/build/lib/queryClient.esm.js.map +1 -1
  93. package/build/lib/queryClient.js +113 -71
  94. package/build/lib/queryClient.js.map +1 -1
  95. package/build/lib/queryClient.mjs +17 -13
  96. package/build/lib/queryClient.mjs.map +1 -1
  97. package/build/lib/queryObserver.d.ts +3 -4
  98. package/build/lib/queryObserver.d.ts.map +1 -0
  99. package/build/lib/queryObserver.esm.js +300 -211
  100. package/build/lib/queryObserver.esm.js.map +1 -1
  101. package/build/lib/queryObserver.js +298 -209
  102. package/build/lib/queryObserver.js.map +1 -1
  103. package/build/lib/queryObserver.mjs +13 -25
  104. package/build/lib/queryObserver.mjs.map +1 -1
  105. package/build/lib/removable.d.ts +1 -0
  106. package/build/lib/removable.d.ts.map +1 -0
  107. package/build/lib/removable.esm.js +13 -6
  108. package/build/lib/removable.esm.js.map +1 -1
  109. package/build/lib/removable.js +13 -6
  110. package/build/lib/removable.js.map +1 -1
  111. package/build/lib/retryer.d.ts +1 -0
  112. package/build/lib/retryer.d.ts.map +1 -0
  113. package/build/lib/retryer.esm.js +15 -14
  114. package/build/lib/retryer.esm.js.map +1 -1
  115. package/build/lib/retryer.js +15 -14
  116. package/build/lib/retryer.js.map +1 -1
  117. package/build/lib/subscribable.d.ts +1 -0
  118. package/build/lib/subscribable.d.ts.map +1 -0
  119. package/build/lib/tests/focusManager.test.d.ts +1 -0
  120. package/build/lib/tests/focusManager.test.d.ts.map +1 -0
  121. package/build/lib/tests/hydration.test.d.ts +1 -0
  122. package/build/lib/tests/hydration.test.d.ts.map +1 -0
  123. package/build/lib/tests/infiniteQueryBehavior.test.d.ts +1 -0
  124. package/build/lib/tests/infiniteQueryBehavior.test.d.ts.map +1 -0
  125. package/build/lib/tests/infiniteQueryObserver.test.d.ts +1 -0
  126. package/build/lib/tests/infiniteQueryObserver.test.d.ts.map +1 -0
  127. package/build/lib/tests/mutationCache.test.d.ts +1 -0
  128. package/build/lib/tests/mutationCache.test.d.ts.map +1 -0
  129. package/build/lib/tests/mutationObserver.test.d.ts +1 -0
  130. package/build/lib/tests/mutationObserver.test.d.ts.map +1 -0
  131. package/build/lib/tests/mutations.test.d.ts +1 -0
  132. package/build/lib/tests/mutations.test.d.ts.map +1 -0
  133. package/build/lib/tests/notifyManager.test.d.ts +1 -0
  134. package/build/lib/tests/notifyManager.test.d.ts.map +1 -0
  135. package/build/lib/tests/onlineManager.test.d.ts +1 -0
  136. package/build/lib/tests/onlineManager.test.d.ts.map +1 -0
  137. package/build/lib/tests/queriesObserver.test.d.ts +1 -0
  138. package/build/lib/tests/queriesObserver.test.d.ts.map +1 -0
  139. package/build/lib/tests/query.test.d.ts +1 -0
  140. package/build/lib/tests/query.test.d.ts.map +1 -0
  141. package/build/lib/tests/queryCache.test.d.ts +1 -0
  142. package/build/lib/tests/queryCache.test.d.ts.map +1 -0
  143. package/build/lib/tests/queryClient.test.d.ts +1 -0
  144. package/build/lib/tests/queryClient.test.d.ts.map +1 -0
  145. package/build/lib/tests/queryObserver.test.d.ts +1 -0
  146. package/build/lib/tests/queryObserver.test.d.ts.map +1 -0
  147. package/build/lib/tests/utils.d.ts +5 -5
  148. package/build/lib/tests/utils.d.ts.map +1 -0
  149. package/build/lib/tests/utils.test.d.ts +1 -0
  150. package/build/lib/tests/utils.test.d.ts.map +1 -0
  151. package/build/lib/types.d.ts +12 -21
  152. package/build/lib/types.d.ts.map +1 -0
  153. package/build/lib/utils.d.ts +1 -0
  154. package/build/lib/utils.d.ts.map +1 -0
  155. package/build/lib/utils.esm.js +1 -1
  156. package/build/lib/utils.esm.js.map +1 -1
  157. package/build/lib/utils.js +1 -1
  158. package/build/lib/utils.js.map +1 -1
  159. package/build/umd/index.development.js +102 -120
  160. package/build/umd/index.development.js.map +1 -1
  161. package/build/umd/index.production.js +1 -1
  162. package/build/umd/index.production.js.map +1 -1
  163. package/package.json +2 -2
  164. package/src/hydration.ts +18 -37
  165. package/src/index.ts +2 -4
  166. package/src/infiniteQueryBehavior.ts +52 -60
  167. package/src/infiniteQueryObserver.ts +15 -10
  168. package/src/mutationCache.ts +4 -4
  169. package/src/queriesObserver.ts +8 -8
  170. package/src/query.ts +8 -6
  171. package/src/queryCache.ts +5 -8
  172. package/src/queryClient.ts +18 -19
  173. package/src/queryObserver.ts +29 -38
  174. package/src/tests/focusManager.test.tsx +12 -14
  175. package/src/tests/hydration.test.tsx +22 -17
  176. package/src/tests/infiniteQueryBehavior.test.tsx +16 -9
  177. package/src/tests/infiniteQueryObserver.test.tsx +62 -1
  178. package/src/tests/mutationCache.test.tsx +11 -10
  179. package/src/tests/mutationObserver.test.tsx +3 -2
  180. package/src/tests/mutations.test.tsx +11 -10
  181. package/src/tests/notifyManager.test.tsx +7 -6
  182. package/src/tests/onlineManager.test.tsx +12 -17
  183. package/src/tests/queriesObserver.test.tsx +18 -17
  184. package/src/tests/query.test.tsx +19 -18
  185. package/src/tests/queryCache.test.tsx +12 -28
  186. package/src/tests/queryClient.test.tsx +82 -49
  187. package/src/tests/queryObserver.test.tsx +131 -9
  188. package/src/tests/utils.test.tsx +2 -1
  189. package/src/tests/utils.ts +5 -4
  190. package/src/types.ts +22 -20
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EACL,OAAO,EACP,gBAAgB,EAChB,QAAQ,EACR,UAAU,EACV,gBAAgB,GACjB,MAAM,SAAS,CAAA;AAChB,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EACL,SAAS,EACT,OAAO,EACP,2BAA2B,EAC3B,8BAA8B,GAC/B,MAAM,aAAa,CAAA;AAGpB,cAAc,SAAS,CAAA;AACvB,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAChD,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AACzD,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,cAAc,GACf,MAAM,aAAa,CAAA"}
@@ -4,8 +4,9 @@ export declare function infiniteQueryBehavior<TQueryFnData, TError, TData>(): Qu
4
4
  /**
5
5
  * Checks if there is a next page.
6
6
  */
7
- export declare function hasNextPage(options: InfiniteQueryPageParamsOptions<any>, pages?: unknown[]): boolean;
7
+ export declare function hasNextPage(options: InfiniteQueryPageParamsOptions<any, any>, data?: InfiniteData<unknown>): boolean;
8
8
  /**
9
9
  * Checks if there is a previous page.
10
10
  */
11
- export declare function hasPreviousPage(options: InfiniteQueryPageParamsOptions<any>, pages?: unknown[]): boolean;
11
+ export declare function hasPreviousPage(options: InfiniteQueryPageParamsOptions<any, any>, data?: InfiniteData<unknown>): boolean;
12
+ //# sourceMappingURL=infiniteQueryBehavior.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infiniteQueryBehavior.d.ts","sourceRoot":"","sources":["../../src/infiniteQueryBehavior.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5C,OAAO,KAAK,EACV,YAAY,EACZ,8BAA8B,EAG/B,MAAM,SAAS,CAAA;AAEhB,wBAAgB,qBAAqB,CACnC,YAAY,EACZ,MAAM,EACN,KAAK,KACF,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CA2G5D;AA2BD;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,8BAA8B,CAAC,GAAG,EAAE,GAAG,CAAC,EACjD,IAAI,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,GAC3B,OAAO,CAGT;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,8BAA8B,CAAC,GAAG,EAAE,GAAG,CAAC,EACjD,IAAI,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,GAC3B,OAAO,CAGT"}
@@ -3,12 +3,16 @@ import { addToStart, addToEnd } from './utils.esm.js';
3
3
  function infiniteQueryBehavior() {
4
4
  return {
5
5
  onFetch: context => {
6
- context.fetchFn = () => {
6
+ context.fetchFn = async () => {
7
+ var _context$fetchOptions, _context$fetchOptions2, _context$fetchOptions3, _context$state$data, _context$state$data2;
7
8
  const options = context.options;
8
- const direction = context.fetchOptions?.meta?.fetchMore?.direction;
9
- const oldPages = context.state.data?.pages || [];
10
- const oldPageParams = context.state.data?.pageParams || [];
11
- let newPageParams = oldPageParams;
9
+ const direction = (_context$fetchOptions = context.fetchOptions) == null ? void 0 : (_context$fetchOptions2 = _context$fetchOptions.meta) == null ? void 0 : (_context$fetchOptions3 = _context$fetchOptions2.fetchMore) == null ? void 0 : _context$fetchOptions3.direction;
10
+ const oldPages = ((_context$state$data = context.state.data) == null ? void 0 : _context$state$data.pages) || [];
11
+ const oldPageParams = ((_context$state$data2 = context.state.data) == null ? void 0 : _context$state$data2.pageParams) || [];
12
+ const empty = {
13
+ pages: [],
14
+ pageParams: []
15
+ };
12
16
  let cancelled = false;
13
17
  const addSignalProperty = object => {
14
18
  Object.defineProperty(object, 'signal', {
@@ -28,95 +32,95 @@ function infiniteQueryBehavior() {
28
32
 
29
33
  // Get query function
30
34
  const queryFn = context.options.queryFn || (() => Promise.reject(new Error('Missing queryFn')));
31
- const buildNewPages = (pages, param, page, previous) => {
32
- const {
33
- maxPages
34
- } = context.options;
35
- if (previous) {
36
- newPageParams = addToStart(newPageParams, param, maxPages);
37
- return addToStart(pages, page, maxPages);
38
- }
39
- newPageParams = addToEnd(newPageParams, param, maxPages);
40
- return addToEnd(pages, page, maxPages);
41
- };
42
35
 
43
36
  // Create function to fetch a page
44
- const fetchPage = (pages, param, previous) => {
37
+ const fetchPage = async (data, param, previous) => {
45
38
  if (cancelled) {
46
39
  return Promise.reject();
47
40
  }
48
- if (typeof param === 'undefined' && pages.length) {
49
- return Promise.resolve(pages);
41
+ if (typeof param === 'undefined' && data.pages.length) {
42
+ return Promise.resolve(data);
50
43
  }
51
44
  const queryFnContext = {
52
45
  queryKey: context.queryKey,
53
46
  pageParam: param,
47
+ direction: previous ? 'backward' : 'forward',
54
48
  meta: context.options.meta
55
49
  };
56
50
  addSignalProperty(queryFnContext);
57
- const queryFnResult = queryFn(queryFnContext);
58
- const promise = Promise.resolve(queryFnResult).then(page => buildNewPages(pages, param, page, previous));
59
- return promise;
51
+ const page = await queryFn(queryFnContext);
52
+ const {
53
+ maxPages
54
+ } = context.options;
55
+ const addTo = previous ? addToStart : addToEnd;
56
+ return {
57
+ pages: addTo(data.pages, page, maxPages),
58
+ pageParams: addTo(data.pageParams, param, maxPages)
59
+ };
60
60
  };
61
- let promise;
61
+ let result;
62
62
 
63
63
  // Fetch first page?
64
64
  if (!oldPages.length) {
65
- promise = fetchPage([], options.defaultPageParam);
65
+ result = await fetchPage(empty, options.defaultPageParam);
66
66
  }
67
67
 
68
68
  // fetch next / previous page?
69
69
  else if (direction) {
70
70
  const previous = direction === 'backward';
71
- const param = previous ? getPreviousPageParam(options, oldPages) : getNextPageParam(options, oldPages);
72
- promise = fetchPage(oldPages, param, previous);
71
+ const pageParamFn = previous ? getPreviousPageParam : getNextPageParam;
72
+ const oldData = {
73
+ pages: oldPages,
74
+ pageParams: oldPageParams
75
+ };
76
+ const param = pageParamFn(options, oldData);
77
+ result = await fetchPage(oldData, param, previous);
73
78
  }
74
79
 
75
80
  // Refetch pages
76
81
  else {
77
- newPageParams = [];
78
-
79
82
  // Fetch first page
80
- promise = fetchPage([], oldPageParams[0]);
83
+ result = await fetchPage(empty, oldPageParams[0]);
81
84
 
82
85
  // Fetch remaining pages
83
86
  for (let i = 1; i < oldPages.length; i++) {
84
- promise = promise.then(pages => {
85
- const param = getNextPageParam(options, pages);
86
- return fetchPage(pages, param);
87
- });
87
+ const param = getNextPageParam(options, result);
88
+ result = await fetchPage(result, param);
88
89
  }
89
90
  }
90
- const finalPromise = promise.then(pages => ({
91
- pages,
92
- pageParams: newPageParams
93
- }));
94
- return finalPromise;
91
+ return result;
95
92
  };
96
93
  }
97
94
  };
98
95
  }
99
- function getNextPageParam(options, pages) {
100
- return options.getNextPageParam(pages[pages.length - 1], pages);
96
+ function getNextPageParam(options, {
97
+ pages,
98
+ pageParams
99
+ }) {
100
+ const lastIndex = pages.length - 1;
101
+ return options.getNextPageParam(pages[lastIndex], pages, pageParams[lastIndex], pageParams);
101
102
  }
102
- function getPreviousPageParam(options, pages) {
103
- return options.getPreviousPageParam?.(pages[0], pages);
103
+ function getPreviousPageParam(options, {
104
+ pages,
105
+ pageParams
106
+ }) {
107
+ return options.getPreviousPageParam == null ? void 0 : options.getPreviousPageParam(pages[0], pages, pageParams[0], pageParams);
104
108
  }
105
109
 
106
110
  /**
107
111
  * Checks if there is a next page.
108
112
  */
109
- function hasNextPage(options, pages) {
110
- if (!pages) return false;
111
- return typeof getNextPageParam(options, pages) !== 'undefined';
113
+ function hasNextPage(options, data) {
114
+ if (!data) return false;
115
+ return typeof getNextPageParam(options, data) !== 'undefined';
112
116
  }
113
117
 
114
118
  /**
115
119
  * Checks if there is a previous page.
116
120
  */
117
- function hasPreviousPage(options, pages) {
118
- if (!pages || !options.getPreviousPageParam) return false;
119
- return typeof getPreviousPageParam(options, pages) !== 'undefined';
121
+ function hasPreviousPage(options, data) {
122
+ if (!data || !options.getPreviousPageParam) return false;
123
+ return typeof getPreviousPageParam(options, data) !== 'undefined';
120
124
  }
121
125
 
122
126
  export { hasNextPage, hasPreviousPage, infiniteQueryBehavior };
@@ -1 +1 @@
1
- {"version":3,"file":"infiniteQueryBehavior.esm.js","sources":["../../src/infiniteQueryBehavior.ts"],"sourcesContent":["import type { QueryBehavior } from './query'\nimport { addToEnd, addToStart } from './utils'\nimport type {\n InfiniteData,\n InfiniteQueryPageParamsOptions,\n QueryFunctionContext,\n QueryKey,\n} from './types'\n\nexport function infiniteQueryBehavior<\n TQueryFnData,\n TError,\n TData,\n>(): QueryBehavior<TQueryFnData, TError, InfiniteData<TData>> {\n return {\n onFetch: (context) => {\n context.fetchFn = () => {\n const options = context.options as InfiniteQueryPageParamsOptions<TData>\n const direction = context.fetchOptions?.meta?.fetchMore?.direction\n const oldPages = context.state.data?.pages || []\n const oldPageParams = context.state.data?.pageParams || []\n let newPageParams = oldPageParams\n let cancelled = false\n\n const addSignalProperty = (object: unknown) => {\n Object.defineProperty(object, 'signal', {\n enumerable: true,\n get: () => {\n if (context.signal.aborted) {\n cancelled = true\n } else {\n context.signal.addEventListener('abort', () => {\n cancelled = true\n })\n }\n return context.signal\n },\n })\n }\n\n // Get query function\n const queryFn =\n context.options.queryFn ||\n (() => Promise.reject(new Error('Missing queryFn')))\n\n const buildNewPages = (\n pages: unknown[],\n param: unknown,\n page: unknown,\n previous?: boolean,\n ) => {\n const { maxPages } = context.options\n\n if (previous) {\n newPageParams = addToStart(newPageParams, param, maxPages)\n return addToStart(pages, page, maxPages)\n }\n\n newPageParams = addToEnd(newPageParams, param, maxPages)\n return addToEnd(pages, page, maxPages)\n }\n\n // Create function to fetch a page\n const fetchPage = (\n pages: unknown[],\n param: unknown,\n previous?: boolean,\n ): Promise<unknown[]> => {\n if (cancelled) {\n return Promise.reject()\n }\n\n if (typeof param === 'undefined' && pages.length) {\n return Promise.resolve(pages)\n }\n\n const queryFnContext: Omit<\n QueryFunctionContext<QueryKey, unknown>,\n 'signal'\n > = {\n queryKey: context.queryKey,\n pageParam: param,\n meta: context.options.meta,\n }\n\n addSignalProperty(queryFnContext)\n\n const queryFnResult = queryFn(\n queryFnContext as QueryFunctionContext<QueryKey, unknown>,\n )\n\n const promise = Promise.resolve(queryFnResult).then((page) =>\n buildNewPages(pages, param, page, previous),\n )\n\n return promise\n }\n\n let promise: Promise<unknown[]>\n\n // Fetch first page?\n if (!oldPages.length) {\n promise = fetchPage([], options.defaultPageParam)\n }\n\n // fetch next / previous page?\n else if (direction) {\n const previous = direction === 'backward'\n const param = previous\n ? getPreviousPageParam(options, oldPages)\n : getNextPageParam(options, oldPages)\n promise = fetchPage(oldPages, param, previous)\n }\n\n // Refetch pages\n else {\n newPageParams = []\n\n // Fetch first page\n promise = fetchPage([], oldPageParams[0])\n\n // Fetch remaining pages\n for (let i = 1; i < oldPages.length; i++) {\n promise = promise.then((pages) => {\n const param = getNextPageParam(options, pages)\n return fetchPage(pages, param)\n })\n }\n }\n\n const finalPromise = promise.then((pages) => ({\n pages,\n pageParams: newPageParams,\n }))\n\n return finalPromise\n }\n },\n }\n}\n\nfunction getNextPageParam(\n options: InfiniteQueryPageParamsOptions<any>,\n pages: unknown[],\n): unknown | undefined {\n return options.getNextPageParam(pages[pages.length - 1], pages)\n}\n\nfunction getPreviousPageParam(\n options: InfiniteQueryPageParamsOptions<any>,\n pages: unknown[],\n): unknown | undefined {\n return options.getPreviousPageParam?.(pages[0], pages)\n}\n\n/**\n * Checks if there is a next page.\n */\nexport function hasNextPage(\n options: InfiniteQueryPageParamsOptions<any>,\n pages?: unknown[],\n): boolean {\n if (!pages) return false\n return typeof getNextPageParam(options, pages) !== 'undefined'\n}\n\n/**\n * Checks if there is a previous page.\n */\nexport function hasPreviousPage(\n options: InfiniteQueryPageParamsOptions<any>,\n pages?: unknown[],\n): boolean {\n if (!pages || !options.getPreviousPageParam) return false\n return typeof getPreviousPageParam(options, pages) !== 'undefined'\n}\n"],"names":["infiniteQueryBehavior","onFetch","context","fetchFn","options","direction","fetchOptions","meta","fetchMore","oldPages","state","data","pages","oldPageParams","pageParams","newPageParams","cancelled","addSignalProperty","object","Object","defineProperty","enumerable","get","signal","aborted","addEventListener","queryFn","Promise","reject","Error","buildNewPages","param","page","previous","maxPages","addToStart","addToEnd","fetchPage","length","resolve","queryFnContext","queryKey","pageParam","queryFnResult","promise","then","defaultPageParam","getPreviousPageParam","getNextPageParam","i","finalPromise","hasNextPage","hasPreviousPage"],"mappings":"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"}
1
+ {"version":3,"file":"infiniteQueryBehavior.esm.js","sources":["../../src/infiniteQueryBehavior.ts"],"sourcesContent":["import type { QueryBehavior } from './query'\nimport { addToEnd, addToStart } from './utils'\nimport type {\n InfiniteData,\n InfiniteQueryPageParamsOptions,\n QueryFunctionContext,\n QueryKey,\n} from './types'\n\nexport function infiniteQueryBehavior<\n TQueryFnData,\n TError,\n TData,\n>(): QueryBehavior<TQueryFnData, TError, InfiniteData<TData>> {\n return {\n onFetch: (context) => {\n context.fetchFn = async () => {\n const options = context.options as InfiniteQueryPageParamsOptions<TData>\n const direction = context.fetchOptions?.meta?.fetchMore?.direction\n const oldPages = context.state.data?.pages || []\n const oldPageParams = context.state.data?.pageParams || []\n const empty = { pages: [], pageParams: [] }\n let cancelled = false\n\n const addSignalProperty = (object: unknown) => {\n Object.defineProperty(object, 'signal', {\n enumerable: true,\n get: () => {\n if (context.signal.aborted) {\n cancelled = true\n } else {\n context.signal.addEventListener('abort', () => {\n cancelled = true\n })\n }\n return context.signal\n },\n })\n }\n\n // Get query function\n const queryFn =\n context.options.queryFn ||\n (() => Promise.reject(new Error('Missing queryFn')))\n\n // Create function to fetch a page\n const fetchPage = async (\n data: InfiniteData<unknown>,\n param: unknown,\n previous?: boolean,\n ): Promise<InfiniteData<unknown>> => {\n if (cancelled) {\n return Promise.reject()\n }\n\n if (typeof param === 'undefined' && data.pages.length) {\n return Promise.resolve(data)\n }\n\n const queryFnContext: Omit<\n QueryFunctionContext<QueryKey, unknown>,\n 'signal'\n > = {\n queryKey: context.queryKey,\n pageParam: param,\n direction: previous ? 'backward' : 'forward',\n meta: context.options.meta,\n }\n\n addSignalProperty(queryFnContext)\n\n const page = await queryFn(\n queryFnContext as QueryFunctionContext<QueryKey, unknown>,\n )\n\n const { maxPages } = context.options\n const addTo = previous ? addToStart : addToEnd\n\n return {\n pages: addTo(data.pages, page, maxPages),\n pageParams: addTo(data.pageParams, param, maxPages),\n }\n }\n\n let result: InfiniteData<unknown>\n\n // Fetch first page?\n if (!oldPages.length) {\n result = await fetchPage(empty, options.defaultPageParam)\n }\n\n // fetch next / previous page?\n else if (direction) {\n const previous = direction === 'backward'\n const pageParamFn = previous ? getPreviousPageParam : getNextPageParam\n const oldData = {\n pages: oldPages,\n pageParams: oldPageParams,\n }\n const param = pageParamFn(options, oldData)\n\n result = await fetchPage(oldData, param, previous)\n }\n\n // Refetch pages\n else {\n // Fetch first page\n result = await fetchPage(empty, oldPageParams[0])\n\n // Fetch remaining pages\n for (let i = 1; i < oldPages.length; i++) {\n const param = getNextPageParam(options, result)\n result = await fetchPage(result, param)\n }\n }\n\n return result\n }\n },\n }\n}\n\nfunction getNextPageParam(\n options: InfiniteQueryPageParamsOptions<any>,\n { pages, pageParams }: InfiniteData<unknown>,\n): unknown | undefined {\n const lastIndex = pages.length - 1\n return options.getNextPageParam(\n pages[lastIndex],\n pages,\n pageParams[lastIndex],\n pageParams,\n )\n}\n\nfunction getPreviousPageParam(\n options: InfiniteQueryPageParamsOptions<any>,\n { pages, pageParams }: InfiniteData<unknown>,\n): unknown | undefined {\n return options.getPreviousPageParam?.(\n pages[0],\n pages,\n pageParams[0],\n pageParams,\n )\n}\n\n/**\n * Checks if there is a next page.\n */\nexport function hasNextPage(\n options: InfiniteQueryPageParamsOptions<any, any>,\n data?: InfiniteData<unknown>,\n): boolean {\n if (!data) return false\n return typeof getNextPageParam(options, data) !== 'undefined'\n}\n\n/**\n * Checks if there is a previous page.\n */\nexport function hasPreviousPage(\n options: InfiniteQueryPageParamsOptions<any, any>,\n data?: InfiniteData<unknown>,\n): boolean {\n if (!data || !options.getPreviousPageParam) return false\n return typeof getPreviousPageParam(options, data) !== 'undefined'\n}\n"],"names":["infiniteQueryBehavior","onFetch","context","fetchFn","options","direction","fetchOptions","meta","fetchMore","oldPages","state","data","pages","oldPageParams","pageParams","empty","cancelled","addSignalProperty","object","Object","defineProperty","enumerable","get","signal","aborted","addEventListener","queryFn","Promise","reject","Error","fetchPage","param","previous","length","resolve","queryFnContext","queryKey","pageParam","page","maxPages","addTo","addToStart","addToEnd","result","defaultPageParam","pageParamFn","getPreviousPageParam","getNextPageParam","oldData","i","lastIndex","hasNextPage","hasPreviousPage"],"mappings":"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"}
@@ -5,12 +5,16 @@ var utils = require('./utils.js');
5
5
  function infiniteQueryBehavior() {
6
6
  return {
7
7
  onFetch: context => {
8
- context.fetchFn = () => {
8
+ context.fetchFn = async () => {
9
+ var _context$fetchOptions, _context$fetchOptions2, _context$fetchOptions3, _context$state$data, _context$state$data2;
9
10
  const options = context.options;
10
- const direction = context.fetchOptions?.meta?.fetchMore?.direction;
11
- const oldPages = context.state.data?.pages || [];
12
- const oldPageParams = context.state.data?.pageParams || [];
13
- let newPageParams = oldPageParams;
11
+ const direction = (_context$fetchOptions = context.fetchOptions) == null ? void 0 : (_context$fetchOptions2 = _context$fetchOptions.meta) == null ? void 0 : (_context$fetchOptions3 = _context$fetchOptions2.fetchMore) == null ? void 0 : _context$fetchOptions3.direction;
12
+ const oldPages = ((_context$state$data = context.state.data) == null ? void 0 : _context$state$data.pages) || [];
13
+ const oldPageParams = ((_context$state$data2 = context.state.data) == null ? void 0 : _context$state$data2.pageParams) || [];
14
+ const empty = {
15
+ pages: [],
16
+ pageParams: []
17
+ };
14
18
  let cancelled = false;
15
19
  const addSignalProperty = object => {
16
20
  Object.defineProperty(object, 'signal', {
@@ -30,95 +34,95 @@ function infiniteQueryBehavior() {
30
34
 
31
35
  // Get query function
32
36
  const queryFn = context.options.queryFn || (() => Promise.reject(new Error('Missing queryFn')));
33
- const buildNewPages = (pages, param, page, previous) => {
34
- const {
35
- maxPages
36
- } = context.options;
37
- if (previous) {
38
- newPageParams = utils.addToStart(newPageParams, param, maxPages);
39
- return utils.addToStart(pages, page, maxPages);
40
- }
41
- newPageParams = utils.addToEnd(newPageParams, param, maxPages);
42
- return utils.addToEnd(pages, page, maxPages);
43
- };
44
37
 
45
38
  // Create function to fetch a page
46
- const fetchPage = (pages, param, previous) => {
39
+ const fetchPage = async (data, param, previous) => {
47
40
  if (cancelled) {
48
41
  return Promise.reject();
49
42
  }
50
- if (typeof param === 'undefined' && pages.length) {
51
- return Promise.resolve(pages);
43
+ if (typeof param === 'undefined' && data.pages.length) {
44
+ return Promise.resolve(data);
52
45
  }
53
46
  const queryFnContext = {
54
47
  queryKey: context.queryKey,
55
48
  pageParam: param,
49
+ direction: previous ? 'backward' : 'forward',
56
50
  meta: context.options.meta
57
51
  };
58
52
  addSignalProperty(queryFnContext);
59
- const queryFnResult = queryFn(queryFnContext);
60
- const promise = Promise.resolve(queryFnResult).then(page => buildNewPages(pages, param, page, previous));
61
- return promise;
53
+ const page = await queryFn(queryFnContext);
54
+ const {
55
+ maxPages
56
+ } = context.options;
57
+ const addTo = previous ? utils.addToStart : utils.addToEnd;
58
+ return {
59
+ pages: addTo(data.pages, page, maxPages),
60
+ pageParams: addTo(data.pageParams, param, maxPages)
61
+ };
62
62
  };
63
- let promise;
63
+ let result;
64
64
 
65
65
  // Fetch first page?
66
66
  if (!oldPages.length) {
67
- promise = fetchPage([], options.defaultPageParam);
67
+ result = await fetchPage(empty, options.defaultPageParam);
68
68
  }
69
69
 
70
70
  // fetch next / previous page?
71
71
  else if (direction) {
72
72
  const previous = direction === 'backward';
73
- const param = previous ? getPreviousPageParam(options, oldPages) : getNextPageParam(options, oldPages);
74
- promise = fetchPage(oldPages, param, previous);
73
+ const pageParamFn = previous ? getPreviousPageParam : getNextPageParam;
74
+ const oldData = {
75
+ pages: oldPages,
76
+ pageParams: oldPageParams
77
+ };
78
+ const param = pageParamFn(options, oldData);
79
+ result = await fetchPage(oldData, param, previous);
75
80
  }
76
81
 
77
82
  // Refetch pages
78
83
  else {
79
- newPageParams = [];
80
-
81
84
  // Fetch first page
82
- promise = fetchPage([], oldPageParams[0]);
85
+ result = await fetchPage(empty, oldPageParams[0]);
83
86
 
84
87
  // Fetch remaining pages
85
88
  for (let i = 1; i < oldPages.length; i++) {
86
- promise = promise.then(pages => {
87
- const param = getNextPageParam(options, pages);
88
- return fetchPage(pages, param);
89
- });
89
+ const param = getNextPageParam(options, result);
90
+ result = await fetchPage(result, param);
90
91
  }
91
92
  }
92
- const finalPromise = promise.then(pages => ({
93
- pages,
94
- pageParams: newPageParams
95
- }));
96
- return finalPromise;
93
+ return result;
97
94
  };
98
95
  }
99
96
  };
100
97
  }
101
- function getNextPageParam(options, pages) {
102
- return options.getNextPageParam(pages[pages.length - 1], pages);
98
+ function getNextPageParam(options, {
99
+ pages,
100
+ pageParams
101
+ }) {
102
+ const lastIndex = pages.length - 1;
103
+ return options.getNextPageParam(pages[lastIndex], pages, pageParams[lastIndex], pageParams);
103
104
  }
104
- function getPreviousPageParam(options, pages) {
105
- return options.getPreviousPageParam?.(pages[0], pages);
105
+ function getPreviousPageParam(options, {
106
+ pages,
107
+ pageParams
108
+ }) {
109
+ return options.getPreviousPageParam == null ? void 0 : options.getPreviousPageParam(pages[0], pages, pageParams[0], pageParams);
106
110
  }
107
111
 
108
112
  /**
109
113
  * Checks if there is a next page.
110
114
  */
111
- function hasNextPage(options, pages) {
112
- if (!pages) return false;
113
- return typeof getNextPageParam(options, pages) !== 'undefined';
115
+ function hasNextPage(options, data) {
116
+ if (!data) return false;
117
+ return typeof getNextPageParam(options, data) !== 'undefined';
114
118
  }
115
119
 
116
120
  /**
117
121
  * Checks if there is a previous page.
118
122
  */
119
- function hasPreviousPage(options, pages) {
120
- if (!pages || !options.getPreviousPageParam) return false;
121
- return typeof getPreviousPageParam(options, pages) !== 'undefined';
123
+ function hasPreviousPage(options, data) {
124
+ if (!data || !options.getPreviousPageParam) return false;
125
+ return typeof getPreviousPageParam(options, data) !== 'undefined';
122
126
  }
123
127
 
124
128
  exports.hasNextPage = hasNextPage;
@@ -1 +1 @@
1
- {"version":3,"file":"infiniteQueryBehavior.js","sources":["../../src/infiniteQueryBehavior.ts"],"sourcesContent":["import type { QueryBehavior } from './query'\nimport { addToEnd, addToStart } from './utils'\nimport type {\n InfiniteData,\n InfiniteQueryPageParamsOptions,\n QueryFunctionContext,\n QueryKey,\n} from './types'\n\nexport function infiniteQueryBehavior<\n TQueryFnData,\n TError,\n TData,\n>(): QueryBehavior<TQueryFnData, TError, InfiniteData<TData>> {\n return {\n onFetch: (context) => {\n context.fetchFn = () => {\n const options = context.options as InfiniteQueryPageParamsOptions<TData>\n const direction = context.fetchOptions?.meta?.fetchMore?.direction\n const oldPages = context.state.data?.pages || []\n const oldPageParams = context.state.data?.pageParams || []\n let newPageParams = oldPageParams\n let cancelled = false\n\n const addSignalProperty = (object: unknown) => {\n Object.defineProperty(object, 'signal', {\n enumerable: true,\n get: () => {\n if (context.signal.aborted) {\n cancelled = true\n } else {\n context.signal.addEventListener('abort', () => {\n cancelled = true\n })\n }\n return context.signal\n },\n })\n }\n\n // Get query function\n const queryFn =\n context.options.queryFn ||\n (() => Promise.reject(new Error('Missing queryFn')))\n\n const buildNewPages = (\n pages: unknown[],\n param: unknown,\n page: unknown,\n previous?: boolean,\n ) => {\n const { maxPages } = context.options\n\n if (previous) {\n newPageParams = addToStart(newPageParams, param, maxPages)\n return addToStart(pages, page, maxPages)\n }\n\n newPageParams = addToEnd(newPageParams, param, maxPages)\n return addToEnd(pages, page, maxPages)\n }\n\n // Create function to fetch a page\n const fetchPage = (\n pages: unknown[],\n param: unknown,\n previous?: boolean,\n ): Promise<unknown[]> => {\n if (cancelled) {\n return Promise.reject()\n }\n\n if (typeof param === 'undefined' && pages.length) {\n return Promise.resolve(pages)\n }\n\n const queryFnContext: Omit<\n QueryFunctionContext<QueryKey, unknown>,\n 'signal'\n > = {\n queryKey: context.queryKey,\n pageParam: param,\n meta: context.options.meta,\n }\n\n addSignalProperty(queryFnContext)\n\n const queryFnResult = queryFn(\n queryFnContext as QueryFunctionContext<QueryKey, unknown>,\n )\n\n const promise = Promise.resolve(queryFnResult).then((page) =>\n buildNewPages(pages, param, page, previous),\n )\n\n return promise\n }\n\n let promise: Promise<unknown[]>\n\n // Fetch first page?\n if (!oldPages.length) {\n promise = fetchPage([], options.defaultPageParam)\n }\n\n // fetch next / previous page?\n else if (direction) {\n const previous = direction === 'backward'\n const param = previous\n ? getPreviousPageParam(options, oldPages)\n : getNextPageParam(options, oldPages)\n promise = fetchPage(oldPages, param, previous)\n }\n\n // Refetch pages\n else {\n newPageParams = []\n\n // Fetch first page\n promise = fetchPage([], oldPageParams[0])\n\n // Fetch remaining pages\n for (let i = 1; i < oldPages.length; i++) {\n promise = promise.then((pages) => {\n const param = getNextPageParam(options, pages)\n return fetchPage(pages, param)\n })\n }\n }\n\n const finalPromise = promise.then((pages) => ({\n pages,\n pageParams: newPageParams,\n }))\n\n return finalPromise\n }\n },\n }\n}\n\nfunction getNextPageParam(\n options: InfiniteQueryPageParamsOptions<any>,\n pages: unknown[],\n): unknown | undefined {\n return options.getNextPageParam(pages[pages.length - 1], pages)\n}\n\nfunction getPreviousPageParam(\n options: InfiniteQueryPageParamsOptions<any>,\n pages: unknown[],\n): unknown | undefined {\n return options.getPreviousPageParam?.(pages[0], pages)\n}\n\n/**\n * Checks if there is a next page.\n */\nexport function hasNextPage(\n options: InfiniteQueryPageParamsOptions<any>,\n pages?: unknown[],\n): boolean {\n if (!pages) return false\n return typeof getNextPageParam(options, pages) !== 'undefined'\n}\n\n/**\n * Checks if there is a previous page.\n */\nexport function hasPreviousPage(\n options: InfiniteQueryPageParamsOptions<any>,\n pages?: unknown[],\n): boolean {\n if (!pages || !options.getPreviousPageParam) return false\n return typeof getPreviousPageParam(options, pages) !== 'undefined'\n}\n"],"names":["infiniteQueryBehavior","onFetch","context","fetchFn","options","direction","fetchOptions","meta","fetchMore","oldPages","state","data","pages","oldPageParams","pageParams","newPageParams","cancelled","addSignalProperty","object","Object","defineProperty","enumerable","get","signal","aborted","addEventListener","queryFn","Promise","reject","Error","buildNewPages","param","page","previous","maxPages","addToStart","addToEnd","fetchPage","length","resolve","queryFnContext","queryKey","pageParam","queryFnResult","promise","then","defaultPageParam","getPreviousPageParam","getNextPageParam","i","finalPromise","hasNextPage","hasPreviousPage"],"mappings":"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"}
1
+ {"version":3,"file":"infiniteQueryBehavior.js","sources":["../../src/infiniteQueryBehavior.ts"],"sourcesContent":["import type { QueryBehavior } from './query'\nimport { addToEnd, addToStart } from './utils'\nimport type {\n InfiniteData,\n InfiniteQueryPageParamsOptions,\n QueryFunctionContext,\n QueryKey,\n} from './types'\n\nexport function infiniteQueryBehavior<\n TQueryFnData,\n TError,\n TData,\n>(): QueryBehavior<TQueryFnData, TError, InfiniteData<TData>> {\n return {\n onFetch: (context) => {\n context.fetchFn = async () => {\n const options = context.options as InfiniteQueryPageParamsOptions<TData>\n const direction = context.fetchOptions?.meta?.fetchMore?.direction\n const oldPages = context.state.data?.pages || []\n const oldPageParams = context.state.data?.pageParams || []\n const empty = { pages: [], pageParams: [] }\n let cancelled = false\n\n const addSignalProperty = (object: unknown) => {\n Object.defineProperty(object, 'signal', {\n enumerable: true,\n get: () => {\n if (context.signal.aborted) {\n cancelled = true\n } else {\n context.signal.addEventListener('abort', () => {\n cancelled = true\n })\n }\n return context.signal\n },\n })\n }\n\n // Get query function\n const queryFn =\n context.options.queryFn ||\n (() => Promise.reject(new Error('Missing queryFn')))\n\n // Create function to fetch a page\n const fetchPage = async (\n data: InfiniteData<unknown>,\n param: unknown,\n previous?: boolean,\n ): Promise<InfiniteData<unknown>> => {\n if (cancelled) {\n return Promise.reject()\n }\n\n if (typeof param === 'undefined' && data.pages.length) {\n return Promise.resolve(data)\n }\n\n const queryFnContext: Omit<\n QueryFunctionContext<QueryKey, unknown>,\n 'signal'\n > = {\n queryKey: context.queryKey,\n pageParam: param,\n direction: previous ? 'backward' : 'forward',\n meta: context.options.meta,\n }\n\n addSignalProperty(queryFnContext)\n\n const page = await queryFn(\n queryFnContext as QueryFunctionContext<QueryKey, unknown>,\n )\n\n const { maxPages } = context.options\n const addTo = previous ? addToStart : addToEnd\n\n return {\n pages: addTo(data.pages, page, maxPages),\n pageParams: addTo(data.pageParams, param, maxPages),\n }\n }\n\n let result: InfiniteData<unknown>\n\n // Fetch first page?\n if (!oldPages.length) {\n result = await fetchPage(empty, options.defaultPageParam)\n }\n\n // fetch next / previous page?\n else if (direction) {\n const previous = direction === 'backward'\n const pageParamFn = previous ? getPreviousPageParam : getNextPageParam\n const oldData = {\n pages: oldPages,\n pageParams: oldPageParams,\n }\n const param = pageParamFn(options, oldData)\n\n result = await fetchPage(oldData, param, previous)\n }\n\n // Refetch pages\n else {\n // Fetch first page\n result = await fetchPage(empty, oldPageParams[0])\n\n // Fetch remaining pages\n for (let i = 1; i < oldPages.length; i++) {\n const param = getNextPageParam(options, result)\n result = await fetchPage(result, param)\n }\n }\n\n return result\n }\n },\n }\n}\n\nfunction getNextPageParam(\n options: InfiniteQueryPageParamsOptions<any>,\n { pages, pageParams }: InfiniteData<unknown>,\n): unknown | undefined {\n const lastIndex = pages.length - 1\n return options.getNextPageParam(\n pages[lastIndex],\n pages,\n pageParams[lastIndex],\n pageParams,\n )\n}\n\nfunction getPreviousPageParam(\n options: InfiniteQueryPageParamsOptions<any>,\n { pages, pageParams }: InfiniteData<unknown>,\n): unknown | undefined {\n return options.getPreviousPageParam?.(\n pages[0],\n pages,\n pageParams[0],\n pageParams,\n )\n}\n\n/**\n * Checks if there is a next page.\n */\nexport function hasNextPage(\n options: InfiniteQueryPageParamsOptions<any, any>,\n data?: InfiniteData<unknown>,\n): boolean {\n if (!data) return false\n return typeof getNextPageParam(options, data) !== 'undefined'\n}\n\n/**\n * Checks if there is a previous page.\n */\nexport function hasPreviousPage(\n options: InfiniteQueryPageParamsOptions<any, any>,\n data?: InfiniteData<unknown>,\n): boolean {\n if (!data || !options.getPreviousPageParam) return false\n return typeof getPreviousPageParam(options, data) !== 'undefined'\n}\n"],"names":["infiniteQueryBehavior","onFetch","context","fetchFn","options","direction","fetchOptions","meta","fetchMore","oldPages","state","data","pages","oldPageParams","pageParams","empty","cancelled","addSignalProperty","object","Object","defineProperty","enumerable","get","signal","aborted","addEventListener","queryFn","Promise","reject","Error","fetchPage","param","previous","length","resolve","queryFnContext","queryKey","pageParam","page","maxPages","addTo","addToStart","addToEnd","result","defaultPageParam","pageParamFn","getPreviousPageParam","getNextPageParam","oldData","i","lastIndex","hasNextPage","hasPreviousPage"],"mappings":"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"}
@@ -3,12 +3,15 @@ import { addToStart, addToEnd } from './utils.mjs';
3
3
  function infiniteQueryBehavior() {
4
4
  return {
5
5
  onFetch: context => {
6
- context.fetchFn = () => {
6
+ context.fetchFn = async () => {
7
7
  const options = context.options;
8
8
  const direction = context.fetchOptions?.meta?.fetchMore?.direction;
9
9
  const oldPages = context.state.data?.pages || [];
10
10
  const oldPageParams = context.state.data?.pageParams || [];
11
- let newPageParams = oldPageParams;
11
+ const empty = {
12
+ pages: [],
13
+ pageParams: []
14
+ };
12
15
  let cancelled = false;
13
16
  const addSignalProperty = object => {
14
17
  Object.defineProperty(object, 'signal', {
@@ -28,95 +31,95 @@ function infiniteQueryBehavior() {
28
31
 
29
32
  // Get query function
30
33
  const queryFn = context.options.queryFn || (() => Promise.reject(new Error('Missing queryFn')));
31
- const buildNewPages = (pages, param, page, previous) => {
32
- const {
33
- maxPages
34
- } = context.options;
35
- if (previous) {
36
- newPageParams = addToStart(newPageParams, param, maxPages);
37
- return addToStart(pages, page, maxPages);
38
- }
39
- newPageParams = addToEnd(newPageParams, param, maxPages);
40
- return addToEnd(pages, page, maxPages);
41
- };
42
34
 
43
35
  // Create function to fetch a page
44
- const fetchPage = (pages, param, previous) => {
36
+ const fetchPage = async (data, param, previous) => {
45
37
  if (cancelled) {
46
38
  return Promise.reject();
47
39
  }
48
- if (typeof param === 'undefined' && pages.length) {
49
- return Promise.resolve(pages);
40
+ if (typeof param === 'undefined' && data.pages.length) {
41
+ return Promise.resolve(data);
50
42
  }
51
43
  const queryFnContext = {
52
44
  queryKey: context.queryKey,
53
45
  pageParam: param,
46
+ direction: previous ? 'backward' : 'forward',
54
47
  meta: context.options.meta
55
48
  };
56
49
  addSignalProperty(queryFnContext);
57
- const queryFnResult = queryFn(queryFnContext);
58
- const promise = Promise.resolve(queryFnResult).then(page => buildNewPages(pages, param, page, previous));
59
- return promise;
50
+ const page = await queryFn(queryFnContext);
51
+ const {
52
+ maxPages
53
+ } = context.options;
54
+ const addTo = previous ? addToStart : addToEnd;
55
+ return {
56
+ pages: addTo(data.pages, page, maxPages),
57
+ pageParams: addTo(data.pageParams, param, maxPages)
58
+ };
60
59
  };
61
- let promise;
60
+ let result;
62
61
 
63
62
  // Fetch first page?
64
63
  if (!oldPages.length) {
65
- promise = fetchPage([], options.defaultPageParam);
64
+ result = await fetchPage(empty, options.defaultPageParam);
66
65
  }
67
66
 
68
67
  // fetch next / previous page?
69
68
  else if (direction) {
70
69
  const previous = direction === 'backward';
71
- const param = previous ? getPreviousPageParam(options, oldPages) : getNextPageParam(options, oldPages);
72
- promise = fetchPage(oldPages, param, previous);
70
+ const pageParamFn = previous ? getPreviousPageParam : getNextPageParam;
71
+ const oldData = {
72
+ pages: oldPages,
73
+ pageParams: oldPageParams
74
+ };
75
+ const param = pageParamFn(options, oldData);
76
+ result = await fetchPage(oldData, param, previous);
73
77
  }
74
78
 
75
79
  // Refetch pages
76
80
  else {
77
- newPageParams = [];
78
-
79
81
  // Fetch first page
80
- promise = fetchPage([], oldPageParams[0]);
82
+ result = await fetchPage(empty, oldPageParams[0]);
81
83
 
82
84
  // Fetch remaining pages
83
85
  for (let i = 1; i < oldPages.length; i++) {
84
- promise = promise.then(pages => {
85
- const param = getNextPageParam(options, pages);
86
- return fetchPage(pages, param);
87
- });
86
+ const param = getNextPageParam(options, result);
87
+ result = await fetchPage(result, param);
88
88
  }
89
89
  }
90
- const finalPromise = promise.then(pages => ({
91
- pages,
92
- pageParams: newPageParams
93
- }));
94
- return finalPromise;
90
+ return result;
95
91
  };
96
92
  }
97
93
  };
98
94
  }
99
- function getNextPageParam(options, pages) {
100
- return options.getNextPageParam(pages[pages.length - 1], pages);
95
+ function getNextPageParam(options, {
96
+ pages,
97
+ pageParams
98
+ }) {
99
+ const lastIndex = pages.length - 1;
100
+ return options.getNextPageParam(pages[lastIndex], pages, pageParams[lastIndex], pageParams);
101
101
  }
102
- function getPreviousPageParam(options, pages) {
103
- return options.getPreviousPageParam?.(pages[0], pages);
102
+ function getPreviousPageParam(options, {
103
+ pages,
104
+ pageParams
105
+ }) {
106
+ return options.getPreviousPageParam?.(pages[0], pages, pageParams[0], pageParams);
104
107
  }
105
108
 
106
109
  /**
107
110
  * Checks if there is a next page.
108
111
  */
109
- function hasNextPage(options, pages) {
110
- if (!pages) return false;
111
- return typeof getNextPageParam(options, pages) !== 'undefined';
112
+ function hasNextPage(options, data) {
113
+ if (!data) return false;
114
+ return typeof getNextPageParam(options, data) !== 'undefined';
112
115
  }
113
116
 
114
117
  /**
115
118
  * Checks if there is a previous page.
116
119
  */
117
- function hasPreviousPage(options, pages) {
118
- if (!pages || !options.getPreviousPageParam) return false;
119
- return typeof getPreviousPageParam(options, pages) !== 'undefined';
120
+ function hasPreviousPage(options, data) {
121
+ if (!data || !options.getPreviousPageParam) return false;
122
+ return typeof getPreviousPageParam(options, data) !== 'undefined';
120
123
  }
121
124
 
122
125
  export { hasNextPage, hasPreviousPage, infiniteQueryBehavior };