Compare commits

...
Author SHA1 Message Date
github-actions f5369c65a8 chore: publish
- appium@3.4.2
 - @appium/base-driver@10.5.2
 - @appium/base-plugin@3.2.4
 - @appium/docutils@2.4.2
 - @appium/fake-plugin@4.2.4
 - @appium/images-plugin@4.2.4
 - @appium/storage-plugin@1.1.4
 - @appium/support@7.2.2
 - @appium/test-support@4.1.4
2026-05-07 18:32:52 +00:00
Mykola Mokhnach 8c6c19982e fix(support): accept Uint8Array/ArrayBuffer in plist parse path (#22256) 2026-05-07 20:26:25 +02:00
Mykola Mokhnach e39017feac ci: Restore publish fallback script (#22255) 2026-05-07 20:25:25 +02:00
22 changed files with 258 additions and 54 deletions
+84 -1
View File
@@ -50,5 +50,88 @@ jobs:
printf "n\n" | npx lerna version --exact --no-git-tag-version --no-push
else
echo "Running lerna publish for real"
npm run release -- --yes
set +e
release_output="$(npm run release -- --yes 2>&1)"
release_exit_code=$?
set -e
printf '%s\n' "$release_output"
if [ $release_exit_code -eq 0 ]; then
exit 0
fi
if [[ "$release_output" == *"fatal: tag '"*"' already exists"* ]]; then
existing_tag="$(printf '%s\n' "$release_output" | sed -n "s/.*fatal: tag '\\([^']*\\)' already exists.*/\\1/p" | head -n 1)"
if [ -z "$existing_tag" ]; then
echo "Detected existing tag failure, but could not parse tag name"
exit $release_exit_code
fi
echo "Detected existing tag failure for ${existing_tag}; attempting scoped publish recovery from tagged commit"
git fetch --tags --force origin
tagged_commit="$(git rev-list -n 1 "$existing_tag")"
if [ -z "$tagged_commit" ]; then
echo "Tag ${existing_tag} was not found after fetching tags"
exit $release_exit_code
fi
git checkout "$tagged_commit"
missing=()
for pkg_json in packages/*/package.json; do
if [ ! -f "$pkg_json" ]; then
continue
fi
if [ "$(jq -r '.private // false' "$pkg_json")" = "true" ]; then
continue
fi
pkg_name="$(jq -r '.name // empty' "$pkg_json")"
pkg_version="$(jq -r '.version // empty' "$pkg_json")"
if [ -z "$pkg_name" ] || [ -z "$pkg_version" ]; then
echo "Skipping malformed package manifest: $pkg_json"
continue
fi
pkg_spec="${pkg_name}@${pkg_version}"
if ! npm view "$pkg_spec" version >/dev/null 2>&1; then
missing+=("$pkg_spec")
fi
done
if [ ${#missing[@]} -gt 0 ]; then
echo "Missing package versions on npm before scoped recovery:"
printf ' - %s\n' "${missing[@]}"
echo "Publishing missing packages one-by-one with scope"
for pkg_spec in "${missing[@]}"; do
pkg_name="${pkg_spec%@*}"
echo "Publishing ${pkg_name}"
set +e
npx lerna publish from-package --yes --scope "$pkg_name"
scoped_exit_code=$?
set -e
if [ $scoped_exit_code -ne 0 ]; then
echo "Scoped publish exited non-zero for ${pkg_name}; will verify on npm"
fi
done
final_missing=()
for pkg_spec in "${missing[@]}"; do
if ! npm view "$pkg_spec" version >/dev/null 2>&1; then
final_missing+=("$pkg_spec")
fi
done
if [ ${#final_missing[@]} -gt 0 ]; then
echo "Recovery incomplete after scoped retries. Still missing:"
printf ' - %s\n' "${final_missing[@]}"
exit $release_exit_code
fi
fi
echo "All publishable workspace package versions are present on npm; treating recovery as successful."
else
echo "Release failed and no known recovery condition matched"
exit $release_exit_code
fi
fi
+22 -22
View File
@@ -19337,16 +19337,16 @@
}
},
"packages/appium": {
"version": "3.4.1",
"version": "3.4.2",
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"@appium/base-driver": "10.5.1",
"@appium/base-plugin": "3.2.3",
"@appium/docutils": "2.4.1",
"@appium/base-driver": "10.5.2",
"@appium/base-plugin": "3.2.4",
"@appium/docutils": "2.4.2",
"@appium/logger": "2.0.7",
"@appium/schema": "1.1.1",
"@appium/support": "7.2.1",
"@appium/support": "7.2.2",
"@appium/types": "1.4.0",
"@sidvind/better-ajv-errors": "5.0.0",
"ajv": "8.20.0",
@@ -19425,10 +19425,10 @@
},
"packages/base-driver": {
"name": "@appium/base-driver",
"version": "10.5.1",
"version": "10.5.2",
"license": "Apache-2.0",
"dependencies": {
"@appium/support": "7.2.1",
"@appium/support": "7.2.2",
"@appium/types": "1.4.0",
"@colors/colors": "1.6.0",
"async-lock": "1.4.1",
@@ -19481,11 +19481,11 @@
},
"packages/base-plugin": {
"name": "@appium/base-plugin",
"version": "3.2.3",
"version": "3.2.4",
"license": "Apache-2.0",
"dependencies": {
"@appium/base-driver": "10.5.1",
"@appium/support": "7.2.1",
"@appium/base-driver": "10.5.2",
"@appium/support": "7.2.2",
"@appium/types": "1.4.0"
},
"engines": {
@@ -19495,10 +19495,10 @@
},
"packages/docutils": {
"name": "@appium/docutils",
"version": "2.4.1",
"version": "2.4.2",
"license": "Apache-2.0",
"dependencies": {
"@appium/support": "7.2.1",
"@appium/support": "7.2.2",
"consola": "3.4.2",
"diff": "9.0.0",
"lilconfig": "3.1.3",
@@ -19861,11 +19861,11 @@
},
"packages/fake-plugin": {
"name": "@appium/fake-plugin",
"version": "4.2.3",
"version": "4.2.4",
"license": "Apache-2.0",
"dependencies": {
"@appium/base-plugin": "3.2.3",
"@appium/support": "7.2.1",
"@appium/base-plugin": "3.2.4",
"@appium/support": "7.2.2",
"asyncbox": "6.2.0",
"lodash": "4.18.1"
},
@@ -19883,11 +19883,11 @@
},
"packages/images-plugin": {
"name": "@appium/images-plugin",
"version": "4.2.3",
"version": "4.2.4",
"license": "Apache-2.0",
"dependencies": {
"@appium/opencv": "4.1.4",
"@appium/support": "7.2.1",
"@appium/support": "7.2.2",
"lodash": "4.18.1",
"lru-cache": "11.3.5",
"sharp": "0.34.5"
@@ -20000,10 +20000,10 @@
},
"packages/storage-plugin": {
"name": "@appium/storage-plugin",
"version": "1.1.3",
"version": "1.1.4",
"license": "Apache-2.0",
"dependencies": {
"@appium/support": "7.2.1",
"@appium/support": "7.2.2",
"async-lock": "1.4.1",
"asyncbox": "6.2.0",
"lodash": "4.18.1",
@@ -20057,7 +20057,7 @@
},
"packages/support": {
"name": "@appium/support",
"version": "7.2.1",
"version": "7.2.2",
"license": "Apache-2.0",
"dependencies": {
"@appium/logger": "2.0.7",
@@ -20369,11 +20369,11 @@
},
"packages/test-support": {
"name": "@appium/test-support",
"version": "4.1.3",
"version": "4.1.4",
"deprecated": "This module is deprecated. Use sinon directly instead (e.g., sinon.createSandbox() with Mocha hooks).",
"license": "Apache-2.0",
"dependencies": {
"@appium/support": "7.2.1",
"@appium/support": "7.2.2",
"@colors/colors": "1.6.0",
"bluebird": "3.7.2",
"lodash": "4.18.1",
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.4.2](https://github.com/appium/appium/compare/appium@3.4.1...appium@3.4.2) (2026-05-07)
**Note:** Version bump only for package appium
## [3.4.1](https://github.com/appium/appium/compare/appium@3.4.0...appium@3.4.1) (2026-05-06)
**Note:** Version bump only for package appium
+5 -5
View File
@@ -1,6 +1,6 @@
{
"name": "appium",
"version": "3.4.1",
"version": "3.4.2",
"description": "Automation for Apps.",
"keywords": [
"automation",
@@ -60,12 +60,12 @@
"test:unit": "mocha \"./test/unit/**/*.spec.ts\""
},
"dependencies": {
"@appium/base-driver": "10.5.1",
"@appium/base-plugin": "3.2.3",
"@appium/docutils": "2.4.1",
"@appium/base-driver": "10.5.2",
"@appium/base-plugin": "3.2.4",
"@appium/docutils": "2.4.2",
"@appium/logger": "2.0.7",
"@appium/schema": "1.1.1",
"@appium/support": "7.2.1",
"@appium/support": "7.2.2",
"@appium/types": "1.4.0",
"@sidvind/better-ajv-errors": "5.0.0",
"ajv": "8.20.0",
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [10.5.2](https://github.com/appium/appium/compare/@appium/base-driver@10.5.1...@appium/base-driver@10.5.2) (2026-05-07)
**Note:** Version bump only for package @appium/base-driver
## [10.5.1](https://github.com/appium/appium/compare/@appium/base-driver@10.5.0...@appium/base-driver@10.5.1) (2026-05-06)
**Note:** Version bump only for package @appium/base-driver
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/base-driver",
"version": "10.5.1",
"version": "10.5.2",
"description": "Base driver class for Appium drivers",
"keywords": [
"automation",
@@ -45,7 +45,7 @@
"test:types": "tsd"
},
"dependencies": {
"@appium/support": "7.2.1",
"@appium/support": "7.2.2",
"@appium/types": "1.4.0",
"@colors/colors": "1.6.0",
"async-lock": "1.4.1",
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.2.4](https://github.com/appium/appium/compare/@appium/base-plugin@3.2.3...@appium/base-plugin@3.2.4) (2026-05-07)
**Note:** Version bump only for package @appium/base-plugin
## [3.2.3](https://github.com/appium/appium/compare/@appium/base-plugin@3.2.2...@appium/base-plugin@3.2.3) (2026-05-06)
**Note:** Version bump only for package @appium/base-plugin
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/base-plugin",
"version": "3.2.3",
"version": "3.2.4",
"description": "The base plugin used to create Appium plugins",
"keywords": [
"automation",
@@ -40,8 +40,8 @@
"test:unit": "mocha \"./test/unit/**/*.spec.*ts\""
},
"dependencies": {
"@appium/base-driver": "10.5.1",
"@appium/support": "7.2.1",
"@appium/base-driver": "10.5.2",
"@appium/support": "7.2.2",
"@appium/types": "1.4.0"
},
"engines": {
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.4.2](https://github.com/appium/appium/compare/@appium/docutils@2.4.1...@appium/docutils@2.4.2) (2026-05-07)
**Note:** Version bump only for package @appium/docutils
## [2.4.1](https://github.com/appium/appium/compare/@appium/docutils@2.4.0...@appium/docutils@2.4.1) (2026-05-06)
**Note:** Version bump only for package @appium/docutils
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/docutils",
"version": "2.4.1",
"version": "2.4.2",
"description": "Documentation generation utilities for Appium and related projects",
"keywords": [
"automation",
@@ -46,7 +46,7 @@
"start": "node ./build/lib/cli/index.js"
},
"dependencies": {
"@appium/support": "7.2.1",
"@appium/support": "7.2.2",
"consola": "3.4.2",
"diff": "9.0.0",
"lilconfig": "3.1.3",
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [4.2.4](https://github.com/appium/appium/compare/@appium/fake-plugin@4.2.3...@appium/fake-plugin@4.2.4) (2026-05-07)
**Note:** Version bump only for package @appium/fake-plugin
## [4.2.3](https://github.com/appium/appium/compare/@appium/fake-plugin@4.2.2...@appium/fake-plugin@4.2.3) (2026-05-06)
**Note:** Version bump only for package @appium/fake-plugin
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/fake-plugin",
"version": "4.2.3",
"version": "4.2.4",
"description": "A fake Appium plugin",
"keywords": [
"automation",
@@ -39,8 +39,8 @@
"test:unit": "mocha \"./test/unit/**/*.spec.*ts\""
},
"dependencies": {
"@appium/base-plugin": "3.2.3",
"@appium/support": "7.2.1",
"@appium/base-plugin": "3.2.4",
"@appium/support": "7.2.2",
"asyncbox": "6.2.0",
"lodash": "4.18.1"
},
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [4.2.4](https://github.com/appium/appium/compare/@appium/images-plugin@4.2.3...@appium/images-plugin@4.2.4) (2026-05-07)
**Note:** Version bump only for package @appium/images-plugin
## [4.2.3](https://github.com/appium/appium/compare/@appium/images-plugin@4.2.2...@appium/images-plugin@4.2.3) (2026-05-06)
**Note:** Version bump only for package @appium/images-plugin
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/images-plugin",
"version": "4.2.3",
"version": "4.2.4",
"description": "Plugin for working with images and image elements in Appium",
"keywords": [
"automation",
@@ -41,7 +41,7 @@
},
"dependencies": {
"@appium/opencv": "4.1.4",
"@appium/support": "7.2.1",
"@appium/support": "7.2.2",
"lodash": "4.18.1",
"lru-cache": "11.3.5",
"sharp": "0.34.5"
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.1.4](https://github.com/appium/appium/compare/@appium/storage-plugin@1.1.3...@appium/storage-plugin@1.1.4) (2026-05-07)
**Note:** Version bump only for package @appium/storage-plugin
## [1.1.3](https://github.com/appium/appium/compare/@appium/storage-plugin@1.1.2...@appium/storage-plugin@1.1.3) (2026-05-06)
**Note:** Version bump only for package @appium/storage-plugin
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/storage-plugin",
"version": "1.1.3",
"version": "1.1.4",
"description": "Server-side storage plugin for Appium",
"keywords": [
"automation",
@@ -40,7 +40,7 @@
"test:e2e": "mocha --timeout 20s --slow 10s \"./test/e2e/**/*.spec.ts\""
},
"dependencies": {
"@appium/support": "7.2.1",
"@appium/support": "7.2.2",
"async-lock": "1.4.1",
"asyncbox": "6.2.0",
"lodash": "4.18.1",
+9
View File
@@ -3,6 +3,15 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [7.2.2](https://github.com/appium/appium/compare/@appium/support@7.2.1...@appium/support@7.2.2) (2026-05-07)
### Bug Fixes
* **support:** accept Uint8Array/ArrayBuffer in plist parse path ([#22256](https://github.com/appium/appium/issues/22256)) ([8c6c199](https://github.com/appium/appium/commit/8c6c19982e97eded690da51e745c69e4ccc1e6bd))
## [7.2.1](https://github.com/appium/appium/compare/@appium/support@7.2.0...@appium/support@7.2.1) (2026-05-06)
+24 -9
View File
@@ -134,11 +134,11 @@ export function createPlist(object: object, binary = false): Buffer | string {
/**
* Parses a buffer or string into a JS object
*
* @param data - The plist as a string or Buffer
* @param data - The plist as a string, Buffer, Uint8Array, or ArrayBuffer
* @returns Parsed plist as a JS object
* @throws Will throw an error if the plist type is unknown
*/
export function parsePlist(data: string | Buffer): object {
export function parsePlist(data: string | Buffer | Uint8Array | ArrayBuffer): object {
const textPlist = getXmlPlist(data);
if (textPlist) {
return plistParse(textPlist);
@@ -159,29 +159,44 @@ async function parseXmlPlistFile(plistFilename: string): Promise<object> {
return plistParse(xmlContent);
}
function getXmlPlist(data: string | Buffer): string | null {
function getXmlPlist(data: string | Buffer | Uint8Array | ArrayBuffer): string | null {
if (typeof data === 'string' && data.startsWith(PLIST_IDENTIFIER.TEXT)) {
return data;
}
const binaryData = toBufferIfBinaryLike(data);
if (
Buffer.isBuffer(data) &&
PLIST_IDENTIFIER.BUFFER.compare(data, 0, PLIST_IDENTIFIER.BUFFER.length) === 0
binaryData &&
PLIST_IDENTIFIER.BUFFER.compare(binaryData, 0, PLIST_IDENTIFIER.BUFFER.length) === 0
) {
return data.toString();
return binaryData.toString();
}
return null;
}
function getBinaryPlist(data: string | Buffer): Buffer | null {
function getBinaryPlist(data: string | Buffer | Uint8Array | ArrayBuffer): Buffer | null {
if (typeof data === 'string' && data.startsWith(BPLIST_IDENTIFIER.TEXT)) {
return Buffer.from(data);
}
const binaryData = toBufferIfBinaryLike(data);
if (
Buffer.isBuffer(data) &&
BPLIST_IDENTIFIER.BUFFER.compare(data, 0, BPLIST_IDENTIFIER.BUFFER.length) === 0
binaryData &&
BPLIST_IDENTIFIER.BUFFER.compare(binaryData, 0, BPLIST_IDENTIFIER.BUFFER.length) === 0
) {
return binaryData;
}
return null;
}
function toBufferIfBinaryLike(data: unknown): Buffer | null {
if (Buffer.isBuffer(data)) {
return data;
}
if (data instanceof Uint8Array) {
return Buffer.from(data.buffer, data.byteOffset, data.byteLength);
}
if (data instanceof ArrayBuffer) {
return Buffer.from(data);
}
return null;
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/support",
"version": "7.2.1",
"version": "7.2.2",
"description": "Support libs used across Appium packages",
"keywords": [
"automation",
+33
View File
@@ -53,4 +53,37 @@ describe('plist', function () {
'com.apple.locationd.bundle-/System/Library/PrivateFrameworks/Parsec.framework'
);
});
it('should read text plist from Uint8Array', async function () {
const content = await fs.readFile(textPlistPath);
const object = plist.parsePlist(new Uint8Array(content));
expect(object).to.have.property(
'com.apple.locationd.bundle-/System/Library/PrivateFrameworks/Parsec.framework'
);
});
it('should read binary plist from Uint8Array', async function () {
const content = await fs.readFile(binaryPlistPath);
const object = plist.parsePlist(new Uint8Array(content));
expect(object).to.have.property(
'com.apple.locationd.bundle-/System/Library/PrivateFrameworks/Parsec.framework'
);
});
it('should read binary plist from ArrayBuffer', async function () {
const content = await fs.readFile(binaryPlistPath);
const object = plist.parsePlist(content.buffer.slice(content.byteOffset, content.byteOffset + content.byteLength));
expect(object).to.have.property(
'com.apple.locationd.bundle-/System/Library/PrivateFrameworks/Parsec.framework'
);
});
it('should parse nested data payload returned from plist parser', function () {
const innerPayload = plist.createBinaryPlist({answer: 42});
const outer = plist.createPlist({payload: innerPayload});
const outerParsed = plist.parsePlist(outer as string);
const nestedPayload = (outerParsed as {payload: Uint8Array | Buffer | ArrayBuffer}).payload;
const nestedParsed = plist.parsePlist(nestedPayload);
expect(nestedParsed).to.deep.equal({answer: 42});
});
});
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [4.1.4](https://github.com/appium/appium/compare/@appium/test-support@4.1.3...@appium/test-support@4.1.4) (2026-05-07)
**Note:** Version bump only for package @appium/test-support
## [4.1.3](https://github.com/appium/appium/compare/@appium/test-support@4.1.2...@appium/test-support@4.1.3) (2026-05-06)
**Note:** Version bump only for package @appium/test-support
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/test-support",
"version": "4.1.3",
"version": "4.1.4",
"description": "A collection of test utilities used across Appium packages",
"deprecated": "This module is deprecated. Use sinon directly instead (e.g., sinon.createSandbox() with Mocha hooks).",
"keywords": [
@@ -47,7 +47,7 @@
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
},
"dependencies": {
"@appium/support": "7.2.1",
"@appium/support": "7.2.2",
"@colors/colors": "1.6.0",
"bluebird": "3.7.2",
"lodash": "4.18.1",