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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/build/lib/infiniteQueryBehavior.d.ts +2 -2
  2. package/build/lib/infiniteQueryBehavior.esm.js +47 -45
  3. package/build/lib/infiniteQueryBehavior.esm.js.map +1 -1
  4. package/build/lib/infiniteQueryBehavior.js +47 -45
  5. package/build/lib/infiniteQueryBehavior.js.map +1 -1
  6. package/build/lib/infiniteQueryBehavior.mjs +47 -45
  7. package/build/lib/infiniteQueryBehavior.mjs.map +1 -1
  8. package/build/lib/infiniteQueryObserver.d.ts +6 -6
  9. package/build/lib/infiniteQueryObserver.esm.js +4 -6
  10. package/build/lib/infiniteQueryObserver.esm.js.map +1 -1
  11. package/build/lib/infiniteQueryObserver.js +4 -6
  12. package/build/lib/infiniteQueryObserver.js.map +1 -1
  13. package/build/lib/infiniteQueryObserver.mjs +4 -6
  14. package/build/lib/infiniteQueryObserver.mjs.map +1 -1
  15. package/build/lib/mutation.d.ts +2 -1
  16. package/build/lib/mutation.esm.js +10 -2
  17. package/build/lib/mutation.esm.js.map +1 -1
  18. package/build/lib/mutation.js +10 -2
  19. package/build/lib/mutation.js.map +1 -1
  20. package/build/lib/mutation.mjs +10 -2
  21. package/build/lib/mutation.mjs.map +1 -1
  22. package/build/lib/mutationCache.d.ts +2 -2
  23. package/build/lib/mutationCache.esm.js.map +1 -1
  24. package/build/lib/mutationCache.js.map +1 -1
  25. package/build/lib/mutationCache.mjs.map +1 -1
  26. package/build/lib/mutationObserver.esm.js +1 -0
  27. package/build/lib/mutationObserver.esm.js.map +1 -1
  28. package/build/lib/mutationObserver.js +1 -0
  29. package/build/lib/mutationObserver.js.map +1 -1
  30. package/build/lib/mutationObserver.mjs +1 -0
  31. package/build/lib/mutationObserver.mjs.map +1 -1
  32. package/build/lib/query.esm.js.map +1 -1
  33. package/build/lib/query.js.map +1 -1
  34. package/build/lib/query.mjs.map +1 -1
  35. package/build/lib/queryCache.d.ts +2 -2
  36. package/build/lib/queryCache.esm.js.map +1 -1
  37. package/build/lib/queryCache.js.map +1 -1
  38. package/build/lib/queryCache.mjs.map +1 -1
  39. package/build/lib/tests/utils.d.ts +4 -5
  40. package/build/lib/types.d.ts +3 -3
  41. package/build/umd/index.development.js +62 -53
  42. package/build/umd/index.development.js.map +1 -1
  43. package/build/umd/index.production.js +1 -1
  44. package/build/umd/index.production.js.map +1 -1
  45. package/package.json +2 -2
  46. package/src/infiniteQueryBehavior.ts +51 -60
  47. package/src/infiniteQueryObserver.ts +15 -10
  48. package/src/mutation.ts +14 -5
  49. package/src/mutationCache.ts +2 -2
  50. package/src/mutationObserver.ts +1 -0
  51. package/src/query.ts +7 -4
  52. package/src/queryCache.ts +5 -2
  53. package/src/tests/focusManager.test.tsx +12 -14
  54. package/src/tests/hydration.test.tsx +15 -14
  55. package/src/tests/infiniteQueryBehavior.test.tsx +7 -9
  56. package/src/tests/infiniteQueryObserver.test.tsx +62 -1
  57. package/src/tests/mutationCache.test.tsx +11 -10
  58. package/src/tests/mutationObserver.test.tsx +3 -2
  59. package/src/tests/mutations.test.tsx +41 -9
  60. package/src/tests/notifyManager.test.tsx +7 -6
  61. package/src/tests/onlineManager.test.tsx +12 -17
  62. package/src/tests/queriesObserver.test.tsx +18 -17
  63. package/src/tests/query.test.tsx +18 -17
  64. package/src/tests/queryCache.test.tsx +14 -13
  65. package/src/tests/queryClient.test.tsx +49 -48
  66. package/src/tests/queryObserver.test.tsx +10 -9
  67. package/src/tests/utils.test.tsx +2 -1
  68. package/src/tests/utils.ts +5 -4
  69. package/src/types.ts +7 -1
