@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.
- package/build/lib/infiniteQueryBehavior.d.ts +2 -2
- package/build/lib/infiniteQueryBehavior.esm.js +47 -45
- package/build/lib/infiniteQueryBehavior.esm.js.map +1 -1
- package/build/lib/infiniteQueryBehavior.js +47 -45
- package/build/lib/infiniteQueryBehavior.js.map +1 -1
- package/build/lib/infiniteQueryBehavior.mjs +47 -45
- package/build/lib/infiniteQueryBehavior.mjs.map +1 -1
- package/build/lib/infiniteQueryObserver.d.ts +6 -6
- package/build/lib/infiniteQueryObserver.esm.js +4 -6
- package/build/lib/infiniteQueryObserver.esm.js.map +1 -1
- package/build/lib/infiniteQueryObserver.js +4 -6
- package/build/lib/infiniteQueryObserver.js.map +1 -1
- package/build/lib/infiniteQueryObserver.mjs +4 -6
- package/build/lib/infiniteQueryObserver.mjs.map +1 -1
- package/build/lib/mutation.d.ts +2 -1
- package/build/lib/mutation.esm.js +10 -2
- package/build/lib/mutation.esm.js.map +1 -1
- package/build/lib/mutation.js +10 -2
- package/build/lib/mutation.js.map +1 -1
- package/build/lib/mutation.mjs +10 -2
- package/build/lib/mutation.mjs.map +1 -1
- package/build/lib/mutationCache.d.ts +2 -2
- package/build/lib/mutationCache.esm.js.map +1 -1
- package/build/lib/mutationCache.js.map +1 -1
- package/build/lib/mutationCache.mjs.map +1 -1
- package/build/lib/mutationObserver.esm.js +1 -0
- package/build/lib/mutationObserver.esm.js.map +1 -1
- package/build/lib/mutationObserver.js +1 -0
- package/build/lib/mutationObserver.js.map +1 -1
- package/build/lib/mutationObserver.mjs +1 -0
- package/build/lib/mutationObserver.mjs.map +1 -1
- package/build/lib/query.esm.js.map +1 -1
- package/build/lib/query.js.map +1 -1
- package/build/lib/query.mjs.map +1 -1
- package/build/lib/queryCache.d.ts +2 -2
- package/build/lib/queryCache.esm.js.map +1 -1
- package/build/lib/queryCache.js.map +1 -1
- package/build/lib/queryCache.mjs.map +1 -1
- package/build/lib/tests/utils.d.ts +4 -5
- package/build/lib/types.d.ts +3 -3
- package/build/umd/index.development.js +62 -53
- package/build/umd/index.development.js.map +1 -1
- package/build/umd/index.production.js +1 -1
- package/build/umd/index.production.js.map +1 -1
- package/package.json +2 -2
- package/src/infiniteQueryBehavior.ts +51 -60
- package/src/infiniteQueryObserver.ts +15 -10
- package/src/mutation.ts +14 -5
- package/src/mutationCache.ts +2 -2
- package/src/mutationObserver.ts +1 -0
- package/src/query.ts +7 -4
- package/src/queryCache.ts +5 -2
- package/src/tests/focusManager.test.tsx +12 -14
- package/src/tests/hydration.test.tsx +15 -14
- package/src/tests/infiniteQueryBehavior.test.tsx +7 -9
- package/src/tests/infiniteQueryObserver.test.tsx +62 -1
- package/src/tests/mutationCache.test.tsx +11 -10
- package/src/tests/mutationObserver.test.tsx +3 -2
- package/src/tests/mutations.test.tsx +41 -9
- package/src/tests/notifyManager.test.tsx +7 -6
- package/src/tests/onlineManager.test.tsx +12 -17
- package/src/tests/queriesObserver.test.tsx +18 -17
- package/src/tests/query.test.tsx +18 -17
- package/src/tests/queryCache.test.tsx +14 -13
- package/src/tests/queryClient.test.tsx +49 -48
- package/src/tests/queryObserver.test.tsx +10 -9
- package/src/tests/utils.test.tsx +2 -1
- package/src/tests/utils.ts +5 -4
- 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>,
|
|
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>,
|
|
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
|
-
|
|
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 = (
|
|
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(
|
|
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
|
|
58
|
-
const
|
|
59
|
-
|
|
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
|
|
59
|
+
let result;
|
|
62
60
|
|
|
63
61
|
// Fetch first page?
|
|
64
62
|
if (!oldPages.length) {
|
|
65
|
-
|
|
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
|
|
72
|
-
|
|
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
|
-
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
return fetchPage(pages, param);
|
|
87
|
-
});
|
|
85
|
+
const param = getNextPageParam(options, result);
|
|
86
|
+
result = await fetchPage(result, param);
|
|
88
87
|
}
|
|
89
88
|
}
|
|
90
|
-
|
|
91
|
-
pages,
|
|
92
|
-
pageParams: newPageParams
|
|
93
|
-
}));
|
|
94
|
-
return finalPromise;
|
|
89
|
+
return result;
|
|
95
90
|
};
|
|
96
91
|
}
|
|
97
92
|
};
|
|
98
93
|
}
|
|
99
|
-
function getNextPageParam(options,
|
|
100
|
-
|
|
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,
|
|
103
|
-
|
|
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,
|
|
110
|
-
if (!
|
|
111
|
-
return typeof getNextPageParam(options,
|
|
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,
|
|
118
|
-
if (!
|
|
119
|
-
return typeof getPreviousPageParam(options,
|
|
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
|
|
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
|
-
|
|
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 = (
|
|
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(
|
|
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
|
|
60
|
-
const
|
|
61
|
-
|
|
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
|
|
61
|
+
let result;
|
|
64
62
|
|
|
65
63
|
// Fetch first page?
|
|
66
64
|
if (!oldPages.length) {
|
|
67
|
-
|
|
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
|
|
74
|
-
|
|
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
|
-
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
return fetchPage(pages, param);
|
|
89
|
-
});
|
|
87
|
+
const param = getNextPageParam(options, result);
|
|
88
|
+
result = await fetchPage(result, param);
|
|
90
89
|
}
|
|
91
90
|
}
|
|
92
|
-
|
|
93
|
-
pages,
|
|
94
|
-
pageParams: newPageParams
|
|
95
|
-
}));
|
|
96
|
-
return finalPromise;
|
|
91
|
+
return result;
|
|
97
92
|
};
|
|
98
93
|
}
|
|
99
94
|
};
|
|
100
95
|
}
|
|
101
|
-
function getNextPageParam(options,
|
|
102
|
-
|
|
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,
|
|
105
|
-
|
|
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,
|
|
112
|
-
if (!
|
|
113
|
-
return typeof getNextPageParam(options,
|
|
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,
|
|
120
|
-
if (!
|
|
121
|
-
return typeof getPreviousPageParam(options,
|
|
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
|
|
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
|
-
|
|
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 = (
|
|
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(
|
|
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
|
|
58
|
-
const
|
|
59
|
-
|
|
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
|
|
59
|
+
let result;
|
|
62
60
|
|
|
63
61
|
// Fetch first page?
|
|
64
62
|
if (!oldPages.length) {
|
|
65
|
-
|
|
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
|
|
72
|
-
|
|
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
|
-
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
return fetchPage(pages, param);
|
|
87
|
-
});
|
|
85
|
+
const param = getNextPageParam(options, result);
|
|
86
|
+
result = await fetchPage(result, param);
|
|
88
87
|
}
|
|
89
88
|
}
|
|
90
|
-
|
|
91
|
-
pages,
|
|
92
|
-
pageParams: newPageParams
|
|
93
|
-
}));
|
|
94
|
-
return finalPromise;
|
|
89
|
+
return result;
|
|
95
90
|
};
|
|
96
91
|
}
|
|
97
92
|
};
|
|
98
93
|
}
|
|
99
|
-
function getNextPageParam(options,
|
|
100
|
-
|
|
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,
|
|
103
|
-
|
|
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,
|
|
110
|
-
if (!
|
|
111
|
-
return typeof getNextPageParam(options,
|
|
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,
|
|
118
|
-
if (!
|
|
119
|
-
return typeof getPreviousPageParam(options,
|
|
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 };
|