mirror of
https://github.com/EasyTier/easytier.github.io.git
synced 2026-10-19 16:16:34 +00:00
下载页面目前只有稳定版和预发布版两个通道,并将 GitHub 返回的第一个预发布版本作为普通预发布版。官方新增 Nightly 后,这会误选 `nightly`,并拼出错误的版本标签和下载地址。 此次修改为中英文下载页面补齐稳定版、预发布版、开发版(Nightly)三个通道。普通预发布版明确排除 Nightly 和草稿;下载链接按发布资产中的真实文件名和地址匹配,支持 Nightly 标签与安装包版本号不同的情况。 各通道分别处理接口失败,稳定版和预发布版保留版本回退,Nightly 无法加载或暂无资产时提供官方发布页入口。同步将预发布版回退版本更新为 `2.7.0`。 验证: - `pnpm docs:build` 构建通过。 - `pnpm exec eslint useLatestVersion.ts releaseUtils.ts metadata.data.ts tests/releaseUtils.test.ts` 检查通过。 - `node --experimental-strip-types --test tests/releaseUtils.test.ts`:6 项回归测试通过,覆盖通道区分、Nightly 下载地址、GUI 资产版本差异、Android 安装包、缺失资产和接口失败回退。 - 浏览器验证中英文通道切换、操作系统和架构筛选、GitHub 加速前缀及构建后的页面预览。 Co-authored-by: Codex <codex@local>
43 lines
1.8 KiB
TypeScript
43 lines
1.8 KiB
TypeScript
import type { Release } from './releaseUtils'
|
|
import { computed, onMounted, ref } from 'vue'
|
|
import { findPrerelease } from './releaseUtils'
|
|
|
|
export function useLatestVersion() {
|
|
const latestRelease = ref<Release | null>(null)
|
|
const prereleaseRelease = ref<Release | null>(null)
|
|
const nightlyRelease = ref<Release | null>(null)
|
|
const latestVersion = computed(() => latestRelease.value?.tag_name.replace(/^v/, '') ?? null)
|
|
const prereleaseVersion = computed(() => prereleaseRelease.value?.tag_name.replace(/^v/, '') ?? null)
|
|
const loading = ref(true)
|
|
const error = ref<string | null>(null)
|
|
|
|
onMounted(async () => {
|
|
async function fetchRelease<T>(path: string): Promise<T> {
|
|
const response = await fetch(`https://api.github.com/repos/EasyTier/EasyTier/releases${path}`, { signal: AbortSignal.timeout(10000) })
|
|
if (!response.ok)
|
|
throw new Error('Failed to fetch releases from GitHub API')
|
|
return response.json()
|
|
}
|
|
|
|
const [latest, releases, nightly] = await Promise.allSettled([
|
|
fetchRelease<Release>('/latest'),
|
|
fetchRelease<Release[]>('?per_page=100'),
|
|
fetchRelease<Release>('/tags/nightly'),
|
|
])
|
|
|
|
if (latest.status === 'fulfilled')
|
|
latestRelease.value = latest.value
|
|
if (releases.status === 'fulfilled')
|
|
prereleaseRelease.value = findPrerelease(releases.value)
|
|
if (nightly.status === 'fulfilled')
|
|
nightlyRelease.value = nightly.value
|
|
|
|
const failure = [latest, releases, nightly].find(result => result.status === 'rejected')
|
|
if (failure?.status === 'rejected')
|
|
error.value = failure.reason instanceof Error ? failure.reason.message : 'Unknown error'
|
|
loading.value = false
|
|
})
|
|
|
|
return { latestVersion, prereleaseVersion, latestRelease, prereleaseRelease, nightlyRelease, loading, error }
|
|
}
|