@@ -4,8 +4,8 @@ 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;
@@ -3,12 +3,15 @@ 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
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,25 +31,14 @@ 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,
@@ -54,69 +46,79 @@ function infiniteQueryBehavior() {
54
46
  meta: context.options.meta
55
47
  };
56
48
  addSignalProperty(queryFnContext);
57
- const queryFnResult = queryFn(queryFnContext);
58
- const promise = Promise.resolve(queryFnResult).then(page => buildNewPages(pages, param, page, previous));
59
- return promise;
49
+ const page = await queryFn(queryFnContext);
50
+ const {
51
+ maxPages
52
+ } = context.options;
53
+ const addTo = previous ? addToStart : addToEnd;
54
+ return {
55
+ pages: addTo(data.pages, page, maxPages),
56
+ pageParams: addTo(data.pageParams, param, maxPages)
57
+ };
60
58
  };
61
- let promise;
59
+ let result;
62
60
 
63
61
  // Fetch first page?
64
62
  if (!oldPages.length) {
65
- promise = fetchPage([], options.defaultPageParam);
63
+ result = await fetchPage(empty, options.defaultPageParam);
66
64
  }
67
65
 
68
66
  // fetch next / previous page?
69
67
  else if (direction) {
70
68
  const previous = direction === 'backward';
71
- const param = previous ? getPreviousPageParam(options, oldPages) : getNextPageParam(options, oldPages);
72
- promise = fetchPage(oldPages, param, previous);
69
+ const pageParamFn = previous ? getPreviousPageParam : getNextPageParam;
70
+ const oldData = {
71
+ pages: oldPages,
72
+ pageParams: oldPageParams
73
+ };
74
+ const param = pageParamFn(options, oldData);
75
+ result = await fetchPage(oldData, param, previous);
73
76
  }
74
77
 
75
78
  // Refetch pages
76
79
  else {
77
- newPageParams = [];
78
-
79
80
  // Fetch first page
80
- promise = fetchPage([], oldPageParams[0]);
81
+ result = await fetchPage(empty, oldPageParams[0]);
81
82
 
82
83
  // Fetch remaining pages
83
84
  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
- });
85
+ const param = getNextPageParam(options, result);
86
+ result = await fetchPage(result, param);
88
87
  }
89
88
  }
90
- const finalPromise = promise.then(pages => ({
91
- pages,
92
- pageParams: newPageParams
93
- }));
94
- return finalPromise;
89
+ return result;
95
90
  };
96
91
  }
97
92
  };
98
93
  }
