@dereekb/util 13.0.6 → 13.1.0
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/fetch/index.cjs.js +274 -33
- package/fetch/index.esm.js +274 -35
- package/fetch/package.json +2 -2
- package/fetch/src/lib/fetch.file.d.ts +67 -20
- package/fetch/src/lib/fetch.page.iterate.d.ts +277 -49
- package/index.cjs.js +4107 -1516
- package/index.esm.js +4107 -1516
- package/package.json +1 -2
- package/src/lib/array/array.d.ts +92 -47
- package/src/lib/array/array.find.d.ts +14 -18
- package/src/lib/array/array.index.d.ts +43 -14
- package/src/lib/array/array.indexed.d.ts +66 -17
- package/src/lib/array/array.limit.d.ts +11 -0
- package/src/lib/array/array.make.d.ts +9 -3
- package/src/lib/array/array.map.d.ts +20 -8
- package/src/lib/array/array.number.d.ts +63 -5
- package/src/lib/array/array.random.d.ts +12 -9
- package/src/lib/array/array.set.d.ts +24 -1
- package/src/lib/array/array.string.d.ts +104 -0
- package/src/lib/array/array.unique.d.ts +60 -8
- package/src/lib/array/array.value.d.ts +20 -11
- package/src/lib/assertion/assertion.d.ts +30 -2
- package/src/lib/assertion/assertion.generic.d.ts +8 -0
- package/src/lib/assertion/assertion.number.d.ts +16 -0
- package/src/lib/auth/auth.role.claims.d.ts +14 -8
- package/src/lib/boolean.d.ts +54 -1
- package/src/lib/contact/domain.d.ts +22 -4
- package/src/lib/contact/random.d.ts +24 -0
- package/src/lib/date/date.d.ts +8 -13
- package/src/lib/date/hour.d.ts +51 -32
- package/src/lib/date/minute.d.ts +4 -4
- package/src/lib/date/time.d.ts +12 -3
- package/src/lib/date/week.d.ts +77 -10
- package/src/lib/error/error.d.ts +54 -3
- package/src/lib/error/error.server.d.ts +25 -2
- package/src/lib/file/pdf.d.ts +15 -0
- package/src/lib/filter/filter.d.ts +12 -7
- package/src/lib/function/function.boolean.d.ts +4 -4
- package/src/lib/function/function.d.ts +2 -5
- package/src/lib/function/function.forward.d.ts +19 -3
- package/src/lib/getter/getter.cache.d.ts +9 -5
- package/src/lib/getter/getter.d.ts +39 -22
- package/src/lib/getter/getter.map.d.ts +10 -4
- package/src/lib/getter/getter.util.d.ts +3 -3
- package/src/lib/grouping.d.ts +98 -31
- package/src/lib/hash.d.ts +15 -8
- package/src/lib/iterable/iterable.d.ts +62 -50
- package/src/lib/iterable/iterable.map.d.ts +4 -4
- package/src/lib/iterate.d.ts +17 -1
- package/src/lib/key.d.ts +32 -10
- package/src/lib/lifecycle.d.ts +10 -1
- package/src/lib/map/map.d.ts +17 -16
- package/src/lib/map/map.intersection.d.ts +5 -4
- package/src/lib/map/map.key.d.ts +16 -15
- package/src/lib/misc/host.d.ts +6 -3
- package/src/lib/model/id.batch.d.ts +7 -3
- package/src/lib/model/id.factory.d.ts +16 -1
- package/src/lib/model/model.conversion.d.ts +49 -6
- package/src/lib/model/model.conversion.field.d.ts +13 -3
- package/src/lib/model/model.copy.d.ts +11 -0
- package/src/lib/model/model.d.ts +174 -1
- package/src/lib/model/model.modify.d.ts +24 -5
- package/src/lib/nodejs/stream.d.ts +8 -6
- package/src/lib/number/bitwise.dencoder.d.ts +43 -3
- package/src/lib/number/bound.d.ts +34 -5
- package/src/lib/number/dollar.d.ts +13 -6
- package/src/lib/number/factory.d.ts +11 -3
- package/src/lib/number/number.d.ts +55 -32
- package/src/lib/number/random.d.ts +13 -3
- package/src/lib/number/round.d.ts +47 -26
- package/src/lib/number/sort.d.ts +7 -1
- package/src/lib/number/transform.d.ts +16 -0
- package/src/lib/object/object.array.d.ts +16 -2
- package/src/lib/object/object.array.delta.d.ts +6 -2
- package/src/lib/object/object.d.ts +33 -5
- package/src/lib/object/object.empty.d.ts +4 -2
- package/src/lib/object/object.equal.d.ts +21 -4
- package/src/lib/object/object.filter.tuple.d.ts +105 -3
- package/src/lib/object/object.key.d.ts +13 -6
- package/src/lib/object/object.map.d.ts +30 -19
- package/src/lib/page/page.d.ts +21 -0
- package/src/lib/page/page.filter.d.ts +16 -9
- package/src/lib/path/path.d.ts +101 -14
- package/src/lib/path/path.tree.d.ts +16 -0
- package/src/lib/promise/callback.d.ts +18 -0
- package/src/lib/promise/is.d.ts +10 -3
- package/src/lib/promise/map.d.ts +5 -3
- package/src/lib/promise/poll.d.ts +14 -4
- package/src/lib/promise/promise.d.ts +84 -18
- package/src/lib/promise/promise.factory.d.ts +18 -2
- package/src/lib/promise/promise.limit.d.ts +22 -2
- package/src/lib/promise/promise.loop.d.ts +69 -1
- package/src/lib/promise/promise.ref.d.ts +14 -2
- package/src/lib/promise/promise.task.d.ts +8 -4
- package/src/lib/promise/promise.type.d.ts +4 -4
- package/src/lib/promise/use.d.ts +6 -4
- package/src/lib/promise/wait.d.ts +5 -2
- package/src/lib/relation/relation.d.ts +98 -0
- package/src/lib/service/handler.config.d.ts +47 -9
- package/src/lib/service/handler.d.ts +43 -1
- package/src/lib/service/typed.service.d.ts +21 -2
- package/src/lib/set/set.allowed.d.ts +6 -4
- package/src/lib/set/set.d.ts +174 -46
- package/src/lib/set/set.decision.d.ts +4 -2
- package/src/lib/set/set.delta.d.ts +16 -3
- package/src/lib/set/set.hashset.d.ts +43 -0
- package/src/lib/set/set.selection.d.ts +7 -3
- package/src/lib/sort.d.ts +36 -16
- package/src/lib/string/char.d.ts +48 -34
- package/src/lib/string/dencoder.d.ts +84 -13
- package/src/lib/string/factory.d.ts +13 -4
- package/src/lib/string/html.d.ts +7 -6
- package/src/lib/string/mimetype.d.ts +65 -1
- package/src/lib/string/prefix.d.ts +21 -7
- package/src/lib/string/record.d.ts +7 -4
- package/src/lib/string/replace.d.ts +77 -33
- package/src/lib/string/search.d.ts +19 -9
- package/src/lib/string/sort.d.ts +10 -1
- package/src/lib/string/string.d.ts +74 -21
- package/src/lib/string/transform.d.ts +7 -0
- package/src/lib/string/tree.d.ts +91 -29
- package/src/lib/string/url.d.ts +148 -63
- package/src/lib/tree/tree.explore.d.ts +84 -17
- package/src/lib/tree/tree.flatten.d.ts +44 -7
- package/src/lib/type.d.ts +15 -12
- package/src/lib/value/address.d.ts +66 -17
- package/src/lib/value/bound.d.ts +253 -17
- package/src/lib/value/build.d.ts +30 -5
- package/src/lib/value/comparator.d.ts +53 -25
- package/src/lib/value/cron.d.ts +14 -6
- package/src/lib/value/decision.d.ts +57 -13
- package/src/lib/value/equal.d.ts +44 -13
- package/src/lib/value/indexed.d.ts +253 -82
- package/src/lib/value/label.d.ts +16 -5
- package/src/lib/value/map.d.ts +77 -20
- package/src/lib/value/maybe.d.ts +47 -49
- package/src/lib/value/modifier.d.ts +82 -27
- package/src/lib/value/point.d.ts +248 -54
- package/src/lib/value/url.d.ts +10 -3
- package/src/lib/value/use.d.ts +99 -8
- package/src/lib/value/vector.d.ts +71 -9
- package/test/index.cjs.js +86 -23
- package/test/index.esm.js +86 -23
- package/test/package.json +2 -2
- package/test/src/lib/shared/shared.d.ts +31 -5
- package/test/src/lib/shared/shared.fail.d.ts +72 -9
- package/test/src/lib/shared/shared.function.d.ts +40 -2
- package/test/src/lib/shared/shared.wrap.d.ts +20 -1
|
@@ -1,30 +1,81 @@
|
|
|
1
1
|
import { type DecisionFunction, type IndexNumber, type IndexRef, type Maybe, type Milliseconds, type PromiseOrValue, type PerformAsyncTasksConfig, type PerformAsyncTasksResult } from '@dereekb/util';
|
|
2
2
|
import { type FetchPage, type FetchPageFactory, type FetchPageFactoryInputOptions, type FetchPageResult, type FetchPageResultWithInput } from './fetch.page';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Callback invoked for each individual item fetched across all pages.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
6
|
+
* Receives the item, its global index (cumulative across all pages, not just the current page),
|
|
7
|
+
* and the full page result context. This enables per-item processing with awareness of both
|
|
8
|
+
* the item's position in the overall iteration and the page it originated from.
|
|
9
|
+
*
|
|
10
|
+
* @param item - The individual item extracted from a page result
|
|
11
|
+
* @param i - Global index of this item across all pages visited so far
|
|
12
|
+
* @param fetchPageResult - The page result containing this item, including input and pagination info
|
|
7
13
|
*/
|
|
8
14
|
export type IterateFetchPagesByEachItemFunction<I, O, T, R> = (item: T, i: IndexNumber, fetchPageResult: FetchPageResultWithInput<I, O>) => Promise<R>;
|
|
15
|
+
/**
|
|
16
|
+
* A tuple pairing an item with its global index across all iterated pages.
|
|
17
|
+
*
|
|
18
|
+
* Used internally as the task input for {@link performAsyncTasks}, allowing
|
|
19
|
+
* each item to carry its positional context through parallel/sequential processing.
|
|
20
|
+
*/
|
|
9
21
|
export type IterateFetchPagesByEachItemPair<T> = readonly [T, IndexNumber];
|
|
22
|
+
/**
|
|
23
|
+
* Configuration for {@link iterateFetchPagesByEachItem}.
|
|
24
|
+
*
|
|
25
|
+
* Extends {@link IterateFetchPagesByItemsConfig} but replaces the batch-level `iteratePageItems`
|
|
26
|
+
* with a per-item `iterateEachPageItem` callback. Each item on every page is processed individually,
|
|
27
|
+
* either sequentially (default) or in parallel via `iteratePerformTasksConfig`.
|
|
28
|
+
*/
|
|
10
29
|
export interface IterateFetchPagesByEachItemConfig<I, O, T, R> extends Omit<IterateFetchPagesByItemsConfig<I, O, T, IterateFetchPagesByEachItemResult<T, R>>, 'iteratePageItems'> {
|
|
11
30
|
/**
|
|
12
|
-
*
|
|
31
|
+
* Callback invoked once per item on each fetched page.
|
|
32
|
+
*
|
|
33
|
+
* Items are processed via {@link performAsyncTasks} — sequentially by default,
|
|
34
|
+
* but configurable to run in parallel via `iteratePerformTasksConfig`.
|
|
13
35
|
*/
|
|
14
36
|
readonly iterateEachPageItem: IterateFetchPagesByEachItemFunction<I, O, T, R>;
|
|
15
37
|
/**
|
|
16
|
-
* Optional
|
|
38
|
+
* Optional configuration passed to {@link performAsyncTasks} controlling
|
|
39
|
+
* how items within a single page are processed.
|
|
17
40
|
*
|
|
18
|
-
* By default, sequential is true.
|
|
41
|
+
* By default, `sequential` is true, meaning items are processed one at a time.
|
|
42
|
+
* Override to enable parallel processing, set concurrency limits, or configure retry behavior.
|
|
19
43
|
*/
|
|
20
44
|
readonly iteratePerformTasksConfig?: Partial<PerformAsyncTasksConfig<IterateFetchPagesByEachItemPair<T>>>;
|
|
21
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Result of {@link iterateFetchPagesByEachItem}, containing success/failure details
|
|
48
|
+
* for each individually processed item.
|
|
49
|
+
*
|
|
50
|
+
* Wraps {@link PerformAsyncTasksResult} with item-index pairs, providing access to
|
|
51
|
+
* which items succeeded, failed, and their corresponding results or errors.
|
|
52
|
+
*/
|
|
22
53
|
export type IterateFetchPagesByEachItemResult<T, R> = PerformAsyncTasksResult<IterateFetchPagesByEachItemPair<T>, R>;
|
|
23
54
|
/**
|
|
24
|
-
* Iterates through
|
|
55
|
+
* Iterates through all pages of a paginated fetch and processes each item individually.
|
|
56
|
+
*
|
|
57
|
+
* Built on top of {@link iterateFetchPagesByItems}, this function handles per-item granularity
|
|
58
|
+
* by extracting items from each page and delegating to {@link performAsyncTasks}. Items are
|
|
59
|
+
* processed sequentially by default to preserve ordering guarantees, but can be parallelized
|
|
60
|
+
* via `iteratePerformTasksConfig`.
|
|
61
|
+
*
|
|
62
|
+
* Each item's callback receives a global index that reflects its position across all pages,
|
|
63
|
+
* not just within the current page.
|
|
64
|
+
*
|
|
65
|
+
* @param config - Configuration specifying the fetch page source, item extraction, and per-item callback
|
|
66
|
+
* @returns Combined result from {@link iterateFetchPagesByItems} including page/item counts and per-item task results
|
|
25
67
|
*
|
|
26
|
-
* @
|
|
27
|
-
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* const result = await iterateFetchPagesByEachItem({
|
|
71
|
+
* fetchPageFactory: myPageFactory,
|
|
72
|
+
* input: { query: 'active' },
|
|
73
|
+
* readItemsFromPageResult: (r) => r.result.items,
|
|
74
|
+
* iterateEachPageItem: async (item, index, pageResult) => {
|
|
75
|
+
* return processItem(item);
|
|
76
|
+
* }
|
|
77
|
+
* });
|
|
78
|
+
* ```
|
|
28
79
|
*/
|
|
29
80
|
export declare function iterateFetchPagesByEachItem<I, O, T, R>(config: IterateFetchPagesByEachItemConfig<I, O, T, R>): Promise<{
|
|
30
81
|
totalItemsLoaded: number;
|
|
@@ -33,59 +84,127 @@ export declare function iterateFetchPagesByEachItem<I, O, T, R>(config: IterateF
|
|
|
33
84
|
totalPagesLimitReached: boolean;
|
|
34
85
|
}>;
|
|
35
86
|
/**
|
|
36
|
-
*
|
|
87
|
+
* Filters items extracted from a page result before they are passed to the iteration callback.
|
|
37
88
|
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
89
|
+
* Receives all items from a single page along with the page result context.
|
|
90
|
+
* Filtered-out items do not count toward `iterateItemsLimit` but the filtering
|
|
91
|
+
* does not affect pagination continuation — pages continue to be fetched regardless
|
|
92
|
+
* of how many items pass the filter.
|
|
93
|
+
*
|
|
94
|
+
* @param items - All items extracted from the current page
|
|
95
|
+
* @param pageResult - The full page result including input and pagination metadata
|
|
96
|
+
* @returns The filtered subset of items to process, or a promise resolving to it
|
|
40
97
|
*/
|
|
41
98
|
export type IterateFetchPagesByItemsFilterFunction<I, O, T> = (items: T[], pageResult: FetchPageResultWithInput<I, O>) => PromiseOrValue<T[]>;
|
|
99
|
+
/**
|
|
100
|
+
* Callback invoked with all (optionally filtered) items from a single fetched page.
|
|
101
|
+
*
|
|
102
|
+
* Unlike {@link IterateFetchPagesByEachItemFunction} which operates per-item, this receives
|
|
103
|
+
* the entire batch of items for a page, enabling bulk processing strategies.
|
|
104
|
+
*
|
|
105
|
+
* @param items - Items from the current page (after filtering, if configured)
|
|
106
|
+
* @param fetchPageResult - The page result with input and pagination context
|
|
107
|
+
* @param totalItemsVisited - Running total of items visited across all previous pages (before this batch)
|
|
108
|
+
*/
|
|
42
109
|
export type IterateFetchPagesByItemsFunction<I, O, T, R> = (items: T[], fetchPageResult: FetchPageResultWithInput<I, O>, totalItemsVisited: number) => Promise<R>;
|
|
110
|
+
/**
|
|
111
|
+
* Configuration for {@link iterateFetchPagesByItems}.
|
|
112
|
+
*
|
|
113
|
+
* Extends page-level iteration with item extraction, filtering, and item-count-based
|
|
114
|
+
* termination. Pages are fetched via a {@link FetchPage} or {@link FetchPageFactory},
|
|
115
|
+
* items are extracted from each page result, optionally filtered, then passed to
|
|
116
|
+
* `iteratePageItems` as a batch.
|
|
117
|
+
*
|
|
118
|
+
* Supports two independent limits: `loadItemLimit` caps the total raw items loaded
|
|
119
|
+
* from the API, while `iterateItemsLimit` caps items that pass filtering.
|
|
120
|
+
*/
|
|
43
121
|
export interface IterateFetchPagesByItemsConfig<I, O, T, R> extends Omit<IterateFetchPagesConfig<I, O, R>, 'iteratePage'> {
|
|
44
122
|
/**
|
|
45
|
-
*
|
|
123
|
+
* Extracts typed items from a raw page result.
|
|
46
124
|
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
125
|
+
* Called once per page to transform the API response into the items
|
|
126
|
+
* that will be filtered and iterated over.
|
|
127
|
+
*
|
|
128
|
+
* @param results - The raw page result from the fetch
|
|
129
|
+
* @returns Array of items extracted from this page
|
|
49
130
|
*/
|
|
50
131
|
readItemsFromPageResult(results: FetchPageResult<O>): T[];
|
|
51
132
|
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
* If items are filtered out, they do not count towards the visit total.
|
|
133
|
+
* Maximum number of items allowed to be visited (post-filter) across all pages.
|
|
55
134
|
*
|
|
56
|
-
*
|
|
135
|
+
* Items that are filtered out by `filterPageItems` do not count toward this limit.
|
|
136
|
+
* Iteration ends after the page where this limit is reached; items on that final
|
|
137
|
+
* page are still fully processed.
|
|
57
138
|
*/
|
|
58
139
|
readonly iterateItemsLimit?: Maybe<number>;
|
|
59
140
|
/**
|
|
60
|
-
*
|
|
141
|
+
* Maximum number of raw items allowed to be loaded (pre-filter) across all pages.
|
|
61
142
|
*
|
|
62
|
-
*
|
|
143
|
+
* Counts all items returned by `readItemsFromPageResult`, regardless of filtering.
|
|
144
|
+
* Iteration ends after the page where this limit is reached.
|
|
63
145
|
*/
|
|
64
146
|
readonly loadItemLimit?: Maybe<number>;
|
|
65
147
|
/**
|
|
66
|
-
*
|
|
148
|
+
* Optional filter applied to items on each page before they reach `iteratePageItems`.
|
|
67
149
|
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
150
|
+
* Filtered-out items are excluded from processing and do not count toward `iterateItemsLimit`,
|
|
151
|
+
* but filtering does not affect pagination — the next page is still fetched based on the
|
|
152
|
+
* original (unfiltered) page result. If all items on a page are filtered out, iteration
|
|
153
|
+
* continues using the last item for cursor positioning.
|
|
70
154
|
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
155
|
+
* Use `endEarly` or `handleRepeatCursor` to handle cases where filtering causes
|
|
156
|
+
* repeated cursors or unwanted looping.
|
|
73
157
|
*/
|
|
74
158
|
readonly filterPageItems?: IterateFetchPagesByItemsFilterFunction<I, O, T>;
|
|
75
159
|
/**
|
|
76
|
-
*
|
|
160
|
+
* Callback invoked with the batch of items (post-filter) from each page.
|
|
161
|
+
*
|
|
162
|
+
* Receives the filtered items, the page result context, and the running count
|
|
163
|
+
* of total items visited before this page.
|
|
77
164
|
*/
|
|
78
165
|
readonly iteratePageItems: IterateFetchPagesByItemsFunction<I, O, T, R>;
|
|
79
166
|
}
|
|
167
|
+
/**
|
|
168
|
+
* Result of {@link iterateFetchPagesByItems}, extending page-level results
|
|
169
|
+
* with item-level counters.
|
|
170
|
+
*/
|
|
80
171
|
export interface IterateFetchPagesByItemsResult<I, O, T, R> extends IterateFetchPagesResult {
|
|
172
|
+
/**
|
|
173
|
+
* Total number of raw items loaded from all pages (pre-filter).
|
|
174
|
+
*/
|
|
81
175
|
readonly totalItemsLoaded: number;
|
|
176
|
+
/**
|
|
177
|
+
* Total number of items visited across all pages (post-filter).
|
|
178
|
+
*/
|
|
82
179
|
readonly totalItemsVisited: number;
|
|
83
180
|
}
|
|
84
181
|
/**
|
|
85
|
-
* Iterates through
|
|
182
|
+
* Iterates through paginated fetch results at the item batch level.
|
|
86
183
|
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
184
|
+
* Fetches pages sequentially (or in parallel via `maxParallelPages`), extracts items
|
|
185
|
+
* from each page using `readItemsFromPageResult`, optionally filters them, then
|
|
186
|
+
* passes the batch to `iteratePageItems`. Tracks both raw loaded counts and
|
|
187
|
+
* post-filter visited counts, terminating when either limit is reached or pages
|
|
188
|
+
* are exhausted.
|
|
189
|
+
*
|
|
190
|
+
* For per-item processing instead of batch processing, use {@link iterateFetchPagesByEachItem}.
|
|
191
|
+
*
|
|
192
|
+
* @param config - Configuration specifying fetch source, item extraction, filtering, limits, and batch callback
|
|
193
|
+
* @returns Result with page count and item counters (loaded and visited)
|
|
194
|
+
*
|
|
195
|
+
* @example
|
|
196
|
+
* ```typescript
|
|
197
|
+
* const result = await iterateFetchPagesByItems({
|
|
198
|
+
* fetchPageFactory: myPageFactory,
|
|
199
|
+
* input: { status: 'active' },
|
|
200
|
+
* readItemsFromPageResult: (r) => r.result.records,
|
|
201
|
+
* filterPageItems: (items) => items.filter(x => x.isValid),
|
|
202
|
+
* iterateItemsLimit: 500,
|
|
203
|
+
* iteratePageItems: async (items, pageResult, totalVisited) => {
|
|
204
|
+
* await bulkInsert(items);
|
|
205
|
+
* }
|
|
206
|
+
* });
|
|
207
|
+
* ```
|
|
89
208
|
*/
|
|
90
209
|
export declare function iterateFetchPagesByItems<I, O, T, R>(config: IterateFetchPagesByItemsConfig<I, O, T, R>): Promise<{
|
|
91
210
|
totalItemsLoaded: number;
|
|
@@ -93,81 +212,190 @@ export declare function iterateFetchPagesByItems<I, O, T, R>(config: IterateFetc
|
|
|
93
212
|
totalPages: number;
|
|
94
213
|
totalPagesLimitReached: boolean;
|
|
95
214
|
}>;
|
|
215
|
+
/**
|
|
216
|
+
* Union type for {@link iterateFetchPages} configuration.
|
|
217
|
+
*
|
|
218
|
+
* Accepts either a factory-based config (providing `input` + `fetchPageFactory` to create
|
|
219
|
+
* the {@link FetchPage} on demand) or an instance-based config (providing a pre-created
|
|
220
|
+
* `fetchPage` directly). This flexibility supports both lazy and eager page initialization.
|
|
221
|
+
*/
|
|
96
222
|
export type IterateFetchPagesConfig<I, O, R> = IterateFetchPagesConfigWithFactoryAndInput<I, O, R> | IterateFetchPagesConfigWithFetchPageInstance<I, O, R>;
|
|
223
|
+
/**
|
|
224
|
+
* Configuration variant that creates a {@link FetchPage} from a factory and input.
|
|
225
|
+
*
|
|
226
|
+
* Use this when you have a reusable {@link FetchPageFactory} and want the iterator
|
|
227
|
+
* to handle page instantiation. The factory receives the input along with any
|
|
228
|
+
* `maxPage`/`maxItemsPerPage` options from {@link FetchPageFactoryInputOptions}.
|
|
229
|
+
*/
|
|
97
230
|
export interface IterateFetchPagesConfigWithFactoryAndInput<I, O, R> extends BaseIterateFetchPagesConfig<I, O, R> {
|
|
98
231
|
/**
|
|
99
|
-
*
|
|
232
|
+
* The query/filter input passed to the fetch page factory to initialize pagination.
|
|
100
233
|
*/
|
|
101
234
|
readonly input: I;
|
|
235
|
+
/**
|
|
236
|
+
* Factory that creates a {@link FetchPage} from the given input and options.
|
|
237
|
+
*/
|
|
102
238
|
readonly fetchPageFactory: FetchPageFactory<I, O>;
|
|
103
239
|
}
|
|
240
|
+
/**
|
|
241
|
+
* Configuration variant that uses a pre-created {@link FetchPage} instance directly.
|
|
242
|
+
*
|
|
243
|
+
* Use this when you already have a configured {@link FetchPage} and don't need
|
|
244
|
+
* the iterator to create one via a factory.
|
|
245
|
+
*/
|
|
104
246
|
export interface IterateFetchPagesConfigWithFetchPageInstance<I, O, R> extends BaseIterateFetchPagesConfig<I, O, R> {
|
|
247
|
+
/**
|
|
248
|
+
* Pre-created fetch page instance to iterate through.
|
|
249
|
+
*/
|
|
105
250
|
readonly fetchPage: FetchPage<I, O>;
|
|
106
251
|
}
|
|
252
|
+
/**
|
|
253
|
+
* Base configuration shared by all {@link iterateFetchPages} config variants.
|
|
254
|
+
*
|
|
255
|
+
* Provides the core iteration hooks (`iteratePage`, `usePageResult`, `endEarly`),
|
|
256
|
+
* concurrency controls (`maxParallelPages`, `waitBetweenPages`), and pagination
|
|
257
|
+
* limits inherited from {@link FetchPageFactoryInputOptions}.
|
|
258
|
+
*/
|
|
107
259
|
export interface BaseIterateFetchPagesConfig<I, O, R> extends FetchPageFactoryInputOptions {
|
|
108
260
|
/**
|
|
109
|
-
*
|
|
261
|
+
* Optional input for the page fetch. Required when using `fetchPageFactory`,
|
|
262
|
+
* ignored when using a pre-created `fetchPage`.
|
|
110
263
|
*/
|
|
111
264
|
readonly input?: I;
|
|
265
|
+
/**
|
|
266
|
+
* Optional factory for creating the {@link FetchPage}. Mutually exclusive
|
|
267
|
+
* with `fetchPage` — provide one or the other.
|
|
268
|
+
*/
|
|
112
269
|
readonly fetchPageFactory?: FetchPageFactory<I, O>;
|
|
270
|
+
/**
|
|
271
|
+
* Optional pre-created {@link FetchPage} instance. Mutually exclusive
|
|
272
|
+
* with `fetchPageFactory` + `input`.
|
|
273
|
+
*/
|
|
113
274
|
readonly fetchPage?: FetchPage<I, O>;
|
|
114
275
|
/**
|
|
115
|
-
*
|
|
276
|
+
* Maximum number of pages to process concurrently.
|
|
116
277
|
*
|
|
117
|
-
*
|
|
278
|
+
* Defaults to 1 (serial execution). When set higher, pages are fetched
|
|
279
|
+
* and processed in parallel using {@link performTasksFromFactoryInParallelFunction}.
|
|
280
|
+
* Note that page *fetching* is always sequential (each page depends on the
|
|
281
|
+
* previous page's cursor), but page *processing* via `iteratePage` can overlap.
|
|
118
282
|
*/
|
|
119
283
|
readonly maxParallelPages?: number;
|
|
120
284
|
/**
|
|
121
|
-
*
|
|
285
|
+
* Minimum delay in milliseconds between initiating consecutive page fetches.
|
|
122
286
|
*
|
|
123
|
-
*
|
|
287
|
+
* Useful for rate limiting API calls. When running in parallel, this ensures
|
|
288
|
+
* at least this much time passes between starting each new page request.
|
|
124
289
|
*/
|
|
125
290
|
readonly waitBetweenPages?: Milliseconds;
|
|
126
291
|
/**
|
|
127
|
-
*
|
|
292
|
+
* Core iteration callback invoked once per fetched page.
|
|
293
|
+
*
|
|
294
|
+
* Receives the full page result including the original input and pagination metadata.
|
|
295
|
+
* The return value is captured in the {@link IterateFetchPagesIterationResult} and
|
|
296
|
+
* made available to `usePageResult` and `endEarly`.
|
|
297
|
+
*
|
|
298
|
+
* @param result - The fetched page result with input context
|
|
299
|
+
* @returns The processing result for this page
|
|
128
300
|
*/
|
|
129
301
|
iteratePage(result: FetchPageResultWithInput<I, O>): Promise<R>;
|
|
130
302
|
/**
|
|
131
|
-
*
|
|
303
|
+
* Optional side-effect callback invoked after each page is fully processed.
|
|
304
|
+
*
|
|
305
|
+
* Called after `iteratePage` completes, receiving the full iteration result
|
|
306
|
+
* including the page index, fetch result, and processing result. Useful for
|
|
307
|
+
* logging, progress tracking, or accumulating results externally.
|
|
308
|
+
*
|
|
309
|
+
* @param pageResult - The complete iteration result for this page
|
|
132
310
|
*/
|
|
133
311
|
usePageResult?(pageResult: IterateFetchPagesIterationResult<I, O, R>): PromiseOrValue<void>;
|
|
134
312
|
/**
|
|
135
|
-
*
|
|
313
|
+
* Optional early termination predicate evaluated after each page.
|
|
136
314
|
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
315
|
+
* When this returns `true`, no further pages will be fetched. Any pages
|
|
316
|
+
* already in-flight (when using parallel processing) will still complete.
|
|
317
|
+
* Checked after both `iteratePage` and `usePageResult` have finished.
|
|
318
|
+
*
|
|
319
|
+
* @param pageResult - The complete iteration result for the most recent page
|
|
320
|
+
* @returns `true` to stop iteration after this page
|
|
139
321
|
*/
|
|
140
322
|
endEarly?: DecisionFunction<IterateFetchPagesIterationResult<I, O, R>>;
|
|
141
323
|
}
|
|
324
|
+
/**
|
|
325
|
+
* Intermediate result produced after processing a single page during iteration.
|
|
326
|
+
*
|
|
327
|
+
* Passed to {@link BaseIterateFetchPagesConfig.usePageResult} and
|
|
328
|
+
* {@link BaseIterateFetchPagesConfig.endEarly} to enable post-page logic
|
|
329
|
+
* and conditional termination.
|
|
330
|
+
*/
|
|
142
331
|
export interface IterateFetchPagesIterationResult<I, O, R> extends IndexRef {
|
|
143
|
-
|
|
144
|
-
*
|
|
332
|
+
/**
|
|
333
|
+
* Zero-based page index within this iteration run.
|
|
145
334
|
*/
|
|
146
335
|
readonly i: IndexNumber;
|
|
147
336
|
/**
|
|
148
|
-
* The
|
|
337
|
+
* The raw fetch page result including pagination metadata and the original input.
|
|
149
338
|
*/
|
|
150
339
|
readonly fetchPageResult: FetchPageResultWithInput<I, O>;
|
|
151
340
|
/**
|
|
152
|
-
*
|
|
341
|
+
* Value returned by `iteratePage` for this page.
|
|
153
342
|
*/
|
|
154
343
|
readonly result: R;
|
|
155
344
|
}
|
|
345
|
+
/**
|
|
346
|
+
* Final result returned by {@link iterateFetchPages} after all pages have been processed.
|
|
347
|
+
*/
|
|
156
348
|
export interface IterateFetchPagesResult {
|
|
157
349
|
/**
|
|
158
|
-
*
|
|
350
|
+
* Total number of pages fetched and processed during this iteration.
|
|
159
351
|
*/
|
|
160
352
|
readonly totalPages: number;
|
|
161
353
|
/**
|
|
162
|
-
* Whether
|
|
354
|
+
* Whether iteration stopped because the configured `maxPage` limit was reached,
|
|
355
|
+
* as opposed to running out of pages or an early termination via `endEarly`.
|
|
163
356
|
*/
|
|
164
357
|
readonly totalPagesLimitReached: boolean;
|
|
165
358
|
}
|
|
166
359
|
/**
|
|
167
|
-
*
|
|
360
|
+
* Core pagination iterator that fetches and processes pages from a {@link FetchPage} source.
|
|
361
|
+
*
|
|
362
|
+
* This is the foundational function in the fetch page iteration hierarchy. It drives
|
|
363
|
+
* sequential page fetching (each page depends on the previous page's cursor/state),
|
|
364
|
+
* with optional parallel *processing* of fetched pages via `maxParallelPages`.
|
|
365
|
+
*
|
|
366
|
+
* The iteration loop continues until one of these conditions is met:
|
|
367
|
+
* - No more pages are available (`hasNext` is false)
|
|
368
|
+
* - The `maxPage` limit from {@link FetchPageFactoryInputOptions} is reached
|
|
369
|
+
* - The `endEarly` predicate returns true
|
|
370
|
+
*
|
|
371
|
+
* Higher-level functions {@link iterateFetchPagesByItems} and {@link iterateFetchPagesByEachItem}
|
|
372
|
+
* build on this to add item extraction, filtering, and per-item processing.
|
|
373
|
+
*
|
|
374
|
+
* @param config - Configuration specifying the page source, processing callback, and iteration controls
|
|
375
|
+
* @returns Summary of the iteration including total pages visited and whether the page limit was hit
|
|
376
|
+
*
|
|
377
|
+
* @example
|
|
378
|
+
* ```typescript
|
|
379
|
+
* // Using a factory
|
|
380
|
+
* const result = await iterateFetchPages({
|
|
381
|
+
* input: { query: 'active', pageSize: 50 },
|
|
382
|
+
* fetchPageFactory: myFactory,
|
|
383
|
+
* maxPage: 10,
|
|
384
|
+
* iteratePage: async (pageResult) => {
|
|
385
|
+
* console.log(`Page ${pageResult.page}:`, pageResult.result);
|
|
386
|
+
* return pageResult.result.items.length;
|
|
387
|
+
* },
|
|
388
|
+
* endEarly: ({ result }) => result === 0
|
|
389
|
+
* });
|
|
168
390
|
*
|
|
169
|
-
*
|
|
170
|
-
*
|
|
391
|
+
* // Using a pre-created FetchPage instance
|
|
392
|
+
* const result = await iterateFetchPages({
|
|
393
|
+
* fetchPage: existingFetchPage,
|
|
394
|
+
* iteratePage: async (pageResult) => {
|
|
395
|
+
* await processBatch(pageResult.result);
|
|
396
|
+
* }
|
|
397
|
+
* });
|
|
398
|
+
* ```
|
|
171
399
|
*/
|
|
172
400
|
export declare function iterateFetchPages<I, O, R>(config: IterateFetchPagesConfigWithFactoryAndInput<I, O, R>): Promise<IterateFetchPagesResult>;
|
|
173
401
|
export declare function iterateFetchPages<I, O, R>(config: IterateFetchPagesConfigWithFetchPageInstance<I, O, R>): Promise<IterateFetchPagesResult>;
|