#!/usr/bin/env tsx /** * Annotate [Unreleased] entries from typed pull request changelog blocks. */ import type { ExecSyncOptions } from 'node:child_process'; import { readFileSync, writeFileSync } from 'node:fs'; export interface AnnotateChangelogDeps { execSync: (command: string, options?: ExecSyncOptions) => Buffer | string; readFileSync: typeof readFileSync; writeFileSync: typeof writeFileSync; getEnv: (key: string) => string | undefined; log: (message: string) => void; warn: (message: string) => void; } export interface PullRequestInfo { number: number; body?: string | null; merged_at?: string | null; } export interface ChangelogEntry { section: string; text: string; rawLine: string; shaList: string[]; prNumber: number | null; order: number; } export interface ChangelogNote { section: string; text: string; } interface UnreleasedBlock { prefix: string; body: string; suffix: string; } type SectionItem = { kind: 'note'; line: string; } | { kind: 'entry'; entry: ChangelogEntry; }; interface ParsedSection { heading: string | null; items: SectionItem[]; } interface ParsedUnreleased { entries: ChangelogEntry[]; sections: ParsedSection[]; } interface CandidateGroup { key: string; kind: 'pr' | 'sha'; ref: string; entries: ChangelogEntry[]; primarySha: string | null; } interface ResolvedGroup { pr: PullRequestInfo; entries: ChangelogEntry[]; primarySha: string | null; } export declare function extractUnreleasedBlock(changelog: string, changelogPath?: string): UnreleasedBlock; export declare function normalizeSectionHeading(rawHeading: string): string; export declare function extractCommitShas(value: string): string[]; export declare function extractPrNumber(value: string): number | null; export declare function choosePrimarySha(values: Array): string | null; export declare function parseUnreleasedEntries(body: string): ParsedUnreleased; export declare function groupEntriesForLookup(entries: ChangelogEntry[]): { groups: CandidateGroup[]; passthrough: ChangelogEntry[]; }; export declare function fetchPullRequestByNumber(prNumber: number, ownerRepo: string, deps: AnnotateChangelogDeps): PullRequestInfo | null; export declare function fetchPullRequestBySha(sha: string, ownerRepo: string, deps: AnnotateChangelogDeps): PullRequestInfo | null; export declare function resolvePullRequestGroups(groups: CandidateGroup[], ownerRepo: string, deps: AnnotateChangelogDeps): { resolved: ResolvedGroup[]; unresolved: ChangelogEntry[]; }; export declare function extractStructuredChangelogNotes(body: string | null | undefined, options?: { prNumber?: number; warn?: (message: string) => void; }): ChangelogNote[]; export declare function renderAnnotatedBody(parsed: ParsedUnreleased, resolvedGroups: ResolvedGroup[], repoUrl: string, deps: AnnotateChangelogDeps): { body: string; appliedPrCount: number; } | null; export declare function annotateChangelog(deps: AnnotateChangelogDeps): void; export {};