99
- function getNextPageParam(options, pages) {
100
- return options.getNextPageParam(pages[pages.length - 1], pages);
94
+ function getNextPageParam(options, {
95
+ pages,
96
+ pageParams
97
+ }) {
98
+ const lastIndex = pages.length - 1;
99
+ return options.getNextPageParam(pages[lastIndex], pages, pageParams[lastIndex], pageParams);
101
100
  }
102
- function getPreviousPageParam(options, pages) {
103
- return options.getPreviousPageParam?.(pages[0], pages);
101
+ function getPreviousPageParam(options, {
102
+ pages,
103
+ pageParams
104
+ }) {
105
+ return options.getPreviousPageParam?.(pages[0], pages, pageParams[0], pageParams);
104
106
  }
105
107
 
106
108
  /**
107
109
  * Checks if there is a next page.
108
110
  */
109
- function hasNextPage(options, pages) {
110
- if (!pages) return false;
111
- return typeof getNextPageParam(options, pages) !== 'undefined';
111
+ function hasNextPage(options, data) {
112
+ if (!data) return false;
113
+ return typeof getNextPageParam(options, data) !== 'undefined';
112
114
  }
113
115
 
114
116
  /**
115
117
  * Checks if there is a previous page.
116
118
  */
117
- function hasPreviousPage(options, pages) {
118
- if (!pages || !options.getPreviousPageParam) return false;
119
- return typeof getPreviousPageParam(options, pages) !== 'undefined';
119
+ function hasPreviousPage(options, data) {
120
+ if (!data || !options.getPreviousPageParam) return false;
121
+ return typeof getPreviousPageParam(options, data) !== 'undefined';
120
122
  }
121
123
 
122
124
  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 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,15 @@ var utils = require('./utils.js');
5
5
  function infiniteQueryBehavior() {
6
6
  return {
7
7
  onFetch: context => {
8
- context.fetchFn = () => {
8
+ context.fetchFn = async () => {
9
9
  const options = context.options;
10
10
  const direction = context.fetchOptions?.meta?.fetchMore?.direction;
11
11
  const oldPages = context.state.data?.pages || [];
12
12
  const oldPageParams = context.state.data?.pageParams || [];
13
- let newPageParams = oldPageParams;
13
+ const empty = {
14
+ pages: [],
15
+ pageParams: []
16
+ };
14
17
  let cancelled = false;
15
18
  const addSignalProperty = object => {
16
19
  Object.defineProperty(object, 'signal', {
@@ -30,25 +33,14 @@ function infiniteQueryBehavior() {
30
33
 
31
34
  // Get query function
32
35
  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
36
 
45
37
  // Create function to fetch a page
46
- const fetchPage = (pages, param, previous) => {
38
+ const fetchPage = async (data, param, previous) => {
47
39
  if (cancelled) {
48
40
  return Promise.reject();
49
41
  }
50
- if (typeof param === 'undefined' && pages.length) {
51
- return Promise.resolve(pages);
42
+ if (typeof param === 'undefined' && data.pages.length) {
43
+ return Promise.resolve(data);
52
44
  }
53
45
  const queryFnContext = {
54
46
  queryKey: context.queryKey,
@@ -56,69 +48,79 @@ function infiniteQueryBehavior() {
56
48
  meta: context.options.meta
57
49
  };
58
50
  addSignalProperty(queryFnContext);
59
- const queryFnResult = queryFn(queryFnContext);
60
- const promise = Promise.resolve(queryFnResult).then(page => buildNewPages(pages, param, page, previous));
61
- return promise;
51
+ const page = await queryFn(queryFnContext);
52
+ const {
53
+ maxPages
54
+ } = context.options;
55
+ const addTo = previous ? utils.addToStart : utils.addToEnd;
56
+ return {
57
+ pages: addTo(data.pages, page, maxPages),
58
+ pageParams: addTo(data.pageParams, param, maxPages)
59
+ };
62
60
  };
63
- let promise;
61
+ let result;
64
62
 
65
63
  // Fetch first page?
66
64
  if (!oldPages.length) {
67
- promise = fetchPage([], options.defaultPageParam);
65
+ result = await fetchPage(empty, options.defaultPageParam);
68
66
  }
69
67
 
70
68
  // fetch next / previous page?
71
69
  else if (direction) {
72
70
  const previous = direction === 'backward';
73
- const param = previous ? getPreviousPageParam(options, oldPages) : getNextPageParam(options, oldPages);
74
- 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);
75
78
  }
76
79
 
77
80
  // Refetch pages
78
81
  else {
79
- newPageParams = [];
80
-
81
82
  // Fetch first page
82
- promise = fetchPage([], oldPageParams[0]);
83
+ result = await fetchPage(empty, oldPageParams[0]);
83
84
 
84
85
  // Fetch remaining pages
85
86
  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
- });
87
+ const param = getNextPageParam(options, result);
88
+ result = await fetchPage(result, param);
90
89
  }
91
90
  }
92
- const finalPromise = promise.then(pages => ({
93
- pages,
94
- pageParams: newPageParams
95
- }));
96
- return finalPromise;
91
+ return result;
97
92
  };
98
93
  }
99
94
  };
100
95
  }
101
- function getNextPageParam(options, pages) {
102
- 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);
103
102
  }
104
- function getPreviousPageParam(options, pages) {
105
- return options.getPreviousPageParam?.(pages[0], pages);
103
+ function getPreviousPageParam(options, {
104
+ pages,
105
+ pageParams
106
+ }) {
107
+ return options.getPreviousPageParam?.(pages[0], pages, pageParams[0], pageParams);
106
108
  }
107
109
 
108
110
  /**
109
111
  * Checks if there is a next page.
110
112
  */
111
- function hasNextPage(options, pages) {
112
- if (!pages) return false;
113
- return typeof getNextPageParam(options, pages) !== 'undefined';
113
+ function hasNextPage(options, data) {
114
+ if (!data) return false;
115
+ return typeof getNextPageParam(options, data) !== 'undefined';
114
116
  }
115
117
 
116
118
  /**
117
119
  * Checks if there is a previous page.
118
120
  */
119
- function hasPreviousPage(options, pages) {
120
- if (!pages || !options.getPreviousPageParam) return false;
121
- 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';
122
124
  }
123
125
 
124
126
  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 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,25 +31,14 @@ 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,
@@ -54,69 +46,79 @@ function infiniteQueryBehavior() {
54
46
  meta: context.options.meta
55
47
  };
56
48
  addSignalProperty(queryFnContext);
57
- const queryFnResult = queryFn(queryFnContext);
58
- const promise = Promise.resolve(queryFnResult).then(page => buildNewPages(pages, param, page, previous));
59
- return promise;
49
+ const page = await queryFn(queryFnContext);
50
+ const {
51
+ maxPages
52
+ } = context.options;
53
+ const addTo = previous ? addToStart : addToEnd;
54
+ return {
55
+ pages: addTo(data.pages, page, maxPages),
56
+ pageParams: addTo(data.pageParams, param, maxPages)
57
+ };
60
58
  };
61
- let promise;
59
+ let result;
62
60
 
63
61
  // Fetch first page?
64
62
  if (!oldPages.length) {
65
- promise = fetchPage([], options.defaultPageParam);
63
+ result = await fetchPage(empty, options.defaultPageParam);
66
64
  }
67
65
 
68
66
  // fetch next / previous page?
69
67
  else if (direction) {
70
68
  const previous = direction === 'backward';
71
- const param = previous ? getPreviousPageParam(options, oldPages) : getNextPageParam(options, oldPages);
72
- promise = fetchPage(oldPages, param, previous);
69
+ const pageParamFn = previous ? getPreviousPageParam : getNextPageParam;
70
+ const oldData = {
71
+ pages: oldPages,
72
+ pageParams: oldPageParams
73
+ };
74
+ const param = pageParamFn(options, oldData);
75
+ result = await fetchPage(oldData, param, previous);
73
76
  }
74
77
 
75
78
  // Refetch pages
76
79
  else {
77
- newPageParams = [];
78
-
79
80
  // Fetch first page
80
- promise = fetchPage([], oldPageParams[0]);
81
+ result = await fetchPage(empty, oldPageParams[0]);
81
82
 
82
83
  // Fetch remaining pages
83
84
  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
- });
85
+ const param = getNextPageParam(options, result);
86
+ result = await fetchPage(result, param);
88
87
  }
89
88
  }
90
- const finalPromise = promise.then(pages => ({
91
- pages,
92
- pageParams: newPageParams
93
- }));
94
- return finalPromise;
89
+ return result;
95
90
  };
96
91
  }
97
92
  };
98
93
  }
99
- function getNextPageParam(options, pages) {
100
- return options.getNextPageParam(pages[pages.length - 1], pages);
94
+ function getNextPageParam(options, {
95
+ pages,
96
+ pageParams
97
+ }) {
98
+ const lastIndex = pages.length - 1;
99
+ return options.getNextPageParam(pages[lastIndex], pages, pageParams[lastIndex], pageParams);
101
100
  }
102
- function getPreviousPageParam(options, pages) {
103
- return options.getPreviousPageParam?.(pages[0], pages);
101
+ function getPreviousPageParam(options, {
102
+ pages,
103
+ pageParams
104
+ }) {
105
+ return options.getPreviousPageParam?.(pages[0], pages, pageParams[0], pageParams);
104
106
  }
105
107
 
106
108
  /**
107
109
  * Checks if there is a next page.
108
110
  */
109
- function hasNextPage(options, pages) {
110
- if (!pages) return false;
111
- return typeof getNextPageParam(options, pages) !== 'undefined';
111
+ function hasNextPage(options, data) {
112
+ if (!data) return false;
113
+ return typeof getNextPageParam(options, data) !== 'undefined';
112
114
  }
113
115
 
114
116
  /**
115
117
  * Checks if there is a previous page.
116
118
  */
117
- function hasPreviousPage(options, pages) {
118
- if (!pages || !options.getPreviousPageParam) return false;
119
- return typeof getPreviousPageParam(options, pages) !== 'undefined';
119
+ function hasPreviousPage(options, data) {
120
+ if (!data || !options.getPreviousPageParam) return false;
121
+ return typeof getPreviousPageParam(options, data) !== 'undefined';
120
122
  }
121
123
 
122
124
  export { hasNextPage, hasPreviousPage, infiniteQueryBehavior };