diff options
| author | Maze Winther <mazewinther@gmail.com> | 2026-03-02 00:55:08 +0100 |
|---|---|---|
| committer | Maze Winther <mazewinther@gmail.com> | 2026-03-02 00:55:08 +0100 |
| commit | 77a3708213606d520833944141c3aa9169954e07 (patch) | |
| tree | a9d9edf5abc209a1bb02a109ceed6fc5e5c445fb /apps/web/src/app/changelog/utils.ts | |
| parent | 9a00e8ac5b77e8d82102457aaffd19945a2f52cb (diff) | |
| download | opencut-77a3708213606d520833944141c3aa9169954e07.tar.gz | |
web: refactor changelog to support a dedicated page for each version + links for each release
Diffstat (limited to 'apps/web/src/app/changelog/utils.ts')
| -rw-r--r-- | apps/web/src/app/changelog/utils.ts | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/apps/web/src/app/changelog/utils.ts b/apps/web/src/app/changelog/utils.ts new file mode 100644 index 00000000..163207c0 --- /dev/null +++ b/apps/web/src/app/changelog/utils.ts @@ -0,0 +1,43 @@ +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<string, string> = { + new: "Features", + improved: "Improvements", + fixed: "Fixes", + breaking: "Breaking Changes", +}; + +export function getSectionTitle(type: string): string { + return ( + knownSectionTitles[type] ?? type.charAt(0).toUpperCase() + type.slice(1) + ); +} + +export function groupAndOrderChanges({ changes }: { changes: Change[] }) { + const grouped = changes.reduce<Record<string, Change[]>>((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 }; +} + +export function getSortedReleases() { + return [...allChangelogs].sort((a, b) => + b.version.localeCompare(a.version, undefined, { numeric: true }), + ); +} |
