


























11// Android Version script supports OpenClaw repository automation.
22import { readFileSync, writeFileSync } from "node:fs";
33import path from "node:path";
4+import { parseReleaseVersion } from "./npm-publish-plan.mjs";
4556const ANDROID_VERSION_FILE = "apps/android/version.json";
67const ANDROID_VERSION_PROPERTIES_FILE = "apps/android/Config/Version.properties";
7-8-const PINNED_ANDROID_VERSION_PATTERN = /^(\d{4}\.\d{1,2}\.[1-9]\d*)$/u;
9-const GATEWAY_VERSION_PATTERN = /^(\d{4}\.\d{1,2}\.[1-9]\d*)(?:-(?:alpha\.\d+|beta\.\d+|\d+))?$/u;
8+const ANDROID_VERSION_CODE_MAX = 2_100_000_000;
1091110type AndroidVersionManifest = {
1211version: string;
@@ -26,20 +25,28 @@ function normalizeTrailingNewline(value: string): string {
2625return value.endsWith("\n") ? value : `${value}\n`;
2726}
282728+function parsePinnedReleaseVersion(rawVersion: string): string | null {
29+const parsed = parseReleaseVersion(rawVersion.trim());
30+if (!parsed || parsed.version !== parsed.baseVersion) {
31+return null;
32+}
33+return parsed.baseVersion;
34+}
35+2936export function normalizePinnedAndroidVersion(rawVersion: string): string {
3037const trimmed = rawVersion.trim();
3138if (!trimmed) {
3239throw new Error(`Missing Android version in ${ANDROID_VERSION_FILE}.`);
3340}
344135-const match = PINNED_ANDROID_VERSION_PATTERN.exec(trimmed);
36-if (!match) {
42+const pinnedVersion = parsePinnedReleaseVersion(trimmed);
43+if (!pinnedVersion) {
3744throw new Error(
3845`Invalid Android version '${rawVersion}'. Expected pinned release version like 2026.6.5.`,
3946);
4047}
414842-return match[1] ?? trimmed;
49+return pinnedVersion;
4350}
44514552export function normalizeGatewayVersionToPinnedAndroidVersion(rawVersion: string): string {
@@ -48,30 +55,38 @@ export function normalizeGatewayVersionToPinnedAndroidVersion(rawVersion: string
4855throw new Error("Missing root package.json version.");
4956}
505751-const match = GATEWAY_VERSION_PATTERN.exec(trimmed);
52-if (!match) {
58+const parsed = parseReleaseVersion(trimmed);
59+if (!parsed) {
5360throw new Error(
5461`Invalid gateway version '${rawVersion}'. Expected YYYY.M.PATCH, YYYY.M.PATCH-alpha.N, YYYY.M.PATCH-beta.N, or YYYY.M.PATCH-N.`,
5562);
5663}
576458-return match[1] ?? trimmed;
65+return parsed.baseVersion;
5966}
60676168export function canonicalAndroidVersionCode(version: string): number {
6269const canonicalVersion = normalizePinnedAndroidVersion(version);
6370const [year, rawMonth, rawPatch] = canonicalVersion.split(".");
6471const month = rawMonth?.padStart(2, "0");
6572const patch = rawPatch?.padStart(2, "0");
66-const versionCode = Number.parseInt(`${year}${month}${patch}01`, 10);
67-if (!Number.isInteger(versionCode)) {
73+const versionCode = Number(`${year}${month}${patch}01`);
74+if (
75+!Number.isSafeInteger(versionCode) ||
76+versionCode <= 0 ||
77+versionCode > ANDROID_VERSION_CODE_MAX
78+) {
6879throw new Error(`Unable to derive Android versionCode from ${canonicalVersion}.`);
6980}
7081return versionCode;
7182}
72837384export function normalizeAndroidVersionCode(rawVersionCode: number, version: string): number {
74-if (!Number.isInteger(rawVersionCode) || rawVersionCode <= 0 || rawVersionCode > 2_100_000_000) {
85+if (
86+!Number.isInteger(rawVersionCode) ||
87+rawVersionCode <= 0 ||
88+rawVersionCode > ANDROID_VERSION_CODE_MAX
89+) {
7590throw new Error(
7691`Invalid Android versionCode '${rawVersionCode}'. Expected a positive integer no greater than 2100000000.`,
7792);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。