From 13bbdc024f055297afa1f4e09a96b7937fdbadab Mon Sep 17 00:00:00 2001 From: Robert Wolff Date: Thu, 16 Jan 2025 16:54:13 +0100 Subject: [PATCH] fix typescript lint errors, refactoring --- src/components/blog/ReleaseItem.astro | 10 ++++---- src/pages/docs/[...slug].astro | 12 +++++----- src/pages/download.astro | 13 +++++----- src/utils/releases.ts | 34 +++++++++++++++------------ 4 files changed, 37 insertions(+), 32 deletions(-) diff --git a/src/components/blog/ReleaseItem.astro b/src/components/blog/ReleaseItem.astro index e574a94..b7db9fd 100644 --- a/src/components/blog/ReleaseItem.astro +++ b/src/components/blog/ReleaseItem.astro @@ -4,16 +4,16 @@ import { Icon } from 'astro-icon/components'; import ReleaseStatus from '~/components/atoms/ReleaseStatus.astro'; import { getFormattedDate } from '~/utils/utils'; -import { getReleaseBlogPost, getReleaseNotesUrl } from '~/utils/releases'; +import { ReleaseVersion, getReleaseBlogPost, getReleaseNotesUrl } from '~/utils/releases'; import { getPermalink } from '~/utils/permalinks'; const { release } = Astro.props; -const version = release.tag_name.replace(/^v/, ''); +const rv = new ReleaseVersion(release); -const releaseNotesUrl = await getReleaseNotesUrl(version); +const releaseNotesUrl = await getReleaseNotesUrl(rv); -const releaseBlogPost = await getReleaseBlogPost(version); +const releaseBlogPost = await getReleaseBlogPost(rv); const releasePostUrl = releaseBlogPost && getPermalink(releaseBlogPost.slug, 'post'); --- @@ -74,7 +74,7 @@ const releasePostUrl = releaseBlogPost && getPermalink(releaseBlogPost.slug, 'po Get container image → diff --git a/src/pages/docs/[...slug].astro b/src/pages/docs/[...slug].astro index 512441e..8436ac9 100644 --- a/src/pages/docs/[...slug].astro +++ b/src/pages/docs/[...slug].astro @@ -3,23 +3,23 @@ import type { CollectionEntry } from 'astro:content'; import { getCollection } from 'astro:content'; import DocsLayout from '@layouts/DocsLayout.astro'; -import { getLatestRelease } from '~/utils/releases'; +import { getLatestReleaseVersion } from '~/utils/releases'; export type Props = CollectionEntry<'docs'>; export async function getStaticPaths() { - const latestRelease = await getLatestRelease(); - const [latestVersion] = /v\d+\.\d+/.exec(latestRelease.tag_name); + const latestReleaseVersion = await getLatestReleaseVersion(); + const latestDocsTag = latestReleaseVersion.docsTag(); const docsPages = await getCollection('docs'); const latestPaths: object[] = []; const paths = docsPages.map((page) => { - const version = page.id.split('/')[0]; + const docsTag = page.id.split('/')[0]; const [, ...slugParts] = page.slug.split('/'); - if (version == latestVersion) { + if (docsTag == latestDocsTag) { latestPaths.push({ params: { slug: ['latest', ...slugParts].join('/') }, props: page, @@ -27,7 +27,7 @@ export async function getStaticPaths() { } return { - params: { slug: [version, ...slugParts].join('/') }, + params: { slug: [docsTag, ...slugParts].join('/') }, props: page, }; }); diff --git a/src/pages/download.astro b/src/pages/download.astro index 26d22c8..3b72d3b 100644 --- a/src/pages/download.astro +++ b/src/pages/download.astro @@ -1,16 +1,17 @@ --- import type { Attachment } from 'gitea-js'; -import { getLatestRelease } from '~/utils/releases'; +import { getLatestReleaseVersion } from '~/utils/releases'; import Layout from '~/layouts/PageLayout.astro'; import { getRelativeLink } from '~/utils/permalinks'; -const latest = await getLatestRelease(); -const latest_v = latest.tag_name?.replace(/^v/, ''); -const latest_dl = latest.html_url?.replace('/tag/', '/download/'); +const latestReleaseVersion = await getLatestReleaseVersion(); +const latest_v = latestReleaseVersion.version; +const latest = latestReleaseVersion.release; +const latest_dl = latest?.html_url?.replace('/tag/', '/download/'); -const asset_bin = latest.assets?.find((asset: Attachment) => asset?.name === `forgejo-${latest_v}-linux-amd64`); -const asset_sig = latest.assets?.find((asset: Attachment) => asset?.name === `forgejo-${latest_v}-linux-amd64.asc`); +const asset_bin = latest?.assets?.find((asset: Attachment) => asset?.name === `forgejo-${latest_v}-linux-amd64`); +const asset_sig = latest?.assets?.find((asset: Attachment) => asset?.name === `forgejo-${latest_v}-linux-amd64.asc`); const asset_bin_lnk = [latest_dl, asset_bin?.name].join('/'); const asset_sig_lnk = [latest_dl, asset_sig?.name].join('/'); diff --git a/src/utils/releases.ts b/src/utils/releases.ts index c8de945..25f2938 100644 --- a/src/utils/releases.ts +++ b/src/utils/releases.ts @@ -8,7 +8,7 @@ const api = giteaApi('https://codeberg.org', {}); let _releases: Release[]; let _releaseBlogPosts: CollectionEntry<'blog'>[]; -const semverRegex = /^v(\d+)\.(\d+)\.(\d+)/; +const semverRegex = /^v((\d+)\.(\d+)\.(\d+))/; enum Comparison { LeftIsGreater = -1, @@ -26,16 +26,18 @@ function compare(a: number, b: number) { return Comparison.Equal; } -class ReleaseVersion { +export class ReleaseVersion { readonly release?: Release; + readonly version: string; readonly major: number; readonly minor: number; readonly patch: number; constructor(release?: Release) { this.release = release; - const [_, major, minor, patch] = semverRegex.exec(release?.tag_name || 'v0.0.0') || []; + const [_, version, major, minor, patch] = semverRegex.exec(release?.tag_name || 'v0.0.0') || []; + this.version = version; this.major = parseInt(major); this.minor = parseInt(minor); this.patch = parseInt(patch); @@ -53,6 +55,10 @@ class ReleaseVersion { } return compare(this.patch, other.patch); } + + docsTag() { + return `v${this.major}.${this.minor}`; + } } const _latestReleases = { @@ -104,13 +110,13 @@ async function ensureReleasesCached() { } /** Get the latest Forgejo release from Codeberg using the Forgejo API. */ -export const getLatestRelease = async () => { +export const getLatestReleaseVersion = async () => { await ensureReleasesCached(); - const release = _latestReleases.stable.release; - if (!release) { + const releaseVersion = _latestReleases.stable; + if (!releaseVersion?.release) { throw new Error('no stable release!'); } - return release; + return releaseVersion; }; export const releaseLabel = async (release: Release) => { @@ -124,21 +130,19 @@ export const releaseLabel = async (release: Release) => { return ''; }; -export const getReleaseNotesUrl = async (version: string) => { - const [_, major, patch] = /^(\d+)\.\d+\.(\d+)/.exec(version); - - if (major >= 9 || (major == 8 && patch > 0) || (major == 7 && patch > 6)) { - return `https://codeberg.org/forgejo/forgejo/src/branch/forgejo/release-notes-published/${version}.md`; +export const getReleaseNotesUrl = async (rv: ReleaseVersion) => { + if (rv.major >= 9 || (rv.major == 8 && rv.patch > 0) || (rv.major == 7 && rv.patch > 6)) { + return `https://codeberg.org/forgejo/forgejo/src/branch/forgejo/release-notes-published/${rv.version}.md`; } else { - const versionSlug = version.replaceAll('.', '-'); + const versionSlug = rv.version.replaceAll('.', '-'); return `https://codeberg.org/forgejo/forgejo/src/branch/forgejo/RELEASE-NOTES.md#${versionSlug}`; } }; /** Get the blog post for a release, if there is one. */ -export const getReleaseBlogPost = async (version: string) => { +export const getReleaseBlogPost = async (rv: ReleaseVersion) => { if (!_releaseBlogPosts) { _releaseBlogPosts = await getCollection('blog', ({ data }) => data.release); } - return _releaseBlogPosts.find(({ data }) => data.release == version); + return _releaseBlogPosts.find(({ data }) => data.release == rv.version); };