mirror of
https://github.com/EasyTier/easytier.github.io.git
synced 2026-10-19 16:16:34 +00:00
修复下载页面的稳定版、预发布版和 Nightly 通道 (#326)
下载页面目前只有稳定版和预发布版两个通道,并将 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>
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
import type { Release } from '../releaseUtils.ts'
|
||||
import assert from 'node:assert/strict'
|
||||
// eslint-disable-next-line test/no-import-node-test -- Use the built-in runner without adding a test framework.
|
||||
import { test } from 'node:test'
|
||||
import { findPrerelease, resolveDownloadUrl } from '../releaseUtils.ts'
|
||||
|
||||
const cliTemplate = 'https://github.com/EasyTier/EasyTier/releases/download/v{}/easytier-linux-x86_64-v{}.zip'
|
||||
const guiTemplate = 'https://github.com/EasyTier/EasyTier/releases/download/v{}/easytier-gui_{}_x64-setup.exe'
|
||||
|
||||
function release(tag_name: string, assets: string[] = [], prerelease = true): Release {
|
||||
return {
|
||||
tag_name,
|
||||
prerelease,
|
||||
assets: assets.map(name => ({ name, browser_download_url: `https://github.com/EasyTier/EasyTier/releases/download/${tag_name}/${name}` })),
|
||||
}
|
||||
}
|
||||
|
||||
test('ordinary prereleases exclude rolling nightly and draft releases', () => {
|
||||
const prerelease = release('v2.7.0')
|
||||
assert.equal(findPrerelease([
|
||||
release('nightly'),
|
||||
{ ...release('v2.8.0'), draft: true },
|
||||
prerelease,
|
||||
release('v2.6.4', [], false),
|
||||
]), prerelease)
|
||||
assert.equal(findPrerelease([release('nightly'), release('v2.6.4', [], false)]), null)
|
||||
})
|
||||
|
||||
test('nightly uses the actual release tag and versioned asset name', () => {
|
||||
const nightly = release('nightly', ['easytier-linux-x86_64-v2.7.0.zip'])
|
||||
assert.equal(resolveDownloadUrl(cliTemplate, nightly), 'https://github.com/EasyTier/EasyTier/releases/download/nightly/easytier-linux-x86_64-v2.7.0.zip')
|
||||
})
|
||||
|
||||
test('GUI asset versions can differ from the release version', () => {
|
||||
const prerelease = release('v2.6.1', ['easytier-gui_2.6.0_x64-setup.exe'])
|
||||
assert.equal(resolveDownloadUrl(guiTemplate, prerelease), 'https://github.com/EasyTier/EasyTier/releases/download/v2.6.1/easytier-gui_2.6.0_x64-setup.exe')
|
||||
})
|
||||
|
||||
test('Android assets without a version placeholder also resolve', () => {
|
||||
const nightly = release('nightly', ['app-arm64-release.apk'])
|
||||
assert.equal(resolveDownloadUrl('https://github.com/EasyTier/EasyTier/releases/download/v{}/app-arm64-release.apk', nightly), 'https://github.com/EasyTier/EasyTier/releases/download/nightly/app-arm64-release.apk')
|
||||
})
|
||||
|
||||
test('missing assets do not produce invented download links', () => {
|
||||
assert.equal(resolveDownloadUrl(cliTemplate, release('nightly', ['easytier-linux-aarch64-v2.7.0.zip'])), undefined)
|
||||
assert.equal(resolveDownloadUrl(guiTemplate, release('v2.6.4'), '2.6.4'), undefined)
|
||||
assert.equal(resolveDownloadUrl(cliTemplate, release('nightly', ['easytier-linux-x86_64-v2.7.0Xzip'])), undefined)
|
||||
})
|
||||
|
||||
test('API failure preserves stable and prerelease fallbacks without guessing nightly assets', () => {
|
||||
assert.equal(resolveDownloadUrl(cliTemplate, null, '2.6.4'), 'https://github.com/EasyTier/EasyTier/releases/download/v2.6.4/easytier-linux-x86_64-v2.6.4.zip')
|
||||
assert.equal(resolveDownloadUrl(guiTemplate, null, '2.7.0'), 'https://github.com/EasyTier/EasyTier/releases/download/v2.7.0/easytier-gui_2.7.0_x64-setup.exe')
|
||||
assert.equal(resolveDownloadUrl(cliTemplate, null), undefined)
|
||||
})
|
||||
Reference in New Issue
Block a user