93 lines
1.9 KiB
TypeScript
93 lines
1.9 KiB
TypeScript
/**
|
|
* 版本管理模块
|
|
* @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<VersionInfo> {
|
|
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],
|
|
};
|
|
}
|