Files

132 lines
3.9 KiB
JavaScript

// Sync the Python PEP 440 version from src/pineagents/__version__.py into a
// gitignored Tauri config override. Do not write the tracked tauri.conf.json:
// its version would otherwise become a stale generated value after rebases.
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
const scriptDir = path.dirname(fileURLToPath(import.meta.url));
const repoRoot = path.resolve(scriptDir, "../..");
const versionFile = path.join(repoRoot, "src/pineagents/__version__.py");
const tauriConfigFile = path.join(
repoRoot,
"console/src-tauri/tauri.conf.json",
);
const tauriVersionConfigFile = path.join(
repoRoot,
"console/src-tauri/tauri.version.conf.json",
);
function readPythonVersion() {
const text = fs.readFileSync(versionFile, "utf8");
const match = text.match(/__version__\s*=\s*"([^"]+)"/);
if (!match) {
throw new Error(`Could not read __version__ from ${versionFile}`);
}
return match[1];
}
function toSemver(version) {
const match = version.match(
/^(\d+)\.(\d+)\.(\d+)(?:(a|b|rc)(\d+))?(?:\.post(\d+))?(?:\.dev(\d+))?$/,
);
if (!match) {
throw new Error(`Unsupported Python version for Tauri: ${version}`);
}
const [, major, minor, patch, prerelease, prereleaseNumber, post, dev] =
match;
const prereleaseMap = { a: "alpha", b: "beta", rc: "rc" };
const labels = [];
if (prerelease)
labels.push(`${prereleaseMap[prerelease]}.${prereleaseNumber}`);
if (dev) labels.push(`dev.${dev}`);
const prereleaseSuffix = labels.length ? `-${labels.join(".")}` : "";
const postMetadata = post ? `+post.${post}` : "";
return `${major}.${minor}.${patch}${prereleaseSuffix}${postMetadata}`;
}
function readBaseUpdaterConfig() {
const config = JSON.parse(fs.readFileSync(tauriConfigFile, "utf8"));
const updater = config?.plugins?.updater ?? {};
if (!updater.pubkey) {
throw new Error(
`Could not read plugins.updater.pubkey from ${tauriConfigFile}`,
);
}
return updater;
}
function readUpdaterEndpoints(baseUpdater) {
const raw = process.env.TAURI_UPDATER_ENDPOINTS?.trim();
if (!raw) return baseUpdater.endpoints;
if (raw.startsWith("[")) {
const parsed = JSON.parse(raw);
if (
!Array.isArray(parsed) ||
parsed.some((entry) => typeof entry !== "string")
) {
throw new Error(
"TAURI_UPDATER_ENDPOINTS JSON must be an array of strings",
);
}
return parsed;
}
return raw
.split(/[\n,]/)
.map((entry) => entry.trim())
.filter(Boolean);
}
function shouldCreateUpdaterArtifacts() {
return Boolean(process.env.TAURI_SIGNING_PRIVATE_KEY?.trim());
}
function writeTauriVersionConfig(file, version) {
const baseUpdater = readBaseUpdaterConfig();
const pubkey = process.env.TAURI_UPDATER_PUBKEY?.trim() || baseUpdater.pubkey;
const endpoints = readUpdaterEndpoints(baseUpdater);
const createUpdaterArtifacts = shouldCreateUpdaterArtifacts();
const config = {
version,
...(createUpdaterArtifacts
? {
bundle: {
createUpdaterArtifacts: true,
},
}
: {}),
plugins: {
updater: {
pubkey,
...(endpoints?.length ? { endpoints } : {}),
},
},
};
fs.writeFileSync(file, `${JSON.stringify(config, null, 2)}\n`);
console.log(
`Using updater pubkey from ${
process.env.TAURI_UPDATER_PUBKEY?.trim()
? "TAURI_UPDATER_PUBKEY"
: "tauri.conf.json"
}`,
);
if (process.env.TAURI_UPDATER_ENDPOINTS?.trim()) {
console.log("Using updater endpoints from TAURI_UPDATER_ENDPOINTS");
}
console.log(
createUpdaterArtifacts
? "Creating Tauri updater artifacts"
: "Skipping Tauri updater artifacts because TAURI_SIGNING_PRIVATE_KEY is not set",
);
}
const semver = toSemver(readPythonVersion());
writeTauriVersionConfig(tauriVersionConfigFile, semver);
console.log(`Wrote Tauri version override ${semver}`);