-
Notifications
You must be signed in to change notification settings - Fork 40
/
Copy patheach-repository.ts
68 lines (61 loc) · 1.9 KB
/
each-repository.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
60
61
62
63
64
65
66
67
68
import { composePaginateRest } from "@octokit/plugin-paginate-rest";
import type { Octokit } from "@octokit/core";
import type { App } from "./index.js";
import type {
EachRepositoryFunction,
EachRepositoryInterface,
EachRepositoryQuery,
} from "./types.js";
export function eachRepositoryFactory(app: App) {
return Object.assign(eachRepository.bind(null, app), {
iterator: eachRepositoryIterator.bind(null, app),
}) as EachRepositoryInterface<Octokit>;
}
export async function eachRepository(
app: App,
queryOrCallback: EachRepositoryQuery | EachRepositoryFunction<Octokit>,
callback?: EachRepositoryFunction<Octokit>,
) {
const i = eachRepositoryIterator(
app,
callback ? (queryOrCallback as EachRepositoryQuery) : undefined,
)[Symbol.asyncIterator]();
let result = await i.next();
while (!result.done) {
if (callback) {
await callback(result.value);
} else {
await (queryOrCallback as EachRepositoryFunction<Octokit>)(result.value);
}
result = await i.next();
}
}
function singleInstallationIterator(app: App, installationId: number) {
return {
async *[Symbol.asyncIterator]() {
yield {
octokit: await app.getInstallationOctokit(installationId),
};
},
};
}
export function eachRepositoryIterator(app: App, query?: EachRepositoryQuery) {
return {
async *[Symbol.asyncIterator]() {
const iterator = query
? singleInstallationIterator(app, query.installationId)
: app.eachInstallation.iterator();
for await (const { octokit } of iterator) {
const repositoriesIterator = composePaginateRest.iterator(
octokit,
"GET /installation/repositories",
);
for await (const { data: repositories } of repositoriesIterator) {
for (const repository of repositories) {
yield { octokit: octokit, repository };
}
}
}
},
};
}