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,
}
}