import { allChangelogs } from "content-collections"; export type Change = { type: string; text: string }; export type Release = (typeof allChangelogs)[number]; const knownSectionOrder = ["new", "improved", "fixed", "breaking"]; const knownSectionTitles: Record = { new: "Features", improved: "Improvements", fixed: "Fixes", breaking: "Breaking Changes", }; export function getSectionTitle({ type }: { type: string }): string { return ( knownSectionTitles[type] ?? type.charAt(0).toUpperCase() + type.slice(1) ); } export function groupAndOrderChanges({ changes }: { changes: Change[] }) { const grouped = changes.reduce>((acc, change) => { if (!acc[change.type]) acc[change.type] = []; acc[change.type].push(change); return acc; }, {}); const customTypes = Object.keys(grouped).filter( (type) => !knownSectionOrder.includes(type), ); const orderedTypes = [ ...knownSectionOrder.filter((type) => grouped[type]?.length > 0), ...customTypes, ]; return { grouped, orderedTypes }; } function isPublishedRelease({ published }: Release) { return published !== false; } export function getSortedReleases() { return allChangelogs .filter(isPublishedRelease) .sort((a, b) => b.version.localeCompare(a.version, undefined, { numeric: true }), ); } export function getReleaseByVersion({ version }: { version: string }) { return getSortedReleases().find((release) => release.version === version); }