/** * 版本管理模块 * @module update/version */ import type { VersionInfo } from "../types.js"; import { createLogger } from "../utils/logger.js"; const MODULE = "update:version"; /** * 当前版本(从 package.json 读取) */ let CURRENT_VERSION = "1.0.0"; /** * 设置当前版本 */ export function setCurrentVersion(version: string): void { CURRENT_VERSION = version; } /** * 检查更新 */ export async function checkUpdate(): Promise { const log = createLogger(MODULE); try { // TODO: 从 npm registry 或 GitHub releases 获取最新版本 // 这里简化处理 const latestVersion = "1.0.0"; return { version: CURRENT_VERSION, latestVersion, hasUpdate: compareVersions(CURRENT_VERSION, latestVersion) < 0, }; } catch (error) { log.error("Failed to check update", error); return { version: CURRENT_VERSION, hasUpdate: false, }; } } /** * 比较版本号 * @returns -1: v1 < v2, 0: v1 == v2, 1: v1 > v2 */ export function compareVersions(v1: string, v2: string): number { const parts1 = v1.split(".").map(Number); const parts2 = v2.split(".").map(Number); for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) { const p1 = parts1[i] ?? 0; const p2 = parts2[i] ?? 0; if (p1 < p2) return -1; if (p1 > p2) return 1; } return 0; } /** * 解析版本号 */ export function parseVersion(version: string): { major: number; minor: number; patch: number; prerelease?: string; build?: string; } { const match = version.match( /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-([a-zA-Z0-9.-]+))?(?:\\+([a-zA-Z0-9.-]+))?$/ ); if (!match) { throw new Error(`Invalid version: ${version}`); } return { major: parseInt(match[1], 10), minor: parseInt(match[2], 10), patch: parseInt(match[3], 10), prerelease: match[4], build: match[5], }; }