@foss.global/codefeed 2.0.2 → 3.0.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.
@@ -0,0 +1,865 @@
1
+ import * as plugins from './plugins.js';
2
+ import * as transport from './forgeinventory.transport.js';
3
+ import * as validation from './forgeinventory.validation.js';
4
+ import { ForgeRequestClient } from './forgeinventory.client.js';
5
+ import { measureGiteaMirror } from './giteasourceinventory.git.js';
6
+ /** The only limitation: data Gitea exposes to no administrator read and that the migration reissues. */
7
+ export const giteaSourceInventoryLimitations = [
8
+ 'Gitea has no read that lists user-scoped Actions secrets; they are reissued.',
9
+ ];
10
+ const complete = (valueArg) => ({ status: 'complete', value: BigInt(valueArg).toString() });
11
+ const partial = (observedArg, reasonArg) => ({ status: 'partial', observedValue: BigInt(observedArg).toString(), reason: reasonArg });
12
+ const notMeasured = (reasonArg) => ({ status: 'notMeasured', reason: reasonArg });
13
+ const unitDisabled = (unitArg) => notMeasured(`The ${unitArg} unit is disabled; Gitea's API hides its data.`);
14
+ /** The value a measure observed so far. */
15
+ const observed = (measureArg) => measureArg.status === 'complete' ? BigInt(measureArg.value)
16
+ : measureArg.status === 'partial' ? BigInt(measureArg.observedValue) : 0n;
17
+ /**
18
+ * Sums measures: complete only when every addend is, not measured when any
19
+ * addend is, otherwise partial with the observed sum and the first reason.
20
+ */
21
+ const sumMeasures = (measuresArg) => {
22
+ const missing = measuresArg.find((measureArg) => measureArg.status === 'notMeasured');
23
+ if (missing)
24
+ return missing;
25
+ const total = measuresArg.reduce((sumArg, measureArg) => sumArg + observed(measureArg), 0n);
26
+ const unfinished = measuresArg.find((measureArg) => measureArg.status === 'partial');
27
+ return unfinished?.status === 'partial' ? partial(total, unfinished.reason) : complete(total);
28
+ };
29
+ const listingMeasure = (listingArg, valueArg = BigInt(listingArg.items.length)) => listingArg.failure === null ? complete(valueArg) : partial(valueArg, listingArg.failure);
30
+ /** A sanitized failure reason: adapter-owned error codes only, never remote text. */
31
+ const reason = (errorArg) => errorArg instanceof validation.ForgeInventoryError ? errorArg.code : 'unexpected-error';
32
+ const requiredBoolean = (valueArg) => {
33
+ if (typeof valueArg !== 'boolean')
34
+ throw new validation.ForgeInventoryError('invalid-boolean');
35
+ return valueArg;
36
+ };
37
+ const requiredString = (valueArg) => {
38
+ const value = validation.optionalString(valueArg);
39
+ if (value === null)
40
+ throw new validation.ForgeInventoryError('invalid-string');
41
+ return value;
42
+ };
43
+ /** One provider path segment, as an owner or repository name. */
44
+ const segment = (valueArg) => {
45
+ const segments = validation.segments(valueArg);
46
+ if (segments.length !== 1)
47
+ throw new validation.ForgeInventoryError('invalid-path');
48
+ return segments[0];
49
+ };
50
+ const ownerVisibility = (valueArg) => {
51
+ if (valueArg === 'limited')
52
+ return 'internal';
53
+ const visibility = validation.visibility(valueArg);
54
+ if (visibility === null)
55
+ throw new validation.ForgeInventoryError('invalid-visibility');
56
+ return visibility;
57
+ };
58
+ /** Files attached to an issue, pull request, comment or release, with their bytes. */
59
+ const assets = (valueArg) => {
60
+ if (valueArg === undefined || valueArg === null)
61
+ return { count: 0n, bytes: 0n };
62
+ if (!Array.isArray(valueArg))
63
+ throw new validation.ForgeInventoryError('invalid-assets');
64
+ return valueArg.reduce((sumArg, assetArg) => ({
65
+ count: sumArg.count + 1n, bytes: sumArg.bytes + BigInt(validation.decimal(validation.record(assetArg).size)),
66
+ }), { count: 0n, bytes: 0n });
67
+ };
68
+ /** A `{ <rows>, total_count }` envelope whose rows must match its total. */
69
+ const countedEnvelope = (bodyArg, rowsKeyArg) => {
70
+ const body = validation.record(bodyArg);
71
+ const rows = body[rowsKeyArg] ?? [];
72
+ if (!Array.isArray(rows))
73
+ throw new validation.ForgeInventoryError('invalid-page');
74
+ return { rows, failure: validation.decimal(body.total_count) === String(rows.length) ? null : 'count-mismatch' };
75
+ };
76
+ const unitKey = (unitArg) => unitArg.kind === 'instance' ? 'instance'
77
+ : unitArg.kind === 'owner' ? `owner:${unitArg.ownerKind}:${unitArg.name}` : `repository:${unitArg.owner}/${unitArg.name}`;
78
+ const compareText = (aArg, bArg) => aArg < bArg ? -1 : aArg > bArg ? 1 : 0;
79
+ /**
80
+ * Authenticated, read-only inventory of a Gitea instance, read with a site
81
+ * administrator's token: GET requests to its REST API, a mirror clone of every
82
+ * repository for refs, objects and LFS pointers, and LFS batch `download`
83
+ * requests that check which referenced objects Gitea holds. It counts secrets
84
+ * and variables without retaining their values, and reports every read that
85
+ * did not finish as a partial or unmeasured value instead of a count.
86
+ */
87
+ export class GiteaSourceInventory {
88
+ #options;
89
+ #transport;
90
+ #client;
91
+ #lfsClient = null;
92
+ #readerLogin = null;
93
+ constructor(optionsArg) {
94
+ const baseUrl = validation.httpUrl(optionsArg.baseUrl);
95
+ if (!baseUrl || !baseUrl.startsWith('https:') || typeof optionsArg.instanceId !== 'string' || !optionsArg.instanceId.trim() ||
96
+ typeof optionsArg.token !== 'string' || !optionsArg.token || /[\s\u0000-\u001f\u007f]/.test(optionsArg.token) ||
97
+ typeof optionsArg.gitWorkDir !== 'string' || !plugins.path.isAbsolute(optionsArg.gitWorkDir)) {
98
+ throw new validation.ForgeInventoryError('invalid-options');
99
+ }
100
+ const limits = {
101
+ pageSize: optionsArg.pageSize ?? 50,
102
+ maxPages: optionsArg.maxPages ?? 10_000,
103
+ requestTimeoutMs: optionsArg.requestTimeoutMs ?? 60_000,
104
+ maxResponseBytes: optionsArg.maxResponseBytes ?? 16 * 1024 * 1024,
105
+ gitTimeoutMs: optionsArg.gitTimeoutMs ?? 30 * 60 * 1000,
106
+ };
107
+ for (const [name, maximum] of [
108
+ ['pageSize', 100], ['maxPages', 1_000_000], ['requestTimeoutMs', 300_000], ['maxResponseBytes', 64 * 1024 * 1024], ['gitTimeoutMs', 6 * 60 * 60 * 1000],
109
+ ]) {
110
+ const value = limits[name];
111
+ if (!Number.isSafeInteger(value) || value < 1 || value > maximum)
112
+ throw new validation.ForgeInventoryError('invalid-limits');
113
+ }
114
+ const caCertificates = optionsArg.caCertificates === undefined ? undefined : validation.caCertificates(optionsArg.caCertificates);
115
+ this.#options = {
116
+ instanceId: optionsArg.instanceId, baseUrl: baseUrl.replace(/\/+$/, ''), ...limits,
117
+ token: optionsArg.token, caCertificates, gitWorkDir: optionsArg.gitWorkDir,
118
+ };
119
+ this.#transport = caCertificates === undefined ? transport.globalFetchTransport : transport.createHttpsTransport(caCertificates);
120
+ this.#client = new ForgeRequestClient({
121
+ transport: this.#transport,
122
+ headers: { authorization: `token ${optionsArg.token}` },
123
+ requestTimeoutMs: limits.requestTimeoutMs,
124
+ maxResponseBytes: limits.maxResponseBytes,
125
+ });
126
+ }
127
+ /** Validated, normalized instance root; contains no credentials or API suffix. */
128
+ get baseUrl() { return this.#options.baseUrl; }
129
+ /** REST and LFS batch requests together. */
130
+ get metrics() {
131
+ const rest = this.#client.metrics;
132
+ const lfs = this.#lfsClient?.metrics ?? { requests: 0, responseBytes: 0, rateLimitedRequests: 0 };
133
+ return {
134
+ requests: rest.requests + lfs.requests,
135
+ responseBytes: rest.responseBytes + lfs.responseBytes,
136
+ rateLimitedRequests: rest.rateLimitedRequests + lfs.rateLimitedRequests,
137
+ };
138
+ }
139
+ /**
140
+ * Identifies the source and its reader and lists every owner and repository.
141
+ * Rejects unless the token belongs to a site administrator; a listing that
142
+ * does not finish is reported in `incompleteReasons`.
143
+ */
144
+ async discover(signalArg) {
145
+ const reader = validation.record((await this.#get('/user', { signal: signalArg })).body);
146
+ if (reader.is_admin !== true)
147
+ throw new validation.ForgeInventoryError('reader-not-site-admin');
148
+ const version = validation.record((await this.#get('/version', { signal: signalArg })).body).version;
149
+ if (typeof version !== 'string' || version.length > 128 || !/^\d+\.\d+\.\d+(?:[-+][A-Za-z0-9][A-Za-z0-9.+-]*)?$/.test(version)) {
150
+ throw new validation.ForgeInventoryError('invalid-server-version');
151
+ }
152
+ const incompleteReasons = [];
153
+ const organizations = await this.#list('/admin/orgs', { signal: signalArg });
154
+ const users = await this.#list('/admin/users', { signal: signalArg });
155
+ const repositories = await this.#list('/repos/search', {
156
+ signal: signalArg, query: { private: 'true', sort: 'id', order: 'asc' },
157
+ rows: (bodyArg) => {
158
+ const envelope = validation.record(bodyArg);
159
+ if (envelope.ok !== true)
160
+ throw new validation.ForgeInventoryError('search-not-successful');
161
+ return envelope.data;
162
+ },
163
+ });
164
+ for (const [name, listing] of [['organizations', organizations], ['users', users], ['repositories', repositories]]) {
165
+ if (listing.failure !== null)
166
+ incompleteReasons.push(`discovery: ${name}: ${listing.failure}`);
167
+ }
168
+ const owners = [
169
+ ...organizations.items.map((itemArg) => ({ kind: 'organization', name: segment(validation.record(itemArg).name) })),
170
+ ...users.items.map((itemArg) => ({ kind: 'user', name: segment(validation.record(itemArg).login) })),
171
+ ].sort((aArg, bArg) => compareText(aArg.kind, bArg.kind) || compareText(aArg.name, bArg.name));
172
+ const discovered = repositories.items.map((itemArg) => {
173
+ const item = validation.record(itemArg);
174
+ return { owner: segment(validation.record(item.owner).login), name: segment(item.name) };
175
+ }).sort((aArg, bArg) => compareText(aArg.owner, bArg.owner) || compareText(aArg.name, bArg.name));
176
+ return {
177
+ source: { instanceId: this.#options.instanceId, kind: 'gitea', baseUrl: this.#options.baseUrl, version },
178
+ reader: { login: segment(reader.login), siteAdmin: true },
179
+ owners,
180
+ repositories: discovered,
181
+ incompleteReasons: incompleteReasons.sort(compareText),
182
+ };
183
+ }
184
+ /** Every unit a run over this discovery measures: the instance, then owners, then repositories. */
185
+ units(discoveryArg) {
186
+ return [
187
+ { kind: 'instance' },
188
+ ...discoveryArg.owners.map((ownerArg) => ({ kind: 'owner', ownerKind: ownerArg.kind, name: ownerArg.name })),
189
+ ...discoveryArg.repositories.map((repositoryArg) => ({ kind: 'repository', owner: repositoryArg.owner, name: repositoryArg.name })),
190
+ ];
191
+ }
192
+ /** Measures one unit. Never rejects: a unit whose primary record cannot be read is `failed`. */
193
+ async measureUnit(unitArg, signalArg) {
194
+ try {
195
+ if (unitArg.kind === 'instance')
196
+ return { kind: 'instance', instance: await this.#instance(signalArg) };
197
+ if (unitArg.kind === 'owner') {
198
+ return { kind: 'owner', owner: unitArg.ownerKind === 'organization' ? await this.#organization(unitArg.name, signalArg) : await this.#user(unitArg.name, signalArg) };
199
+ }
200
+ return { kind: 'repository', repository: await this.#repository(unitArg.owner, unitArg.name, signalArg) };
201
+ }
202
+ catch (error) {
203
+ return { kind: 'failed', unit: unitArg, reason: reason(error) };
204
+ }
205
+ }
206
+ /**
207
+ * Measures units with bounded concurrency; results keep the order of `unitsArg`.
208
+ * An aborted signal or a rejected `onResult` aborts the units in flight, hands
209
+ * over no further result and rejects once every worker has stopped.
210
+ */
211
+ async measureUnits(unitsArg, optionsArg = {}) {
212
+ const concurrency = optionsArg.concurrency ?? 4;
213
+ if (!Number.isSafeInteger(concurrency) || concurrency < 1 || concurrency > 16)
214
+ throw new validation.ForgeInventoryError('invalid-concurrency');
215
+ const results = new Array(unitsArg.length);
216
+ // The first failure aborts the units in flight; nothing is handed over after it.
217
+ const controller = new AbortController();
218
+ const abort = () => controller.abort();
219
+ if (optionsArg.signal?.aborted)
220
+ abort();
221
+ optionsArg.signal?.addEventListener('abort', abort, { once: true });
222
+ let failure = null;
223
+ let next = 0;
224
+ const worker = async () => {
225
+ while (failure === null && next < unitsArg.length) {
226
+ const index = next++;
227
+ try {
228
+ if (controller.signal.aborted)
229
+ throw new validation.ForgeInventoryError('request-aborted');
230
+ const result = await this.measureUnit(unitsArg[index], controller.signal);
231
+ if (failure !== null)
232
+ return;
233
+ if (controller.signal.aborted)
234
+ throw new validation.ForgeInventoryError('request-aborted');
235
+ results[index] = result;
236
+ await optionsArg.onResult?.(result);
237
+ }
238
+ catch (error) {
239
+ failure ??= { error };
240
+ abort();
241
+ }
242
+ }
243
+ };
244
+ try {
245
+ await Promise.all(Array.from({ length: Math.min(concurrency, unitsArg.length) }, worker));
246
+ }
247
+ finally {
248
+ optionsArg.signal?.removeEventListener('abort', abort);
249
+ }
250
+ if (failure !== null)
251
+ throw failure.error;
252
+ return results;
253
+ }
254
+ async #instance(signalArg) {
255
+ const users = await this.#list('/admin/users', { signal: signalArg });
256
+ const flagged = (predicateArg) => listingMeasure(users, BigInt(users.items.filter((itemArg) => predicateArg(validation.record(itemArg))).length));
257
+ const runners = await this.#runners('/admin/actions/runners', { signal: signalArg });
258
+ return {
259
+ users: {
260
+ total: listingMeasure(users),
261
+ active: flagged((userArg) => requiredBoolean(userArg.active)),
262
+ admins: flagged((userArg) => requiredBoolean(userArg.is_admin)),
263
+ restricted: flagged((userArg) => requiredBoolean(userArg.restricted)),
264
+ prohibitLogin: flagged((userArg) => requiredBoolean(userArg.prohibit_login)),
265
+ externalAuth: flagged((userArg) => validation.decimal(userArg.source_id) !== '0'),
266
+ twoFactor: await this.#count('/admin/users', { signal: signalArg, query: { is_2fa_enabled: 'true' } }),
267
+ },
268
+ organizations: await this.#count('/admin/orgs', { signal: signalArg }),
269
+ systemWebhooks: await this.#count('/admin/hooks', { signal: signalArg, query: { type: 'all' } }),
270
+ runners,
271
+ unadoptedRepositories: await this.#count('/admin/unadopted', { signal: signalArg }),
272
+ };
273
+ }
274
+ async #ownerBase(nameArg, recordArg, repositoriesPathArg, signalArg) {
275
+ return {
276
+ name: nameArg,
277
+ id: validation.decimal(recordArg.id),
278
+ visibility: ownerVisibility(recordArg.visibility),
279
+ repositories: await this.#count(repositoriesPathArg, { signal: signalArg }),
280
+ packages: await this.#packages(nameArg, signalArg),
281
+ };
282
+ }
283
+ async #organization(nameArg, signalArg) {
284
+ const path = `/orgs/${encodeURIComponent(nameArg)}`;
285
+ const organization = validation.record((await this.#get(path, { signal: signalArg })).body);
286
+ if (segment(organization.name) !== nameArg)
287
+ throw new validation.ForgeInventoryError('owner-identity-changed');
288
+ const teams = await this.#list(`${path}/teams`, { signal: signalArg });
289
+ const memberships = [];
290
+ const grants = [];
291
+ for (const team of teams.items) {
292
+ const teamPath = `/teams/${validation.decimal(validation.record(team).id)}`;
293
+ memberships.push(await this.#count(`${teamPath}/members`, { signal: signalArg }));
294
+ grants.push(await this.#count(`${teamPath}/repos`, { signal: signalArg }));
295
+ }
296
+ const teamsMeasure = listingMeasure(teams);
297
+ const fromTeams = (measuresArg) => sumMeasures([...measuresArg, ...(teamsMeasure.status === 'complete' ? [] : [partial(0, teams.failure)])]);
298
+ return {
299
+ kind: 'organization',
300
+ ...await this.#ownerBase(nameArg, organization, `${path}/repos`, signalArg),
301
+ webhooks: await this.#count(`${path}/hooks`, { signal: signalArg }),
302
+ actionsVariables: await this.#count(`${path}/actions/variables`, { signal: signalArg }),
303
+ runners: await this.#runners(`${path}/actions/runners`, { signal: signalArg }),
304
+ members: await this.#count(`${path}/members`, { signal: signalArg }),
305
+ teams: teamsMeasure,
306
+ teamMemberships: fromTeams(memberships),
307
+ teamRepositoryGrants: fromTeams(grants),
308
+ labels: await this.#count(`${path}/labels`, { signal: signalArg }),
309
+ actionsSecrets: await this.#count(`${path}/actions/secrets`, { signal: signalArg }),
310
+ };
311
+ }
312
+ async #user(nameArg, signalArg) {
313
+ const path = `/users/${encodeURIComponent(nameArg)}`;
314
+ const user = validation.record((await this.#get(path, { signal: signalArg })).body);
315
+ if (segment(user.login) !== nameArg)
316
+ throw new validation.ForgeInventoryError('owner-identity-changed');
317
+ // User-scoped settings are only readable as that user, through the administrator's Sudo header.
318
+ const sudo = { signal: signalArg, sudo: nameArg };
319
+ return {
320
+ kind: 'user',
321
+ ...await this.#ownerBase(nameArg, user, `${path}/repos`, signalArg),
322
+ account: {
323
+ admin: requiredBoolean(user.is_admin),
324
+ active: requiredBoolean(user.active),
325
+ restricted: requiredBoolean(user.restricted),
326
+ prohibitLogin: requiredBoolean(user.prohibit_login),
327
+ externalAuth: validation.decimal(user.source_id) !== '0',
328
+ },
329
+ webhooks: await this.#count('/user/hooks', sudo),
330
+ actionsVariables: await this.#count('/user/actions/variables', sudo),
331
+ runners: await this.#runners('/user/actions/runners', sudo),
332
+ sshKeys: await this.#count(`${path}/keys`, { signal: signalArg }),
333
+ gpgKeys: await this.#count(`${path}/gpg_keys`, { signal: signalArg }),
334
+ };
335
+ }
336
+ /** Package versions by type, with their files and bytes. */
337
+ async #packages(ownerArg, signalArg) {
338
+ const ownerPath = `/packages/${encodeURIComponent(ownerArg)}`;
339
+ // Gitea lists one row per package version.
340
+ const versions = await this.#list(ownerPath, { signal: signalArg });
341
+ const byType = new Map();
342
+ for (const itemArg of versions.items) {
343
+ const item = validation.record(itemArg);
344
+ const type = requiredString(item.type);
345
+ // The type is reported and names reason paths, so it must be one of Gitea's plain identifiers.
346
+ if (!/^[a-z][a-z0-9_-]{0,31}$/.test(type))
347
+ throw new validation.ForgeInventoryError('invalid-package-type');
348
+ const name = requiredString(item.name);
349
+ const version = requiredString(item.version);
350
+ const entry = byType.get(type) ?? { names: new Set(), versions: 0, files: [], bytes: [] };
351
+ byType.set(type, entry);
352
+ entry.names.add(name);
353
+ entry.versions++;
354
+ try {
355
+ const files = (await this.#get(`${ownerPath}/${[type, name, version].map(encodeURIComponent).join('/')}/files`, { signal: signalArg })).body;
356
+ if (!Array.isArray(files))
357
+ throw new validation.ForgeInventoryError('invalid-page');
358
+ const bytes = files.reduce((sumArg, fileArg) => sumArg + BigInt(validation.decimal(validation.record(fileArg).size)), 0n);
359
+ entry.files.push(complete(files.length));
360
+ entry.bytes.push(complete(bytes));
361
+ }
362
+ catch (error) {
363
+ entry.files.push(partial(0, reason(error)));
364
+ entry.bytes.push(partial(0, reason(error)));
365
+ }
366
+ }
367
+ const unfinished = versions.failure === null ? [] : [partial(0, versions.failure)];
368
+ const counts = [...byType.entries()].sort(([aArg], [bArg]) => compareText(aArg, bArg)).map(([type, entry]) => ({
369
+ type,
370
+ packages: sumMeasures([complete(entry.names.size), ...unfinished]),
371
+ versions: sumMeasures([complete(entry.versions), ...unfinished]),
372
+ files: sumMeasures([...entry.files, ...unfinished]),
373
+ bytes: sumMeasures([...entry.bytes, ...unfinished]),
374
+ }));
375
+ // A listing that failed before its first row still has to surface as partial.
376
+ if (counts.length === 0 && versions.failure !== null) {
377
+ const failed = partial(0, versions.failure);
378
+ counts.push({ type: 'unknown', packages: failed, versions: failed, files: failed, bytes: failed });
379
+ }
380
+ return counts;
381
+ }
382
+ async #repository(ownerArg, nameArg, signalArg) {
383
+ const path = `/repos/${encodeURIComponent(ownerArg)}/${encodeURIComponent(nameArg)}`;
384
+ const item = validation.record((await this.#get(path, { signal: signalArg })).body);
385
+ const owner = validation.record(item.owner);
386
+ if (segment(owner.login) !== ownerArg || segment(item.name) !== nameArg)
387
+ throw new validation.ForgeInventoryError('repository-identity-changed');
388
+ const visibility = validation.giteaRepositoryVisibility(item.private, item.internal, owner.visibility);
389
+ if (visibility === null)
390
+ throw new validation.ForgeInventoryError('invalid-visibility');
391
+ const empty = requiredBoolean(item.empty);
392
+ const features = {
393
+ issues: requiredBoolean(item.has_issues),
394
+ pullRequests: requiredBoolean(item.has_pull_requests),
395
+ wiki: requiredBoolean(item.has_wiki),
396
+ releases: requiredBoolean(item.has_releases),
397
+ packages: requiredBoolean(item.has_packages),
398
+ actions: requiredBoolean(item.has_actions),
399
+ projects: requiredBoolean(item.has_projects),
400
+ };
401
+ const fork = requiredBoolean(item.fork);
402
+ const parent = item.parent === undefined || item.parent === null ? null : requiredString(validation.record(item.parent).full_name);
403
+ if (fork !== (parent !== null))
404
+ throw new validation.ForgeInventoryError('inconsistent-fork-parent');
405
+ const options = { signal: signalArg };
406
+ return {
407
+ owner: ownerArg,
408
+ name: nameArg,
409
+ id: validation.decimal(item.id),
410
+ visibility,
411
+ fork,
412
+ parent,
413
+ mirror: requiredBoolean(item.mirror),
414
+ template: requiredBoolean(item.template),
415
+ archived: requiredBoolean(item.archived),
416
+ empty,
417
+ objectFormat: requiredString(item.object_format_name),
418
+ defaultBranch: requiredString(item.default_branch),
419
+ features,
420
+ ...await this.#git(ownerArg, nameArg, item, signalArg),
421
+ collaboration: await this.#collaboration(path, features, signalArg),
422
+ // Releases stay readable while their unit is disabled; a disabled wiki answers 404.
423
+ releases: await this.#releases(path, signalArg),
424
+ wikiPages: features.wiki ? await this.#count(`${path}/wiki/pages`, { ...options, missingIsEmpty: true }) : unitDisabled('wiki'),
425
+ access: {
426
+ collaborators: await this.#count(`${path}/collaborators`, options),
427
+ teams: await this.#repositoryTeams(path, options),
428
+ deployKeys: await this.#count(`${path}/keys`, options),
429
+ webhooks: await this.#count(`${path}/hooks`, options),
430
+ branchProtections: await this.#unpagedCount(`${path}/branch_protections`, options),
431
+ tagProtections: await this.#unpagedCount(`${path}/tag_protections`, options),
432
+ pushMirrors: await this.#count(`${path}/push_mirrors`, options),
433
+ },
434
+ actions: await this.#actions(path, empty, signalArg),
435
+ };
436
+ }
437
+ /** Gitea answers 405 for a repository that no organization owns, which therefore has no teams. */
438
+ async #repositoryTeams(pathArg, optionsArg) {
439
+ try {
440
+ const body = (await this.#get(`${pathArg}/teams`, optionsArg)).body;
441
+ if (!Array.isArray(body))
442
+ throw new validation.ForgeInventoryError('invalid-page');
443
+ return complete(body.length);
444
+ }
445
+ catch (error) {
446
+ if (error instanceof validation.ForgeInventoryError && error.code === 'http-405')
447
+ return complete(0);
448
+ return partial(0, reason(error));
449
+ }
450
+ }
451
+ /** Refs, objects and LFS objects, read from a mirror clone; only the reported size comes from the API. */
452
+ async #git(ownerArg, nameArg, itemArg, signalArg) {
453
+ const sizeKiB = BigInt(validation.decimal(itemArg.size));
454
+ const username = await this.#login(signalArg);
455
+ const measured = await measureGiteaMirror({
456
+ baseUrl: this.#options.baseUrl, owner: ownerArg, name: nameArg, username, token: this.#options.token,
457
+ caCertificates: this.#options.caCertificates, workDir: this.#options.gitWorkDir, reportedSizeKiB: sizeKiB,
458
+ timeoutMs: this.#options.gitTimeoutMs,
459
+ lfsClient: this.#lfs(username), signal: signalArg,
460
+ });
461
+ return { git: { reportedSizeKiB: complete(sizeKiB), ...measured.git }, lfs: measured.lfs };
462
+ }
463
+ /** The reader's login, the user name of its Git and LFS credentials. */
464
+ #login(signalArg) {
465
+ if (this.#readerLogin === null) {
466
+ const login = this.#get('/user', { signal: signalArg }).then((responseArg) => segment(validation.record(responseArg.body).login));
467
+ // A failed read is retried by the next repository.
468
+ login.catch(() => { if (this.#readerLogin === login)
469
+ this.#readerLogin = null; });
470
+ this.#readerLogin = login;
471
+ }
472
+ return this.#readerLogin;
473
+ }
474
+ /** LFS routes accept the token as a Basic password, not as a `token` authorization. */
475
+ #lfs(usernameArg) {
476
+ this.#lfsClient ??= new ForgeRequestClient({
477
+ transport: this.#transport,
478
+ headers: { authorization: `Basic ${Buffer.from(`${usernameArg}:${this.#options.token}`).toString('base64')}` },
479
+ requestTimeoutMs: this.#options.requestTimeoutMs,
480
+ maxResponseBytes: this.#options.maxResponseBytes,
481
+ });
482
+ return this.#lfsClient;
483
+ }
484
+ async #collaboration(pathArg, featuresArg, signalArg) {
485
+ const options = { signal: signalArg };
486
+ // Labels and milestones stay readable while the issue units are disabled.
487
+ const labels = await this.#count(`${pathArg}/labels`, options);
488
+ const milestones = await this.#count(`${pathArg}/milestones`, { ...options, query: { state: 'all' } });
489
+ if (!featuresArg.issues || !featuresArg.pullRequests) {
490
+ // A disabled unit silently drops its items from the shared issue listing; with both disabled the listings answer 404.
491
+ const hidden = unitDisabled(featuresArg.issues ? 'pull requests' : 'issues');
492
+ return {
493
+ issues: hidden, pullRequests: hidden, comments: hidden, reviews: hidden, reviewComments: hidden,
494
+ labels, milestones, reactions: hidden, attachments: hidden, attachmentBytes: hidden,
495
+ };
496
+ }
497
+ // Issues and pull requests share one listing and one number sequence.
498
+ const issues = await this.#list(`${pathArg}/issues`, { ...options, query: { state: 'all' } });
499
+ const unfinished = issues.failure === null ? [] : [partial(0, issues.failure)];
500
+ let issueCount = 0n;
501
+ let pullCount = 0n;
502
+ let attachments = { count: 0n, bytes: 0n };
503
+ const reactions = [...unfinished];
504
+ const reviews = [...unfinished];
505
+ const reviewComments = [...unfinished];
506
+ for (const itemArg of issues.items) {
507
+ const item = validation.record(itemArg);
508
+ const number = validation.decimal(item.number);
509
+ const isPull = item.pull_request !== undefined && item.pull_request !== null;
510
+ if (isPull)
511
+ pullCount++;
512
+ else
513
+ issueCount++;
514
+ const itemAssets = assets(item.assets);
515
+ attachments = { count: attachments.count + itemAssets.count, bytes: attachments.bytes + itemAssets.bytes };
516
+ reactions.push(await this.#count(`${pathArg}/issues/${number}/reactions`, { ...options, nullIsEmpty: true }));
517
+ if (isPull) {
518
+ const pullReviews = await this.#list(`${pathArg}/pulls/${number}/reviews`, options);
519
+ reviews.push(listingMeasure(pullReviews));
520
+ const inline = pullReviews.items.reduce((sumArg, reviewArg) => sumArg + BigInt(validation.decimal(validation.record(reviewArg).comments_count)), 0n);
521
+ reviewComments.push(listingMeasure(pullReviews, inline));
522
+ }
523
+ }
524
+ const comments = await this.#list(`${pathArg}/issues/comments`, options);
525
+ const commentUnfinished = comments.failure === null ? [] : [partial(0, comments.failure)];
526
+ for (const commentArg of comments.items) {
527
+ const comment = validation.record(commentArg);
528
+ const commentAssets = assets(comment.assets);
529
+ attachments = { count: attachments.count + commentAssets.count, bytes: attachments.bytes + commentAssets.bytes };
530
+ reactions.push(await this.#unpagedCount(`${pathArg}/issues/comments/${validation.decimal(comment.id)}/reactions`, { ...options, nullIsEmpty: true }));
531
+ }
532
+ const attachmentUnfinished = [...unfinished, ...commentUnfinished];
533
+ return {
534
+ issues: listingMeasure(issues, issueCount),
535
+ pullRequests: listingMeasure(issues, pullCount),
536
+ comments: listingMeasure(comments),
537
+ reviews: sumMeasures(reviews),
538
+ reviewComments: sumMeasures(reviewComments),
539
+ labels,
540
+ milestones,
541
+ reactions: sumMeasures([...reactions, ...commentUnfinished]),
542
+ attachments: sumMeasures([complete(attachments.count), ...attachmentUnfinished]),
543
+ attachmentBytes: sumMeasures([complete(attachments.bytes), ...attachmentUnfinished]),
544
+ };
545
+ }
546
+ async #releases(pathArg, signalArg) {
547
+ // An administrator's listing includes drafts.
548
+ const releases = await this.#list(`${pathArg}/releases`, { signal: signalArg });
549
+ let drafts = 0n;
550
+ let releaseAssets = { count: 0n, bytes: 0n };
551
+ for (const itemArg of releases.items) {
552
+ const item = validation.record(itemArg);
553
+ if (requiredBoolean(item.draft))
554
+ drafts++;
555
+ const itemAssets = assets(item.assets);
556
+ releaseAssets = { count: releaseAssets.count + itemAssets.count, bytes: releaseAssets.bytes + itemAssets.bytes };
557
+ }
558
+ return {
559
+ releases: listingMeasure(releases),
560
+ drafts: listingMeasure(releases, drafts),
561
+ assets: listingMeasure(releases, releaseAssets.count),
562
+ assetBytes: listingMeasure(releases, releaseAssets.bytes),
563
+ };
564
+ }
565
+ /** Every Actions read stays available while the repository's Actions unit is disabled. */
566
+ async #actions(pathArg, emptyArg, signalArg) {
567
+ const options = { signal: signalArg };
568
+ const settings = {
569
+ secrets: await this.#count(`${pathArg}/actions/secrets`, options),
570
+ variables: await this.#count(`${pathArg}/actions/variables`, options),
571
+ runners: await this.#runners(`${pathArg}/actions/runners`, options),
572
+ };
573
+ let workflows;
574
+ if (emptyArg) {
575
+ workflows = complete(0);
576
+ }
577
+ else {
578
+ try {
579
+ const listing = countedEnvelope((await this.#get(`${pathArg}/actions/workflows`, options)).body, 'workflows');
580
+ workflows = listing.failure === null ? complete(listing.rows.length) : partial(listing.rows.length, listing.failure);
581
+ }
582
+ catch (error) {
583
+ workflows = partial(0, reason(error));
584
+ }
585
+ }
586
+ let runs;
587
+ try {
588
+ // The run history is archived, not migrated; its total sizes the archive without reading every run.
589
+ const body = validation.record((await this.#get(`${pathArg}/actions/runs`, { ...options, query: { limit: '1', page: '1' } })).body);
590
+ runs = complete(BigInt(validation.decimal(body.total_count)));
591
+ }
592
+ catch (error) {
593
+ runs = partial(0, reason(error));
594
+ }
595
+ let artifacts;
596
+ let artifactBytes;
597
+ try {
598
+ const listing = countedEnvelope((await this.#get(`${pathArg}/actions/artifacts`, options)).body, 'artifacts');
599
+ const bytes = listing.rows.reduce((sumArg, artifactArg) => sumArg + BigInt(validation.decimal(validation.record(artifactArg).size_in_bytes)), 0n);
600
+ artifacts = listing.failure === null ? complete(listing.rows.length) : partial(listing.rows.length, listing.failure);
601
+ artifactBytes = listing.failure === null ? complete(bytes) : partial(bytes, listing.failure);
602
+ }
603
+ catch (error) {
604
+ artifacts = artifactBytes = partial(0, reason(error));
605
+ }
606
+ return { workflows, ...settings, runs, artifacts, artifactBytes };
607
+ }
608
+ /** Runner listings are unpaged `{ runners, total_count }` envelopes. */
609
+ async #runners(pathArg, optionsArg) {
610
+ try {
611
+ const listing = countedEnvelope((await this.#get(pathArg, optionsArg)).body, 'runners');
612
+ return listing.failure === null ? complete(listing.rows.length) : partial(listing.rows.length, listing.failure);
613
+ }
614
+ catch (error) {
615
+ return partial(0, reason(error));
616
+ }
617
+ }
618
+ async #unpagedCount(pathArg, optionsArg) {
619
+ try {
620
+ const response = (await this.#get(pathArg, optionsArg)).body;
621
+ const body = response === null && optionsArg.nullIsEmpty ? [] : response;
622
+ if (!Array.isArray(body))
623
+ throw new validation.ForgeInventoryError('invalid-page');
624
+ return complete(body.length);
625
+ }
626
+ catch (error) {
627
+ return partial(0, reason(error));
628
+ }
629
+ }
630
+ async #count(pathArg, optionsArg) {
631
+ return listingMeasure(await this.#list(pathArg, optionsArg));
632
+ }
633
+ /**
634
+ * Reads every page of a listing. It ends at an empty page or once the rows
635
+ * reach `X-Total-Count`, and is partial when the total disagrees with the
636
+ * rows read, a page repeats, the page limit is reached or a page fails.
637
+ */
638
+ async #list(pathArg, optionsArg) {
639
+ const items = [];
640
+ let previousPage = null;
641
+ let total = null;
642
+ for (let page = 1;; page++) {
643
+ if (page > this.#options.maxPages)
644
+ return { items, failure: 'page-limit' };
645
+ let rows;
646
+ let totalHeader;
647
+ try {
648
+ const response = await this.#get(pathArg, {
649
+ ...optionsArg, query: { ...optionsArg.query, limit: String(this.#options.pageSize), page: String(page) },
650
+ });
651
+ rows = optionsArg.rows ? optionsArg.rows(response.body) : response.body;
652
+ if (rows === null && optionsArg.nullIsEmpty)
653
+ rows = [];
654
+ totalHeader = response.headers.get('x-total-count');
655
+ }
656
+ catch (error) {
657
+ if (page === 1 && optionsArg.missingIsEmpty && error instanceof validation.ForgeInventoryError && error.code === 'http-404') {
658
+ return { items, failure: null };
659
+ }
660
+ return { items, failure: reason(error) };
661
+ }
662
+ if (!Array.isArray(rows) || rows.length > this.#options.pageSize)
663
+ return { items, failure: 'invalid-page' };
664
+ if (totalHeader !== null) {
665
+ let pageTotal;
666
+ try {
667
+ pageTotal = BigInt(validation.decimal(totalHeader));
668
+ }
669
+ catch {
670
+ return { items, failure: 'invalid-total-count' };
671
+ }
672
+ if (total !== null && pageTotal !== total)
673
+ return { items, failure: 'total-changed' };
674
+ total = pageTotal;
675
+ }
676
+ if (rows.length === 0)
677
+ break;
678
+ const signature = JSON.stringify(rows);
679
+ if (signature === previousPage)
680
+ return { items, failure: 'repeated-page' };
681
+ previousPage = signature;
682
+ items.push(...rows);
683
+ if (total !== null && BigInt(items.length) >= total)
684
+ break;
685
+ }
686
+ if (total !== null && BigInt(items.length) !== total)
687
+ return { items, failure: 'count-mismatch' };
688
+ return { items, failure: null };
689
+ }
690
+ #get(pathArg, optionsArg) {
691
+ const url = new URL(`${this.#options.baseUrl}/api/v1${pathArg}`);
692
+ for (const [key, value] of Object.entries(optionsArg.query ?? {}))
693
+ url.searchParams.set(key, value);
694
+ const request = { signal: optionsArg.signal };
695
+ if (optionsArg.sudo !== undefined)
696
+ request.headers = { sudo: optionsArg.sudo };
697
+ return this.#client.request(url, request);
698
+ }
699
+ }
700
+ /** Repository-shaped groups, summed over repositories. */
701
+ const sumGroup = (groupsArg, keysArg, missingArg) => Object.fromEntries(keysArg.map((keyArg) => [keyArg, sumMeasures([...groupsArg.map((groupArg) => groupArg[keyArg]), ...missingArg])]));
702
+ const indicator = (measureArg, predicateArg) => measureArg.status === 'complete' ? complete(predicateArg(BigInt(measureArg.value)) ? 1 : 0)
703
+ : measureArg.status === 'partial' ? partial(predicateArg(BigInt(measureArg.observedValue)) ? 1 : 0, measureArg.reason) : measureArg;
704
+ /** Every measure of a document with its dotted path. */
705
+ const measuresOf = (valueArg, pathArg, outArg) => {
706
+ if (!valueArg || typeof valueArg !== 'object')
707
+ return;
708
+ const value = valueArg;
709
+ if (typeof value.status === 'string' && (value.status === 'complete' || value.status === 'partial' || value.status === 'notMeasured')) {
710
+ outArg.push({ path: pathArg, measure: value });
711
+ return;
712
+ }
713
+ for (const [key, child] of Object.entries(value)) {
714
+ // Package counts are keyed by their type rather than their position.
715
+ const name = Array.isArray(value) && child && typeof child === 'object' && typeof child.type === 'string'
716
+ ? child.type : key;
717
+ measuresOf(child, pathArg ? `${pathArg}.${name}` : name, outArg);
718
+ }
719
+ };
720
+ /**
721
+ * Composes the deterministic inventory from a discovery and its unit results.
722
+ * Repeated results for one unit keep the last. Units without a successful
723
+ * result, owner repository counts that disagree with discovery, and every
724
+ * partial or unmeasured value make the inventory incomplete, with reasons
725
+ * aggregated per subject kind, path and reason.
726
+ */
727
+ export const composeGiteaSourceInventory = (discoveryArg, resultsArg, generatorsArg) => {
728
+ const results = new Map();
729
+ for (const result of resultsArg) {
730
+ const unit = result.kind === 'failed' ? result.unit : result.kind === 'instance' ? { kind: 'instance' }
731
+ : result.kind === 'owner' ? { kind: 'owner', ownerKind: result.owner.kind, name: result.owner.name }
732
+ : { kind: 'repository', owner: result.repository.owner, name: result.repository.name };
733
+ results.set(unitKey(unit), result);
734
+ }
735
+ const reasons = new Map();
736
+ const addReason = (textArg) => reasons.set(textArg, (reasons.get(textArg) ?? 0) + 1);
737
+ for (const text of discoveryArg.incompleteReasons)
738
+ addReason(text);
739
+ const instanceResult = results.get('instance');
740
+ let instance;
741
+ if (instanceResult?.kind === 'instance') {
742
+ instance = instanceResult.instance;
743
+ }
744
+ else {
745
+ const missing = notMeasured(instanceResult?.kind === 'failed' ? `The instance unit failed: ${instanceResult.reason}.` : 'The instance unit was not measured.');
746
+ instance = {
747
+ users: { total: missing, active: missing, admins: missing, restricted: missing, prohibitLogin: missing, externalAuth: missing, twoFactor: missing },
748
+ organizations: missing, systemWebhooks: missing, runners: missing, unadoptedRepositories: missing,
749
+ };
750
+ }
751
+ const owners = [];
752
+ const failedOwners = [];
753
+ for (const owner of discoveryArg.owners) {
754
+ const result = results.get(unitKey({ kind: 'owner', ownerKind: owner.kind, name: owner.name }));
755
+ if (result?.kind === 'owner')
756
+ owners.push(result.owner);
757
+ else {
758
+ failedOwners.push(owner.name);
759
+ addReason(`${owner.kind}: ${result?.kind === 'failed' ? `unit failed: ${result.reason}` : 'unit not measured'}`);
760
+ }
761
+ }
762
+ const repositories = [];
763
+ const failedRepositories = [];
764
+ for (const repository of discoveryArg.repositories) {
765
+ const result = results.get(unitKey({ kind: 'repository', ...repository }));
766
+ if (result?.kind === 'repository')
767
+ repositories.push(result.repository);
768
+ else {
769
+ failedRepositories.push(`${repository.owner}/${repository.name}`);
770
+ addReason(`repository: ${result?.kind === 'failed' ? `unit failed: ${result.reason}` : 'unit not measured'}`);
771
+ }
772
+ }
773
+ owners.sort((aArg, bArg) => compareText(aArg.kind, bArg.kind) || compareText(aArg.name, bArg.name));
774
+ repositories.sort((aArg, bArg) => compareText(aArg.owner, bArg.owner) || compareText(aArg.name, bArg.name));
775
+ // Each owner's own repository listing must agree with the instance-wide discovery.
776
+ const discoveredPerOwner = new Map();
777
+ for (const repository of discoveryArg.repositories)
778
+ discoveredPerOwner.set(repository.owner, (discoveredPerOwner.get(repository.owner) ?? 0) + 1);
779
+ for (const owner of owners) {
780
+ if (owner.repositories.status === 'complete' && owner.repositories.value !== String(discoveredPerOwner.get(owner.name) ?? 0)) {
781
+ addReason(`${owner.kind}: repositories: the owner listing disagrees with the instance-wide repository search`);
782
+ }
783
+ }
784
+ const ownerNames = new Set(discoveryArg.owners.map((ownerArg) => ownerArg.name));
785
+ for (const owner of discoveredPerOwner.keys()) {
786
+ if (!ownerNames.has(owner))
787
+ addReason('repository: owner missing from the owner discovery');
788
+ }
789
+ const missingOwners = failedOwners.length ? [partial(0, `Owner units not measured: ${failedOwners.length}.`)] : [];
790
+ const missingRepositories = failedRepositories.length ? [partial(0, `Repository units not measured: ${failedRepositories.length}.`)] : [];
791
+ const repositoryCount = (predicateArg) => sumMeasures([complete(repositories.filter(predicateArg).length), ...missingRepositories]);
792
+ const organizationOwners = owners.filter((ownerArg) => ownerArg.kind === 'organization');
793
+ const userOwners = owners.filter((ownerArg) => ownerArg.kind === 'user');
794
+ const ownerSum = (measuresArg) => sumMeasures([...measuresArg, ...missingOwners]);
795
+ const packageTypes = new Map();
796
+ for (const owner of owners)
797
+ for (const counts of owner.packages)
798
+ packageTypes.set(counts.type, [...packageTypes.get(counts.type) ?? [], counts]);
799
+ const inventory = {
800
+ generators: [...generatorsArg].sort((aArg, bArg) => compareText(aArg.package, bArg.package)),
801
+ source: discoveryArg.source,
802
+ reader: discoveryArg.reader,
803
+ limitations: [...giteaSourceInventoryLimitations],
804
+ instance,
805
+ owners,
806
+ repositories,
807
+ totals: {
808
+ organizations: instance.organizations,
809
+ users: instance.users.total,
810
+ repositories: {
811
+ total: repositoryCount(() => true),
812
+ private: repositoryCount((repositoryArg) => repositoryArg.visibility === 'private'),
813
+ internal: repositoryCount((repositoryArg) => repositoryArg.visibility === 'internal'),
814
+ forks: repositoryCount((repositoryArg) => repositoryArg.fork),
815
+ mirrors: repositoryCount((repositoryArg) => repositoryArg.mirror),
816
+ templates: repositoryCount((repositoryArg) => repositoryArg.template),
817
+ archived: repositoryCount((repositoryArg) => repositoryArg.archived),
818
+ empty: repositoryCount((repositoryArg) => repositoryArg.empty),
819
+ withWiki: sumMeasures([...repositories.map((repositoryArg) => indicator(repositoryArg.wikiPages, (valueArg) => valueArg > 0n)), ...missingRepositories]),
820
+ },
821
+ git: sumGroup(repositories.map((repositoryArg) => repositoryArg.git), ['reportedSizeKiB', 'branches', 'tags', 'pullRequestRefs', 'otherRefs', 'objects', 'objectBytes'], missingRepositories),
822
+ lfs: sumGroup(repositories.map((repositoryArg) => repositoryArg.lfs), ['objects', 'bytes', 'missingObjects'], missingRepositories),
823
+ collaboration: sumGroup(repositories.map((repositoryArg) => repositoryArg.collaboration), ['issues', 'pullRequests', 'comments', 'reviews', 'reviewComments', 'labels', 'milestones', 'reactions', 'attachments', 'attachmentBytes'], missingRepositories),
824
+ releases: sumGroup(repositories.map((repositoryArg) => repositoryArg.releases), ['releases', 'drafts', 'assets', 'assetBytes'], missingRepositories),
825
+ wikiPages: sumMeasures([...repositories.map((repositoryArg) => repositoryArg.wikiPages), ...missingRepositories]),
826
+ access: sumGroup(repositories.map((repositoryArg) => repositoryArg.access), ['collaborators', 'teams', 'deployKeys', 'webhooks', 'branchProtections', 'tagProtections', 'pushMirrors'], missingRepositories),
827
+ actions: sumGroup(repositories.map((repositoryArg) => repositoryArg.actions), ['workflows', 'secrets', 'variables', 'runners', 'runs', 'artifacts', 'artifactBytes'], missingRepositories),
828
+ owners: {
829
+ webhooks: ownerSum(owners.map((ownerArg) => ownerArg.webhooks)),
830
+ actionsSecrets: ownerSum(organizationOwners.map((ownerArg) => ownerArg.actionsSecrets)),
831
+ actionsVariables: ownerSum(owners.map((ownerArg) => ownerArg.actionsVariables)),
832
+ runners: ownerSum(owners.map((ownerArg) => ownerArg.runners)),
833
+ members: ownerSum(organizationOwners.map((ownerArg) => ownerArg.members)),
834
+ teams: ownerSum(organizationOwners.map((ownerArg) => ownerArg.teams)),
835
+ teamMemberships: ownerSum(organizationOwners.map((ownerArg) => ownerArg.teamMemberships)),
836
+ teamRepositoryGrants: ownerSum(organizationOwners.map((ownerArg) => ownerArg.teamRepositoryGrants)),
837
+ labels: ownerSum(organizationOwners.map((ownerArg) => ownerArg.labels)),
838
+ sshKeys: ownerSum(userOwners.map((ownerArg) => ownerArg.sshKeys)),
839
+ gpgKeys: ownerSum(userOwners.map((ownerArg) => ownerArg.gpgKeys)),
840
+ },
841
+ packages: [...packageTypes.entries()].sort(([aArg], [bArg]) => compareText(aArg, bArg)).map(([type, countsArg]) => ({
842
+ type,
843
+ ...sumGroup(countsArg.map(({ type: _type, ...measures }) => measures), ['packages', 'versions', 'files', 'bytes'], missingOwners),
844
+ })),
845
+ },
846
+ };
847
+ // Every value that is not complete is a reason, aggregated per subject kind, path and reason.
848
+ const collected = [];
849
+ measuresOf(instance, 'instance', collected);
850
+ for (const owner of owners) {
851
+ const { name: _name, id: _id, ...measures } = owner;
852
+ measuresOf(measures, owner.kind, collected);
853
+ }
854
+ for (const repository of repositories)
855
+ measuresOf(repository, 'repository', collected);
856
+ for (const { path, measure } of collected) {
857
+ if (measure.status !== 'complete')
858
+ addReason(`${path}: ${measure.reason}`);
859
+ }
860
+ const incompleteReasons = [...reasons.entries()]
861
+ .map(([text, count]) => count > 1 ? `${text} (${count} times)` : text)
862
+ .sort(compareText);
863
+ return { ...inventory, inventoryComplete: incompleteReasons.length === 0, incompleteReasons };
864
+ };
865
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5naXRlYXNvdXJjZWludmVudG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuZ2l0ZWFzb3VyY2VpbnZlbnRvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxLQUFLLFNBQVMsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEtBQUssVUFBVSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBb0VuRSx3R0FBd0c7QUFDeEcsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQXNCO0lBQ2hFLDhFQUE4RTtDQUMvRSxDQUFDO0FBRUYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxRQUF5QixFQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN2SCxNQUFNLE9BQU8sR0FBRyxDQUFDLFdBQTRCLEVBQUUsU0FBaUIsRUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztBQUN6SyxNQUFNLFdBQVcsR0FBRyxDQUFDLFNBQWlCLEVBQVksRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0FBQ3BHLE1BQU0sWUFBWSxHQUFHLENBQUMsT0FBZSxFQUFZLEVBQUUsQ0FBQyxXQUFXLENBQUMsT0FBTyxPQUFPLGdEQUFn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