Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kody/origin

src/installations.ts

64 lines · 1.8 KB · TypeScript
import { asRecord, isRecord, originErrorMessage, stringField } from './http.ts'
import { originRequest } from './request.ts'
import { listOriginInstallations, slimOwner } from './token.ts'
import {
	type OriginAccountInput,
	type OriginRepoSummary,
} from './types.ts'

export { listOriginInstallations }

/**
 * List repositories visible to one Origin App installation.
 */
export async function listOriginInstallationRepos(
	params: OriginAccountInput & {
		pageSize?: number
		pageToken?: string
	} = {},
): Promise<{ items: Array<OriginRepoSummary>; nextPageToken: string | null }> {
	const result = await originRequest({
		...params,
		path: '/installation/repos',
		auth: 'installation',
		query: {
			pageSize: params.pageSize,
			pageToken: params.pageToken,
		},
	})
	if (!result.ok) {
		throw new Error(
			`Failed to list Origin installation repos: ${originErrorMessage(result.body, result.status)}`,
		)
	}
	const payload = isRecord(result.body) ? result.body : {}
	const raw = Array.isArray(payload.repositories) ? payload.repositories : []
	return {
		items: raw.map((item) => slimRepo(asRecord(item))),
		nextPageToken:
			typeof payload.nextPageToken === 'string' && payload.nextPageToken
				? payload.nextPageToken
				: null,
	}
}

export default listOriginInstallations

export function slimRepo(item: Record<string, unknown>): OriginRepoSummary {
	const owner = isRecord(item.owner) ? item.owner : null
	const mirror = isRecord(item.mirror) ? item.mirror : null
	return {
		id: stringField(item.id) ?? '',
		name: stringField(item.name) ?? '',
		fullName: stringField(item.fullName),
		owner: owner ? slimOwner(owner) : null,
		defaultBranch: stringField(item.defaultBranch),
		cloneUrl: stringField(item.cloneUrl),
		mirror: mirror
			? {
					source: stringField(mirror.source),
					status: stringField(mirror.status),
				}
			: null,
	}
}