Files
orca/src/shared/pr-check-severity-order.ts
T
OrcaWinandOrca Worker 3c7c846a1d perf: compute check severity once per sort (#20342)
Co-authored-by: Orca Worker <orca-worker@localhost>
2026-09-12 18:12:00 -07:00

36 lines
1.2 KiB
TypeScript

import type { PRCheckDetail } from './github/check-types'
// Why: `neutral`/`skipped` carry no signal, so they sink below `success` — otherwise a
// wall of skipped jobs buries the passing checks a reviewer actually reads.
// A Map, not an object: conclusions arrive from provider payloads, and an object
// would resolve `constructor`/`toString` off the prototype into a non-number rank.
const CHECK_SEVERITY_RANK = new Map<string, number>([
['failure', 0],
['timed_out', 0],
['action_required', 0],
['cancelled', 1],
['pending', 2],
['success', 3],
['neutral', 4],
['skipped', 5]
])
// Why: an unrecognized conclusion sinks to the bottom instead of masquerading as `neutral`.
const UNKNOWN_CHECK_RANK = 6
export function getCheckSeverityRank(conclusion: string | null | undefined): number {
return CHECK_SEVERITY_RANK.get(conclusion ?? 'pending') ?? UNKNOWN_CHECK_RANK
}
export function sortChecksBySeverity<T extends Pick<PRCheckDetail, 'conclusion'>>(
checks: readonly T[]
): T[] {
if (checks.length < 2) {
return checks.slice()
}
return checks
.map((check, index) => ({ check, index, rank: getCheckSeverityRank(check.conclusion) }))
.sort((a, b) => a.rank - b.rank || a.index - b.index)
.map(({ check }) => check)
}