Files
PIT_Channel/src/update/version.ts

93 lines
1.9 KiB
TypeScript
Raw Normal View History

/**
*
* @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],
};
}