mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-17 12:11:20 +00:00
47 lines
1.3 KiB
TypeScript
47 lines
1.3 KiB
TypeScript
import fsSync from "node:fs";
|
|
import path from "node:path";
|
|
import { openBoundaryFileSync } from "./boundary-file-read.js";
|
|
|
|
export function expectedIntegrityForUpdate(
|
|
spec: string | undefined,
|
|
integrity: string | undefined,
|
|
): string | undefined {
|
|
if (!integrity || !spec) {
|
|
return undefined;
|
|
}
|
|
const value = spec.trim();
|
|
if (!value) {
|
|
return undefined;
|
|
}
|
|
const at = value.lastIndexOf("@");
|
|
if (at <= 0 || at >= value.length - 1) {
|
|
return undefined;
|
|
}
|
|
const version = value.slice(at + 1).trim();
|
|
if (!/^v?\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(version)) {
|
|
return undefined;
|
|
}
|
|
return integrity;
|
|
}
|
|
|
|
export async function readInstalledPackageVersion(dir: string): Promise<string | undefined> {
|
|
const manifestPath = path.join(dir, "package.json");
|
|
const opened = openBoundaryFileSync({
|
|
absolutePath: manifestPath,
|
|
rootPath: dir,
|
|
boundaryLabel: "installed package directory",
|
|
});
|
|
if (!opened.ok) {
|
|
return undefined;
|
|
}
|
|
try {
|
|
const raw = fsSync.readFileSync(opened.fd, "utf-8");
|
|
const parsed = JSON.parse(raw) as { version?: unknown };
|
|
return typeof parsed.version === "string" ? parsed.version : undefined;
|
|
} catch {
|
|
return undefined;
|
|
} finally {
|
|
fsSync.closeSync(opened.fd);
|
|
}
|
|
}
|