jaycelu_Smart-Review/scripts/sync-plugin-release.js

72 lines
2.4 KiB
JavaScript
Raw Permalink Normal View History

2026-06-23 07:48:53 +00:00
import { readFileSync, writeFileSync } from "node:fs";
import { resolve } from "node:path";
const repoRoot = resolve(import.meta.dirname, "..");
const rootManifestPath = resolve(repoRoot, "manifest.json");
const pluginManifestPath = resolve(repoRoot, "apps/smart-review-plugin/manifest.json");
const rootVersionsPath = resolve(repoRoot, "versions.json");
const pluginVersionsPath = resolve(repoRoot, "apps/smart-review-plugin/versions.json");
const packagePaths = [
resolve(repoRoot, "package.json"),
resolve(repoRoot, "apps/smart-review-plugin/package.json"),
resolve(repoRoot, "packages/shared/package.json")
];
const rootManifest = readJson(rootManifestPath);
const pluginManifest = readJson(pluginManifestPath);
if (rootManifest.id !== pluginManifest.id) {
throw new Error(`Plugin id mismatch: root=${rootManifest.id}, plugin=${pluginManifest.id}`);
}
const version = rootManifest.version;
const minAppVersion = rootManifest.minAppVersion;
pluginManifest.version = version;
pluginManifest.minAppVersion = minAppVersion;
writeJson(pluginManifestPath, pluginManifest);
for (const manifestPath of [rootManifestPath, pluginManifestPath]) {
const manifest = readJson(manifestPath);
if (!manifest.version || !manifest.minAppVersion) {
throw new Error(`${manifestPath} must include version and minAppVersion`);
}
}
for (const packagePath of packagePaths) {
const packageJson = readJson(packagePath);
packageJson.version = version;
writeJson(packagePath, packageJson);
}
for (const versionsPath of [rootVersionsPath, pluginVersionsPath]) {
const versions = readJson(versionsPath);
versions[version] = minAppVersion;
writeJson(versionsPath, sortVersionMap(versions));
}
console.log(`Synced Smart Review release metadata to ${version} (Obsidian >= ${minAppVersion}).`);
function readJson(path) {
return JSON.parse(readFileSync(path, "utf8"));
}
function writeJson(path, value) {
writeFileSync(path, `${JSON.stringify(value, null, 2)}\n`);
}
function sortVersionMap(value) {
return Object.fromEntries(
Object.entries(value).sort(([left], [right]) => compareSemver(left, right))
);
}
function compareSemver(left, right) {
const leftParts = left.split(".").map(Number);
const rightParts = right.split(".").map(Number);
for (let index = 0; index < Math.max(leftParts.length, rightParts.length); index += 1) {
const delta = (leftParts[index] ?? 0) - (rightParts[index] ?? 0);
if (delta !== 0) return delta;
}
return 0;
}