Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DgBEW6qAwgn2fcQbA2f4ZQ
34 lines
1.2 KiB
TypeScript
34 lines
1.2 KiB
TypeScript
import type { ReviewState, ReviewerVerdict } from '../shared/types.js';
|
|
import type { ListPr } from './github/queries.js';
|
|
|
|
export function deriveReviewState(pr: ListPr): {
|
|
reviewState: ReviewState;
|
|
unresolvedThreads: number;
|
|
totalThreads: number;
|
|
} {
|
|
const totalThreads = pr.reviewThreads.totalCount;
|
|
const unresolvedThreads = pr.reviewThreads.nodes.filter((t) => !t.isResolved).length;
|
|
let reviewState: ReviewState;
|
|
if (pr.reviews.totalCount === 0 && totalThreads === 0) reviewState = 'no_review';
|
|
else if (unresolvedThreads > 0) reviewState = 'outstanding';
|
|
else reviewState = 'addressed';
|
|
return { reviewState, unresolvedThreads, totalThreads };
|
|
}
|
|
|
|
export function deriveVerdicts(pr: ListPr): ReviewerVerdict[] {
|
|
const author = pr.author?.login;
|
|
return pr.latestReviews.nodes
|
|
.filter(
|
|
(r): r is typeof r & { state: 'APPROVED' | 'CHANGES_REQUESTED' } =>
|
|
(r.state === 'APPROVED' || r.state === 'CHANGES_REQUESTED') &&
|
|
r.author?.login !== undefined &&
|
|
r.author.login !== author,
|
|
)
|
|
.map((r) => ({
|
|
reviewer: r.author!.login,
|
|
state: r.state,
|
|
url: r.url,
|
|
submittedAt: r.submittedAt,
|
|
}));
|
|
}
|