-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy pathpaginate.ts
59 lines (51 loc) · 1.14 KB
/
paginate.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import type { Octokit } from "@octokit/core";
import { iterator } from "./iterator.js";
import type {
MapFunction,
PaginationResults,
RequestParameters,
Route,
RequestInterface,
} from "./types.js";
export function paginate(
octokit: Octokit,
route: Route | RequestInterface,
parameters?: RequestParameters,
mapFn?: MapFunction,
) {
if (typeof parameters === "function") {
mapFn = parameters;
parameters = undefined;
}
return gather(
octokit,
[],
iterator(octokit, route, parameters)[
Symbol.asyncIterator
]() as AsyncIterableIterator<any>,
mapFn,
);
}
function gather(
octokit: Octokit,
results: PaginationResults,
iterator: AsyncIterableIterator<any>,
mapFn?: MapFunction,
): Promise<PaginationResults> {
return iterator.next().then((result) => {
if (result.done) {
return results;
}
let earlyExit = false;
function done() {
earlyExit = true;
}
results = results.concat(
mapFn ? mapFn(result.value, done) : result.value.data,
);
if (earlyExit) {
return results;
}
return gather(octokit, results, iterator, mapFn);
});
}