feat: PIT Channel plugin v1.0.0 - complete implementation
This commit is contained in:
92
src/update/version.ts
Normal file
92
src/update/version.ts
Normal file
@@ -0,0 +1,92 @@
|
||||
/**
|
||||
* 版本管理模块
|
||||
* @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],
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user