fix(android): derive helper version codes from prerelease semver cores

This commit is contained in:
AdzeB
2026-09-05 14:00:26 +01:00
parent f6c8a5cc7b
commit d2079895c6
6 changed files with 64 additions and 13 deletions
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "agent-device",
"version": "0.20.11-a1",
"version": "0.20.11-a2",
"description": "Mobile app automation and verification for AI coding agents. CLI, MCP server, and typed Node.js API for iOS, Android, HarmonyOS, TV, web, macOS, and Linux.",
"mcpName": "io.github.callstack/agent-device",
"license": "MIT",
@@ -101,7 +101,7 @@
"package:android-snapshot-helper": "AGENT_DEVICE_ANDROID_HELPER=snapshot sh ./scripts/package-android-helper.sh $(node -p \"require('./package.json').version\") v$(node -p \"require('./package.json').version\") .tmp/android-snapshot-helper",
"package:android-snapshot-helper:npm": "rm -rf android/snapshot-helper/dist && AGENT_DEVICE_ANDROID_HELPER=snapshot sh ./scripts/package-android-helper.sh $(node -p \"require('./package.json').version\") v$(node -p \"require('./package.json').version\") android/snapshot-helper/dist",
"package:apple-runner:npm": "node scripts/package-apple-runner-source.mjs",
"build:android": "pnpm package:android-snapshot-helper:npm && pnpm package:android-ime-helper:npm",
"build:android": "node --experimental-strip-types scripts/node-test-tmpdir.ts --test scripts/android-helper-version-code.test.mjs && pnpm package:android-snapshot-helper:npm && pnpm package:android-ime-helper:npm",
"build:android-ime-helper": "AGENT_DEVICE_ANDROID_HELPER=ime sh ./scripts/build-android-helper.sh $(node -p \"require('./package.json').version\") .tmp/android-ime-helper",
"package:android-ime-helper": "AGENT_DEVICE_ANDROID_HELPER=ime sh ./scripts/package-android-helper.sh $(node -p \"require('./package.json').version\") .tmp/android-ime-helper",
"package:android-ime-helper:npm": "rm -rf android/ime-helper/dist && AGENT_DEVICE_ANDROID_HELPER=ime sh ./scripts/package-android-helper.sh $(node -p \"require('./package.json').version\") android/ime-helper/dist",
+33
View File
@@ -0,0 +1,33 @@
import { pathToFileURL } from 'node:url';
export function androidHelperVersionCode(version) {
const [major, minor, patch] = parseSemverCore(version);
const code = major * 1000000 + minor * 1000 + patch;
assertRepresentableCode(code, minor, patch);
return code;
}
function parseSemverCore(version) {
const match =
/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/.exec(
version,
);
if (!match || match[4]?.split('.').some((part) => /^0\d+$/.test(part))) {
throw new Error('Android helper version must be valid SemVer');
}
return match.slice(1, 4).map(Number);
}
function assertRepresentableCode(code, minor, patch) {
if (minor >= 1000 || patch >= 1000 || !isAndroidVersionCode(code)) {
throw new Error('Android helper version cannot be represented as an Android version code');
}
}
function isAndroidVersionCode(code) {
return code >= 1 && code <= 2100000000;
}
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
process.stdout.write(`${androidHelperVersionCode(process.argv[2])}\n`);
}
@@ -0,0 +1,25 @@
import assert from 'node:assert/strict';
import { test } from 'node:test';
import { androidHelperVersionCode } from './android-helper-version-code.mjs';
for (const version of ['0.20.11', '0.20.11-a2', '0.20.11-alpha.2+build.7', '0.20.11+build.7']) {
test(`helper version ${version} retains its semver core code`, () => {
assert.equal(androidHelperVersionCode(version), 20011);
});
}
for (const version of [
'',
'dev',
'v0.20.11',
'00.20.11',
'0.20.11-01',
'0.20.11+',
'0.1000.0',
'0.0.0',
'2148.0.0',
]) {
test(`invalid or unrepresentable helper version ${version} is rejected`, () => {
assert.throws(() => androidHelperVersionCode(version));
});
}
+1 -9
View File
@@ -64,15 +64,7 @@ if [ -z "$BUILD_TOOLS_DIR" ] || [ ! -x "$BUILD_TOOLS_DIR/aapt2" ]; then
exit 1
fi
VERSION_CODE="$(
printf '%s\n' "$VERSION" | awk -F. '
/^[0-9]+[.][0-9]+[.][0-9]+$/ {
print ($1 * 1000000) + ($2 * 1000) + $3
next
}
{ print 1 }
'
)"
VERSION_CODE="$(node "$PROJECT_DIR/scripts/android-helper-version-code.mjs" "$VERSION")"
BUILD_DIR="$HELPER_DIR/build"
CLASSES_DIR="$BUILD_DIR/classes"
+2 -2
View File
@@ -7,12 +7,12 @@
"url": "https://github.com/callstack/agent-device",
"source": "github"
},
"version": "0.20.11-a1",
"version": "0.20.11-a2",
"packages": [
{
"registryType": "npm",
"identifier": "agent-device",
"version": "0.20.11-a1",
"version": "0.20.11-a2",
"transport": {
"type": "stdio"
},
@@ -65,6 +65,7 @@ test('the npm package build covers every package-owned output before verificatio
assert.equal(script('package:npm'), 'pnpm build:package && pnpm check:package');
assert.deepEqual(script('build:android').split(' && '), [
'node --experimental-strip-types scripts/node-test-tmpdir.ts --test scripts/android-helper-version-code.test.mjs',
'pnpm package:android-snapshot-helper:npm',
'pnpm package:android-ime-helper:npm',
]);