fix typescript lint errors, refactoring

This commit is contained in:
Robert Wolff 2025-01-16 16:54:13 +01:00
parent b280ad4952
commit 13bbdc024f
4 changed files with 37 additions and 32 deletions

View file

@ -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
<Icon name="octicon:container-24" class="w-4 h-4 mr-1 -mt-1 inline-block" />
<a
class="text-primary-700 hover:text-primary-500 dark:text-primary-400 dark:hover:text-primary-600 transition ease-in duration-200"
href={`https://codeberg.org/forgejo/-/packages/container/forgejo/${version}`}
href={`https://codeberg.org/forgejo/-/packages/container/forgejo/${rv.version}`}
>
Get container image →
</a>

View file

@ -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,
};
});

View file

@ -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('/');

View file

@ -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);
};