From 8f0c8581f9308b51636ae4ff55d88d1688f2df7e Mon Sep 17 00:00:00 2001 From: QLHazyCoder <2825305047@qq.com> Date: Fri, 17 Apr 2026 19:34:10 +0800 Subject: [PATCH] chore: align version display with Pro release standard --- sidepanel/sidepanel.html | 2 +- sidepanel/sidepanel.js | 20 ++++--- sidepanel/update-service.js | 111 +++++++++++++++++++++++++++++------- 3 files changed, 102 insertions(+), 31 deletions(-) diff --git a/sidepanel/sidepanel.html b/sidepanel/sidepanel.html index 7e8d4c2..4a8d167 100644 --- a/sidepanel/sidepanel.html +++ b/sidepanel/sidepanel.html @@ -22,7 +22,7 @@
-
v0.0.0
+
Pro0.0
diff --git a/sidepanel/sidepanel.js b/sidepanel/sidepanel.js index 95049d9..4e7d58f 100644 --- a/sidepanel/sidepanel.js +++ b/sidepanel/sidepanel.js @@ -1879,7 +1879,7 @@ function renderUpdateReleaseList(releases = []) { const version = document.createElement('span'); version.className = 'update-release-version'; - version.textContent = `v${release.version}`; + version.textContent = release.displayVersion || `Pro${release.version}`; titleRow.appendChild(version); if (release.title) { @@ -1933,7 +1933,7 @@ function renderReleaseSnapshot(snapshot) { extensionUpdateStatus.classList.remove('is-update-available', 'is-check-failed', 'is-version-label'); - const localVersionText = snapshot?.localVersion ? `v${snapshot.localVersion}` : ''; + const localVersionText = snapshot?.localVersion || ''; const logUrl = snapshot?.logUrl || snapshot?.releasesPageUrl || sidepanelUpdateService?.releasesPageUrl || ''; if (btnReleaseLog) { @@ -1955,13 +1955,13 @@ function renderReleaseSnapshot(snapshot) { updateSection.hidden = false; } if (updateCardVersion) { - updateCardVersion.textContent = `最新版本 v${snapshot.latestVersion}`; + updateCardVersion.textContent = `最新版本 ${snapshot.latestVersion}`; } if (updateCardSummary) { const updateCount = Array.isArray(snapshot.newerReleases) ? snapshot.newerReleases.length : 0; updateCardSummary.textContent = updateCount > 1 ? `当前 ${localVersionText},共有 ${updateCount} 个新版本可更新。` - : `当前 ${localVersionText},可更新到 v${snapshot.latestVersion}。`; + : `当前 ${localVersionText},可更新到 ${snapshot.latestVersion}。`; } renderUpdateReleaseList(snapshot.newerReleases || []); if (btnOpenRelease) { @@ -1973,14 +1973,14 @@ function renderReleaseSnapshot(snapshot) { } case 'latest': { - extensionUpdateStatus.textContent = localVersionText || 'v0.0.0'; + extensionUpdateStatus.textContent = localVersionText || 'Pro0.0'; extensionUpdateStatus.classList.add('is-version-label'); resetUpdateCard(); break; } case 'empty': { - extensionUpdateStatus.textContent = localVersionText || 'v0.0.0'; + extensionUpdateStatus.textContent = localVersionText || 'Pro0.0'; extensionUpdateStatus.classList.add('is-version-label'); resetUpdateCard(); break; @@ -1988,7 +1988,7 @@ function renderReleaseSnapshot(snapshot) { case 'error': default: { - extensionUpdateStatus.textContent = localVersionText || 'v0.0.0'; + extensionUpdateStatus.textContent = localVersionText || 'Pro0.0'; extensionUpdateStatus.classList.add('is-version-label', 'is-check-failed'); extensionVersionMeta.textContent = snapshot?.errorMessage || 'GitHub Releases 检查失败'; extensionVersionMeta.hidden = false; @@ -2009,8 +2009,10 @@ async function initializeReleaseInfo() { return; } - const localVersion = sidepanelUpdateService?.stripVersionPrefix?.(chrome.runtime.getManifest()?.version || '') || ''; - extensionUpdateStatus.textContent = localVersion ? `v${localVersion}` : 'v0.0.0'; + const localVersion = sidepanelUpdateService?.getLocalVersionLabel?.(chrome.runtime.getManifest()) + || chrome.runtime.getManifest()?.version_name + || (chrome.runtime.getManifest()?.version ? `v${chrome.runtime.getManifest().version}` : ''); + extensionUpdateStatus.textContent = localVersion || 'Pro0.0'; extensionUpdateStatus.classList.remove('is-update-available', 'is-check-failed'); extensionUpdateStatus.classList.add('is-version-label'); extensionVersionMeta.hidden = true; diff --git a/sidepanel/update-service.js b/sidepanel/update-service.js index 3b264dc..5487681 100644 --- a/sidepanel/update-service.js +++ b/sidepanel/update-service.js @@ -8,26 +8,78 @@ const FETCH_TIMEOUT_MS = 8000; const MAX_RELEASES = 10; const MAX_NOTES_PER_RELEASE = 5; + const VERSION_FAMILY_PRO = 'pro'; + const VERSION_FAMILY_LEGACY = 'legacy'; + + function getVersionFamily(version, fallbackFamily = VERSION_FAMILY_LEGACY) { + const trimmed = String(version || '').trim(); + if (/^pro/i.test(trimmed)) { + return VERSION_FAMILY_PRO; + } + if (/^v/i.test(trimmed)) { + return VERSION_FAMILY_LEGACY; + } + return fallbackFamily; + } function stripVersionPrefix(version) { - return String(version || '').trim().replace(/^v/i, ''); + return String(version || '').trim().replace(/^(?:pro|v)\s*/i, ''); } - function parseVersionParts(version) { + function extractVersionCore(version) { const core = stripVersionPrefix(version).split('-')[0]; + return /^\d+(?:\.\d+){1,3}$/.test(core) ? core : ''; + } + + function formatDisplayVersion(version, fallbackFamily = VERSION_FAMILY_LEGACY) { + const core = extractVersionCore(version); if (!core) { - return [0]; + return ''; } - return core.split('.').map((part) => { - const numeric = Number.parseInt(part, 10); - return Number.isFinite(numeric) ? numeric : 0; - }); + const family = getVersionFamily(version, fallbackFamily); + return `${family === VERSION_FAMILY_PRO ? 'Pro' : 'v'}${core}`; } - function compareVersions(left, right) { - const leftParts = parseVersionParts(left); - const rightParts = parseVersionParts(right); + function parseVersionMeta(version, fallbackFamily = VERSION_FAMILY_LEGACY) { + const family = getVersionFamily(version, fallbackFamily); + const core = extractVersionCore(version); + return { + family, + core, + displayVersion: core ? `${family === VERSION_FAMILY_PRO ? 'Pro' : 'v'}${core}` : '', + parts: core + ? core.split('.').map((part) => { + const numeric = Number.parseInt(part, 10); + return Number.isFinite(numeric) ? numeric : 0; + }) + : [0], + }; + } + + function getVersionFamilyRank(family) { + return family === VERSION_FAMILY_PRO ? 2 : 1; + } + + function parseVersionParts(version, fallbackFamily = VERSION_FAMILY_LEGACY) { + return parseVersionMeta(version, fallbackFamily).parts; + } + + function compareVersions(left, right, fallbackFamily = VERSION_FAMILY_LEGACY) { + const leftMeta = parseVersionMeta(left, fallbackFamily); + const rightMeta = parseVersionMeta(right, fallbackFamily); + const leftFamilyRank = getVersionFamilyRank(leftMeta.family); + const rightFamilyRank = getVersionFamilyRank(rightMeta.family); + + if (leftFamilyRank > rightFamilyRank) { + return 1; + } + if (leftFamilyRank < rightFamilyRank) { + return -1; + } + + const leftParts = leftMeta.parts; + const rightParts = rightMeta.parts; const maxLength = Math.max(leftParts.length, rightParts.length, 3); for (let index = 0; index < maxLength; index += 1) { @@ -100,26 +152,31 @@ ]; for (const candidate of candidates) { - const normalized = stripVersionPrefix(candidate); - if (normalized) { - return normalized; + const meta = parseVersionMeta(candidate); + if (meta.core) { + return meta; } } - return ''; + return null; } function sanitizeRelease(release) { - const version = normalizeReleaseVersion(release); - if (!version) { + const versionMeta = normalizeReleaseVersion(release); + if (!versionMeta?.core) { return null; } const rawTitle = sanitizeInlineMarkdown(release?.name || ''); - const normalizedTitle = stripVersionPrefix(rawTitle) === version ? '' : rawTitle; + const titleMeta = parseVersionMeta(rawTitle, versionMeta.family); + const normalizedTitle = titleMeta.core && titleMeta.displayVersion === versionMeta.displayVersion + ? '' + : rawTitle; return { - version, + version: versionMeta.core, + displayVersion: versionMeta.displayVersion, + family: versionMeta.family, title: normalizedTitle, url: String(release?.html_url || RELEASES_PAGE_URL), publishedAt: String(release?.published_at || release?.created_at || ''), @@ -228,11 +285,11 @@ }; } - const newerReleases = releases.filter((release) => compareVersions(release.version, localVersion) > 0); + const newerReleases = releases.filter((release) => compareVersions(release.displayVersion, localVersion) > 0); return { status: newerReleases.length > 0 ? 'update-available' : 'latest', localVersion, - latestVersion: latestRelease.version, + latestVersion: latestRelease.displayVersion, latestRelease, newerReleases, logUrl: latestRelease.url || RELEASES_PAGE_URL, @@ -241,8 +298,18 @@ }; } + function getLocalVersionLabel(manifest = chrome.runtime.getManifest()) { + const versionName = formatDisplayVersion(manifest?.version_name, VERSION_FAMILY_PRO); + if (versionName) { + return versionName; + } + + const versionCore = extractVersionCore(manifest?.version || ''); + return versionCore ? formatDisplayVersion(`v${versionCore}`, VERSION_FAMILY_LEGACY) : ''; + } + async function getReleaseSnapshot(options = {}) { - const localVersion = stripVersionPrefix(chrome.runtime.getManifest()?.version || '0.0.0'); + const localVersion = getLocalVersionLabel(chrome.runtime.getManifest()) || 'v0.0.0'; try { const releases = await loadReleases(options); @@ -280,7 +347,9 @@ window.SidepanelUpdateService = { compareVersions, + formatDisplayVersion, formatReleaseDate, + getLocalVersionLabel, getReleaseSnapshot, releasesPageUrl: RELEASES_PAGE_URL, stripVersionPrefix,