Compare commits

..
Author SHA1 Message Date
Jonathan Lipps 715fd03c45 chore: publish
- appium@2.16.1
 - @appium/base-driver@9.16.1
 - @appium/base-plugin@2.3.2
 - @appium/docutils@1.0.31
 - @appium/driver-test-support@0.7.6
 - @appium/fake-plugin@3.2.2
 - @appium/images-plugin@3.0.29
 - @appium/plugin-test-support@0.3.51
 - @appium/schema@0.8.1
 - @appium/support@6.0.5
 - @appium/test-support@3.1.5
 - @appium/tsconfig@0.3.4
 - @appium/types@0.25.1
 - @appium/universal-xml-plugin@1.0.29
2025-02-20 11:04:05 -08:00
Mykola Mokhnach 8a664a4eef fix(base-driver): Optimize the logic of getUrlForProxy (#21018) 2025-02-20 19:59:15 +01:00
renovate[bot] dc24864cbb chore(deps): update dependency eslint-import-resolver-typescript to v3.8.3 (#21016)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-20 12:59:27 +00:00
Edgars Eglītis c102d8fd8e fix(renovate): use chore prefix for all PRs (#21014) 2025-02-20 12:59:44 +02:00
renovate[bot] 703085bc54 chore(docutils): update dependency mkdocs-material to v9.6.5 (#21009)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-20 09:08:09 +00:00
Edgars Eglītis 47497bc8da chore(schema,tsconfig,universal-xml-plugin): fix repository field in package.json (#21011) 2025-02-20 10:04:01 +02:00
37 changed files with 378 additions and 264 deletions
+73 -73
View File
@@ -57,7 +57,7 @@
"cross-env": "7.0.3",
"eslint": "9.20.1",
"eslint-config-prettier": "10.0.1",
"eslint-import-resolver-typescript": "3.8.2",
"eslint-import-resolver-typescript": "3.8.3",
"eslint-plugin-import": "2.31.0",
"eslint-plugin-mocha": "10.5.0",
"eslint-plugin-promise": "7.2.1",
@@ -9546,9 +9546,9 @@
}
},
"node_modules/eslint-import-resolver-typescript": {
"version": "3.8.2",
"resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.8.2.tgz",
"integrity": "sha512-o0nvXxsatYCDTzI1K5b3aYGQ6PjpDGJEVN86zqJw5SEewhmmggfRTotd2dqWr2t2zbeYpIEWGTCkgtUpIEIcaQ==",
"version": "3.8.3",
"resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.8.3.tgz",
"integrity": "sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==",
"license": "ISC",
"dependencies": {
"@nolyfill/is-core-module": "1.0.39",
@@ -9557,7 +9557,7 @@
"get-tsconfig": "^4.10.0",
"is-bun-module": "^1.0.2",
"stable-hash": "^0.0.4",
"tinyglobby": "^0.2.11"
"tinyglobby": "^0.2.12"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
@@ -18988,9 +18988,9 @@
}
},
"node_modules/tinyglobby": {
"version": "0.2.11",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.11.tgz",
"integrity": "sha512-32TmKeeKUahv0Go8WmQgiEp9Y21NuxjwjqiRC1nrUB51YacfSwuB44xgXD+HdIppmMRgjQNPdrHyA6vIybYZ+g==",
"version": "0.2.12",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz",
"integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==",
"license": "MIT",
"dependencies": {
"fdir": "^6.4.3",
@@ -20937,17 +20937,17 @@
}
},
"packages/appium": {
"version": "2.16.0",
"version": "2.16.1",
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"@appium/base-driver": "^9.16.0",
"@appium/base-plugin": "^2.3.1",
"@appium/docutils": "^1.0.30",
"@appium/base-driver": "^9.16.1",
"@appium/base-plugin": "^2.3.2",
"@appium/docutils": "^1.0.31",
"@appium/logger": "^1.6.1",
"@appium/schema": "^0.8.0",
"@appium/support": "^6.0.4",
"@appium/types": "^0.25.0",
"@appium/schema": "^0.8.1",
"@appium/support": "^6.0.5",
"@appium/types": "^0.25.1",
"@sidvind/better-ajv-errors": "3.0.1",
"ajv": "8.17.1",
"ajv-formats": "3.0.1",
@@ -21040,11 +21040,11 @@
},
"packages/base-driver": {
"name": "@appium/base-driver",
"version": "9.16.0",
"version": "9.16.1",
"license": "Apache-2.0",
"dependencies": {
"@appium/support": "^6.0.4",
"@appium/types": "^0.25.0",
"@appium/support": "^6.0.5",
"@appium/types": "^0.25.1",
"@colors/colors": "1.6.0",
"async-lock": "1.4.1",
"asyncbox": "3.0.0",
@@ -21101,11 +21101,11 @@
},
"packages/base-plugin": {
"name": "@appium/base-plugin",
"version": "2.3.1",
"version": "2.3.2",
"license": "Apache-2.0",
"dependencies": {
"@appium/base-driver": "^9.16.0",
"@appium/support": "^6.0.4"
"@appium/base-driver": "^9.16.1",
"@appium/support": "^6.0.5"
},
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
@@ -21114,11 +21114,11 @@
},
"packages/docutils": {
"name": "@appium/docutils",
"version": "1.0.30",
"version": "1.0.31",
"license": "Apache-2.0",
"dependencies": {
"@appium/support": "^6.0.4",
"@appium/tsconfig": "^0.3.3",
"@appium/support": "^6.0.5",
"@appium/tsconfig": "^0.3.4",
"@sliphua/lilconfig-ts-loader": "3.2.2",
"chalk": "4.1.2",
"consola": "3.4.0",
@@ -21251,10 +21251,10 @@
},
"packages/driver-test-support": {
"name": "@appium/driver-test-support",
"version": "0.7.5",
"version": "0.7.6",
"license": "Apache-2.0",
"dependencies": {
"@appium/types": "^0.25.0",
"@appium/types": "^0.25.1",
"axios": "1.7.9",
"bluebird": "3.7.2",
"chai": "5.2.0",
@@ -21918,11 +21918,11 @@
},
"packages/fake-plugin": {
"name": "@appium/fake-plugin",
"version": "3.2.1",
"version": "3.2.2",
"license": "Apache-2.0",
"dependencies": {
"@appium/base-plugin": "^2.3.1",
"@appium/support": "^6.0.4",
"@appium/base-plugin": "^2.3.2",
"@appium/support": "^6.0.5",
"bluebird": "3.7.2",
"lodash": "4.17.21",
"source-map-support": "0.5.21"
@@ -21937,11 +21937,11 @@
},
"packages/images-plugin": {
"name": "@appium/images-plugin",
"version": "3.0.28",
"version": "3.0.29",
"license": "Apache-2.0",
"dependencies": {
"@appium/opencv": "^3.0.8",
"@appium/support": "^6.0.4",
"@appium/support": "^6.0.5",
"lodash": "4.17.21",
"lru-cache": "10.4.3",
"sharp": "0.33.5",
@@ -22134,10 +22134,10 @@
},
"packages/plugin-test-support": {
"name": "@appium/plugin-test-support",
"version": "0.3.50",
"version": "0.3.51",
"license": "Apache-2.0",
"dependencies": {
"@appium/types": "^0.25.0",
"@appium/types": "^0.25.1",
"get-port": "5.1.1",
"log-symbols": "4.1.0",
"source-map-support": "0.5.21",
@@ -22170,7 +22170,7 @@
},
"packages/schema": {
"name": "@appium/schema",
"version": "0.8.0",
"version": "0.8.1",
"license": "Apache-2.0",
"dependencies": {
"json-schema": "0.4.0",
@@ -22196,12 +22196,12 @@
},
"packages/support": {
"name": "@appium/support",
"version": "6.0.4",
"version": "6.0.5",
"license": "Apache-2.0",
"dependencies": {
"@appium/logger": "^1.6.1",
"@appium/tsconfig": "^0.3.3",
"@appium/types": "^0.25.0",
"@appium/tsconfig": "^0.3.4",
"@appium/types": "^0.25.1",
"@colors/colors": "1.6.0",
"archiver": "7.0.1",
"axios": "1.7.9",
@@ -22457,10 +22457,10 @@
},
"packages/test-support": {
"name": "@appium/test-support",
"version": "3.1.4",
"version": "3.1.5",
"license": "Apache-2.0",
"dependencies": {
"@appium/support": "^6.0.4",
"@appium/support": "^6.0.5",
"@colors/colors": "1.6.0",
"bluebird": "3.7.2",
"lodash": "4.17.21",
@@ -22479,7 +22479,7 @@
},
"packages/tsconfig": {
"name": "@appium/tsconfig",
"version": "0.3.3",
"version": "0.3.4",
"license": "Apache-2.0",
"dependencies": {
"@tsconfig/node14": "14.1.2"
@@ -22491,12 +22491,12 @@
},
"packages/types": {
"name": "@appium/types",
"version": "0.25.0",
"version": "0.25.1",
"license": "Apache-2.0",
"dependencies": {
"@appium/logger": "^1.6.1",
"@appium/schema": "^0.8.0",
"@appium/tsconfig": "^0.3.3",
"@appium/schema": "^0.8.1",
"@appium/tsconfig": "^0.3.4",
"type-fest": "4.35.0"
},
"engines": {
@@ -22518,7 +22518,7 @@
},
"packages/universal-xml-plugin": {
"name": "@appium/universal-xml-plugin",
"version": "1.0.28",
"version": "1.0.29",
"license": "Apache-2.0",
"dependencies": {
"@xmldom/xmldom": "0.9.7",
@@ -22591,8 +22591,8 @@
"@appium/base-driver": {
"version": "file:packages/base-driver",
"requires": {
"@appium/support": "^6.0.4",
"@appium/types": "^0.25.0",
"@appium/support": "^6.0.5",
"@appium/types": "^0.25.1",
"@colors/colors": "1.6.0",
"async-lock": "1.4.1",
"asyncbox": "3.0.0",
@@ -22637,15 +22637,15 @@
"@appium/base-plugin": {
"version": "file:packages/base-plugin",
"requires": {
"@appium/base-driver": "^9.16.0",
"@appium/support": "^6.0.4"
"@appium/base-driver": "^9.16.1",
"@appium/support": "^6.0.5"
}
},
"@appium/docutils": {
"version": "file:packages/docutils",
"requires": {
"@appium/support": "^6.0.4",
"@appium/tsconfig": "^0.3.3",
"@appium/support": "^6.0.5",
"@appium/tsconfig": "^0.3.4",
"@sliphua/lilconfig-ts-loader": "3.2.2",
"chalk": "4.1.2",
"consola": "3.4.0",
@@ -22721,7 +22721,7 @@
"@appium/driver-test-support": {
"version": "file:packages/driver-test-support",
"requires": {
"@appium/types": "^0.25.0",
"@appium/types": "^0.25.1",
"axios": "1.7.9",
"bluebird": "3.7.2",
"chai": "5.2.0",
@@ -23140,8 +23140,8 @@
"@appium/fake-plugin": {
"version": "file:packages/fake-plugin",
"requires": {
"@appium/base-plugin": "^2.3.1",
"@appium/support": "^6.0.4",
"@appium/base-plugin": "^2.3.2",
"@appium/support": "^6.0.5",
"bluebird": "3.7.2",
"lodash": "4.17.21",
"source-map-support": "0.5.21"
@@ -23151,7 +23151,7 @@
"version": "file:packages/images-plugin",
"requires": {
"@appium/opencv": "^3.0.8",
"@appium/support": "^6.0.4",
"@appium/support": "^6.0.5",
"lodash": "4.17.21",
"lru-cache": "10.4.3",
"sharp": "0.33.5",
@@ -23296,7 +23296,7 @@
"@appium/plugin-test-support": {
"version": "file:packages/plugin-test-support",
"requires": {
"@appium/types": "^0.25.0",
"@appium/types": "^0.25.1",
"get-port": "5.1.1",
"log-symbols": "4.1.0",
"source-map-support": "0.5.21",
@@ -23328,8 +23328,8 @@
"version": "file:packages/support",
"requires": {
"@appium/logger": "^1.6.1",
"@appium/tsconfig": "^0.3.3",
"@appium/types": "^0.25.0",
"@appium/tsconfig": "^0.3.4",
"@appium/types": "^0.25.1",
"@colors/colors": "1.6.0",
"archiver": "7.0.1",
"axios": "1.7.9",
@@ -23507,7 +23507,7 @@
"@appium/test-support": {
"version": "file:packages/test-support",
"requires": {
"@appium/support": "^6.0.4",
"@appium/support": "^6.0.5",
"@colors/colors": "1.6.0",
"bluebird": "3.7.2",
"lodash": "4.17.21",
@@ -23526,8 +23526,8 @@
"version": "file:packages/types",
"requires": {
"@appium/logger": "^1.6.1",
"@appium/schema": "^0.8.0",
"@appium/tsconfig": "^0.3.3",
"@appium/schema": "^0.8.1",
"@appium/tsconfig": "^0.3.4",
"type-fest": "4.35.0"
},
"dependencies": {
@@ -27412,13 +27412,13 @@
"appium": {
"version": "file:packages/appium",
"requires": {
"@appium/base-driver": "^9.16.0",
"@appium/base-plugin": "^2.3.1",
"@appium/docutils": "^1.0.30",
"@appium/base-driver": "^9.16.1",
"@appium/base-plugin": "^2.3.2",
"@appium/docutils": "^1.0.31",
"@appium/logger": "^1.6.1",
"@appium/schema": "^0.8.0",
"@appium/support": "^6.0.4",
"@appium/types": "^0.25.0",
"@appium/schema": "^0.8.1",
"@appium/support": "^6.0.5",
"@appium/types": "^0.25.1",
"@sidvind/better-ajv-errors": "3.0.1",
"ajv": "8.17.1",
"ajv-formats": "3.0.1",
@@ -29956,9 +29956,9 @@
}
},
"eslint-import-resolver-typescript": {
"version": "3.8.2",
"resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.8.2.tgz",
"integrity": "sha512-o0nvXxsatYCDTzI1K5b3aYGQ6PjpDGJEVN86zqJw5SEewhmmggfRTotd2dqWr2t2zbeYpIEWGTCkgtUpIEIcaQ==",
"version": "3.8.3",
"resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.8.3.tgz",
"integrity": "sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==",
"requires": {
"@nolyfill/is-core-module": "1.0.39",
"debug": "^4.3.7",
@@ -29966,7 +29966,7 @@
"get-tsconfig": "^4.10.0",
"is-bun-module": "^1.0.2",
"stable-hash": "^0.0.4",
"tinyglobby": "^0.2.11"
"tinyglobby": "^0.2.12"
},
"dependencies": {
"debug": {
@@ -36197,9 +36197,9 @@
}
},
"tinyglobby": {
"version": "0.2.11",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.11.tgz",
"integrity": "sha512-32TmKeeKUahv0Go8WmQgiEp9Y21NuxjwjqiRC1nrUB51YacfSwuB44xgXD+HdIppmMRgjQNPdrHyA6vIybYZ+g==",
"version": "0.2.12",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz",
"integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==",
"requires": {
"fdir": "^6.4.3",
"picomatch": "^4.0.2"
+1 -1
View File
@@ -129,7 +129,7 @@
"cross-env": "7.0.3",
"eslint": "9.20.1",
"eslint-config-prettier": "10.0.1",
"eslint-import-resolver-typescript": "3.8.2",
"eslint-import-resolver-typescript": "3.8.3",
"eslint-plugin-import": "2.31.0",
"eslint-plugin-mocha": "10.5.0",
"eslint-plugin-promise": "7.2.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.
## [2.16.1](https://github.com/appium/appium/compare/appium@2.16.0...appium@2.16.1) (2025-02-20)
**Note:** Version bump only for package appium
## [2.16.0](https://github.com/appium/appium/compare/appium@2.15.0...appium@2.16.0) (2025-02-19)
+7 -7
View File
@@ -1,6 +1,6 @@
{
"name": "appium",
"version": "2.16.0",
"version": "2.16.1",
"description": "Automation for Apps.",
"keywords": [
"automation",
@@ -60,13 +60,13 @@
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
},
"dependencies": {
"@appium/base-driver": "^9.16.0",
"@appium/base-plugin": "^2.3.1",
"@appium/docutils": "^1.0.30",
"@appium/base-driver": "^9.16.1",
"@appium/base-plugin": "^2.3.2",
"@appium/docutils": "^1.0.31",
"@appium/logger": "^1.6.1",
"@appium/schema": "^0.8.0",
"@appium/support": "^6.0.4",
"@appium/types": "^0.25.0",
"@appium/schema": "^0.8.1",
"@appium/support": "^6.0.5",
"@appium/types": "^0.25.1",
"@sidvind/better-ajv-errors": "3.0.1",
"ajv": "8.17.1",
"ajv-formats": "3.0.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.
## [9.16.1](https://github.com/appium/appium/compare/@appium/base-driver@9.16.0...@appium/base-driver@9.16.1) (2025-02-20)
### Bug Fixes
* **base-driver:** Optimize the logic of getUrlForProxy ([#21018](https://github.com/appium/appium/issues/21018)) ([8a664a4](https://github.com/appium/appium/commit/8a664a4eef97f45c5bdf7f19708149488b63d7fc))
## [9.16.0](https://github.com/appium/appium/compare/@appium/base-driver@9.15.0...@appium/base-driver@9.16.0) (2025-02-19)
+51 -74
View File
@@ -9,16 +9,19 @@ import {
errorFromW3CJsonCode,
getResponseForW3CError,
} from '../protocol/errors';
import {routeToCommandName} from '../protocol';
import {isSessionCommand, routeToCommandName} from '../protocol';
import {MAX_LOG_BODY_LENGTH, DEFAULT_BASE_PATH, PROTOCOLS} from '../constants';
import ProtocolConverter from './protocol-converter';
import {formatResponseValue, formatStatus} from '../protocol/helpers';
import http from 'http';
import https from 'https';
import { match as pathToRegexMatch } from 'path-to-regexp';
import nodeUrl from 'node:url';
const DEFAULT_LOG = logger.getLogger('WD Proxy');
const DEFAULT_REQUEST_TIMEOUT = 240000;
const COMMAND_WITH_SESSION_ID_MATCHER = pathToRegexMatch('/session/:sessionId{/*command}');
const {MJSONWP, W3C} = PROTOCOLS;
@@ -111,26 +114,6 @@ class JWProxy {
this._activeRequests = [];
}
/**
* Return true if the given endpoint started with '/session' and
* it could have session id after the path.
* e.g.
* - should return true
* - /session/82a9b7da-faaf-4a1d-8ef3-5e4fb5812200
* - /session/82a9b7da-faaf-4a1d-8ef3-5e4fb5812200/url
* - should return false
* - /session
* - /sessions
* - /session/
* - /status
* - /appium/sessions
* @param {string} endpoint
* @returns {boolean}
*/
endpointRequiresSessionId(endpoint) {
return !!(pathToRegexMatch('/session/:sessionId{/*command}')(endpoint));
}
set downstreamProtocol(value) {
this._downstreamProtocol = value;
this.protocolConverter.downstreamProtocol = value;
@@ -140,67 +123,61 @@ class JWProxy {
return this._downstreamProtocol;
}
getUrlForProxy(url) {
if (url === '') {
url = '/';
/**
*
* @param {string} url
* @param {string} [method]
* @returns {string}
*/
getUrlForProxy(url, method) {
const parsedUrl = nodeUrl.parse(url || '/');
if (
!parsedUrl.href || !parsedUrl.pathname
|| (parsedUrl.protocol && !['http:', 'https:'].includes(parsedUrl.protocol))
) {
throw new Error(`Did not know how to proxy the url '${url}'`);
}
const proxyBase = `${this.scheme}://${this.server}:${this.port}${this.base}`;
const endpointRe = '(/(session|status|appium))';
let remainingUrl = '';
if (/^http/.test(url)) {
const first = new RegExp(`(https?://.+)${endpointRe}`).exec(url);
if (!first) {
throw new Error('Got a complete url but could not extract JWP endpoint');
}
remainingUrl = url.replace(first[1], '');
} else if (new RegExp('^/').test(url)) {
remainingUrl = url;
} else {
throw new Error(`Did not know what to do with url '${url}'`);
const pathname = this.reqBasePath && parsedUrl.pathname.startsWith(this.reqBasePath)
? parsedUrl.pathname.replace(this.reqBasePath, '')
: parsedUrl.pathname;
const match = COMMAND_WITH_SESSION_ID_MATCHER(pathname);
const normalizedPathname = _.trimEnd(
match && _.isArray(match.params?.command)
? `/${match.params.command.join('/')}`
: pathname,
'/'
);
const commandName = normalizedPathname
? routeToCommandName(
normalizedPathname,
/** @type {import('@appium/types').HTTPMethod | undefined} */ (method)
)
: '';
const requiresSessionId = !commandName || (commandName && isSessionCommand(commandName));
const proxyPrefix = `${this.scheme}://${this.server}:${this.port}${this.base}`;
let proxySuffix = normalizedPathname ? `/${_.trimStart(normalizedPathname, '/')}` : '';
if (parsedUrl.search) {
proxySuffix += parsedUrl.search;
}
const stripPrefixRe = new RegExp('^.*?(/(session|status|appium).*)$');
if (stripPrefixRe.test(remainingUrl)) {
remainingUrl = /** @type {RegExpExecArray} */ (stripPrefixRe.exec(remainingUrl))[1];
if (!requiresSessionId) {
return `${proxyPrefix}${proxySuffix}`;
}
if (!new RegExp(endpointRe).test(remainingUrl)) {
remainingUrl = `/session/${this.sessionId}${remainingUrl}`;
if (!this.sessionId) {
throw new ReferenceError(`Session ID is not set, but saw a URL that requires it (${url})`);
}
const requiresSessionId = this.endpointRequiresSessionId(remainingUrl);
if (requiresSessionId && this.sessionId === null) {
throw new Error('Trying to proxy a session command without session id');
}
const sessionBaseRe = new RegExp('^/session/([^/]+)');
if (sessionBaseRe.test(remainingUrl)) {
if (this.sessionId === null) {
throw new ReferenceError(
`Session ID is not set, but saw a URL path referencing a session (${remainingUrl}). This may be a bug in your client.`
);
}
// we have something like /session/:id/foobar, so we need to replace
// the session id
const match = sessionBaseRe.exec(remainingUrl);
// TODO: if `requiresSessionId` is `false` and `sessionId` is `null`, this is a bug.
// are we sure `sessionId` is not `null`?
remainingUrl = remainingUrl.replace(
/** @type {RegExpExecArray} */ (match)[1],
/** @type {string} */ (this.sessionId)
);
} else if (requiresSessionId) {
throw new Error(`Could not find :session section for url: ${remainingUrl}`);
}
remainingUrl = remainingUrl.replace(/\/$/, ''); // can't have trailing slashes
return proxyBase + remainingUrl;
return `${proxyPrefix}/session/${this.sessionId}${proxySuffix}`;
}
/**
*
* @param {string} url
* @param {string} method
* @param {any} body
* @returns {Promise<any>}
*/
async proxy(url, method, body = null) {
method = method.toUpperCase();
const newUrl = this.getUrlForProxy(url);
const newUrl = this.getUrlForProxy(url, method);
const truncateBody = (content) =>
_.truncate(_.isString(content) ? content : JSON.stringify(content), {
length: MAX_LOG_BODY_LENGTH,
+33 -3
View File
@@ -4,6 +4,12 @@ import _ from 'lodash';
import {util} from '@appium/support';
import {PROTOCOLS, DEFAULT_BASE_PATH} from '../constants';
import {match} from 'path-to-regexp';
import { LRUCache } from 'lru-cache';
/** @type {LRUCache<string, string>} */
const COMMAND_NAMES_CACHE = new LRUCache({
max: 1024,
});
const SET_ALERT_TEXT_PAYLOAD_PARAMS = {
validate: (jsonObj) =>
@@ -941,7 +947,7 @@ export const ALL_COMMANDS = _.flatMap(_.values(METHOD_MAP).map(_.values))
/**
*
* @param {string} endpoint
* @param {import('@appium/types').HTTPMethod} method
* @param {import('@appium/types').HTTPMethod} [method]
* @param {string} [basePath=DEFAULT_BASE_PATH]
* @returns {string|undefined}
*/
@@ -959,22 +965,46 @@ export function routeToCommandName(endpoint, method, basePath = DEFAULT_BASE_PAT
throw new Error(`'${endpoint}' cannot be translated to a command name: ${err.message}`);
}
const normalizedMethod = _.toUpper(method);
const cacheKey = toCommandNameCacheKey(normalizedPathname, normalizedMethod);
if (COMMAND_NAMES_CACHE.has(cacheKey)) {
return COMMAND_NAMES_CACHE.get(cacheKey) || undefined;
}
/** @type {string[]} */
const possiblePathnames = [];
if (!normalizedPathname.startsWith('/session/')) {
possiblePathnames.push(`/session/any-session-id${normalizedPathname}`);
}
possiblePathnames.push(normalizedPathname);
const normalizedMethod = _.toUpper(method);
for (const [routePath, routeSpec] of _.toPairs(METHOD_MAP)) {
const routeMatcher = match(routePath);
if (possiblePathnames.some((pp) => routeMatcher(pp))) {
const commandName = routeSpec?.[normalizedMethod]?.command;
const commandForAnyMethod = () => _.first(
(_.keys(routeSpec) ?? []).map((key) => routeSpec[key]?.command)
);
const commandName = normalizedMethod
? routeSpec?.[normalizedMethod]?.command
: commandForAnyMethod();
if (commandName) {
COMMAND_NAMES_CACHE.set(cacheKey, commandName);
return commandName;
}
}
}
// storing an empty string means we did not find any match for this set of arguments
// and we want to cache this result
COMMAND_NAMES_CACHE.set(cacheKey, '');
}
/**
*
* @param {string} endpoint
* @param {string} [method]
* @returns {string}
*/
function toCommandNameCacheKey(endpoint, method) {
return `${endpoint}:${method ?? ''}`;
}
// driver commands that do not require a session to already exist
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/base-driver",
"version": "9.16.0",
"version": "9.16.1",
"description": "Base driver class for Appium drivers",
"keywords": [
"automation",
@@ -44,8 +44,8 @@
"test:types": "tsd"
},
"dependencies": {
"@appium/support": "^6.0.4",
"@appium/types": "^0.25.0",
"@appium/support": "^6.0.5",
"@appium/types": "^0.25.1",
"@colors/colors": "1.6.0",
"async-lock": "1.4.1",
"asyncbox": "3.0.0",
@@ -61,58 +61,72 @@ describe('proxy', function () {
});
describe('getUrlForProxy', function () {
it('should modify session id, host, and port', function () {
let j = mockProxy({sessionId: '123'});
j.getUrlForProxy('http://host.com:1234/session/456/element/200/value').should.eql(
`http://${TEST_HOST}:${port}/session/123/element/200/value`
);
mockProxy({sessionId: '123'})
.getUrlForProxy('http://host.com:1234/session/456/element/200/value', 'POST').should.eql(
`http://${TEST_HOST}:${port}/session/123/element/200/value`
);
});
it('should prepend scheme, host and port if not provided', function () {
let j = mockProxy({sessionId: '123'});
j.getUrlForProxy('/session/456/element/200/value').should.eql(
j.getUrlForProxy('/session/456/element/200/value', 'POST').should.eql(
`http://${TEST_HOST}:${port}/session/123/element/200/value`
);
j.getUrlForProxy('/session/456/appium/settings', 'POST').should.eql(
`http://${TEST_HOST}:${port}/session/123/appium/settings`
);
});
it('should prepend scheme, host, port and session if not provided', function () {
mockProxy({sessionId: '123'})
.getUrlForProxy('/element/200/value', 'POST').should.eql(
`http://${TEST_HOST}:${port}/session/123/element/200/value`
);
});
it('should keep query parameters', function () {
mockProxy({sessionId: '123'})
.getUrlForProxy('/element/200/value?foo=1&bar=2', 'POST').should.eql(
`http://${TEST_HOST}:${port}/session/123/element/200/value?foo=1&bar=2`
);
});
it('should respect nonstandard incoming request base path', function () {
let j = mockProxy({sessionId: '123', reqBasePath: ''});
j.getUrlForProxy('/session/456/element/200/value').should.eql(
`http://${TEST_HOST}:${port}/session/123/element/200/value`
);
mockProxy({sessionId: '123', reqBasePath: ''})
.getUrlForProxy('/session/456/element/200/value', 'POST').should.eql(
`http://${TEST_HOST}:${port}/session/123/element/200/value`
);
j = mockProxy({sessionId: '123', reqBasePath: '/my/base/path'});
j.getUrlForProxy('/my/base/path/session/456/element/200/value').should.eql(
`http://${TEST_HOST}:${port}/session/123/element/200/value`
);
mockProxy({sessionId: '123', reqBasePath: '/my/base/path'})
.getUrlForProxy('/my/base/path/session/456/element/200/value', 'POST').should.eql(
`http://${TEST_HOST}:${port}/session/123/element/200/value`
);
mockProxy({reqBasePath: '/my/base/path'})
.getUrlForProxy('/my/base/path/session', 'POST').should.eql(
`http://${TEST_HOST}:${port}/session`
);
});
it('should work with urls which do not have session ids', function () {
let j = mockProxy({sessionId: '123'});
j.getUrlForProxy('http://host.com:1234/session').should.eql(
j.getUrlForProxy('http://host.com:1234/session', 'POST').should.eql(
`http://${TEST_HOST}:${port}/session`
);
let newUrl = j.getUrlForProxy('/session');
newUrl.should.eql(`http://${TEST_HOST}:${port}/session`);
j.getUrlForProxy('/session', 'POST')
.should.eql(`http://${TEST_HOST}:${port}/session`);
j.getUrlForProxy('/appium/sessions', 'GET')
.should.eql(`http://${TEST_HOST}:${port}/appium/sessions`);
});
it('should throw an error if url requires a sessionId but its null', function () {
let j = mockProxy();
let e;
try {
j.getUrlForProxy('/session/456/element/200/value');
j.getUrlForProxy('/session/456/element/200/value', 'POST');
} catch (err) {
e = err;
}
should.exist(e);
e.message.should.contain('without session id');
e.message.should.contain('not set');
});
it('should not throw an error if url does not require a session id and its null', function () {
let j = mockProxy();
let newUrl = j.getUrlForProxy('/status');
should.exist(newUrl);
});
it('should not throw an error if url does not require a session id with appium vendor prefix and its null', function () {
let j = mockProxy();
let newUrl = j.getUrlForProxy('/appium/something');
let newUrl = mockProxy().getUrlForProxy('/status', 'GET');
should.exist(newUrl);
});
});
@@ -215,30 +229,4 @@ describe('proxy', function () {
res.sentBody.should.eql({value: {message: 'chrome not reachable'}});
});
});
describe('endpointRequiresSessionId', function () {
const j = mockProxy({sessionId: '123'});
[
'/session/82a9b7da-faaf-4a1d-8ef3-5e4fb5812200',
'/session/82a9b7da-faaf-4a1d-8ef3-5e4fb5812200/',
'/session/82a9b7da-faaf-4a1d-8ef3-5e4fb5812200/url',
'/session/82a9b7da-faaf-4a1d-8ef3-5e4fb5812200/element/3d001db2-7987-42a7-975d-8d5d5304083f',
].forEach(function (endpoint) {
it(`should be true with ${endpoint}`, function () {
j.endpointRequiresSessionId(endpoint).should.be.true;
});
});
[
'/session',
'/session/',
'/sessions',
'/appium/sessions',
'/status',
].forEach(function (endpoint) {
it(`should be false with ${endpoint}`, function () {
j.endpointRequiresSessionId(endpoint).should.be.false;
});
});
});
});
@@ -37,7 +37,7 @@ describe('JWProxy', function () {
it('should translate host and port', function () {
let incomingUrl = PROXY_STATUS_URL;
let j = createJWProxy();
let proxyUrl = j.getUrlForProxy(incomingUrl);
let proxyUrl = j.getUrlForProxy(incomingUrl, 'GET');
proxyUrl.should.equal(testStatusURL);
});
it('should translate the scheme', function () {
@@ -49,21 +49,21 @@ describe('JWProxy', function () {
it('should translate the base', function () {
let incomingUrl = PROXY_STATUS_URL;
let j = createJWProxy({base: ''});
let proxyUrl = j.getUrlForProxy(incomingUrl);
let proxyUrl = j.getUrlForProxy(incomingUrl, 'GET');
proxyUrl.should.equal(testStatusURL);
});
it('should translate the session id', function () {
let incomingUrl = createProxyURL('foobar', 'element');
let j = createJWProxy({sessionId: 'barbaz'});
let proxyUrl = j.getUrlForProxy(incomingUrl);
let proxyUrl = j.getUrlForProxy(incomingUrl, 'POST');
proxyUrl.should.equal(createTestURL('barbaz', 'element'));
});
it('should error when translating session commands without session id', function () {
let incomingUrl = createProxyURL('foobar', 'element');
let j = createJWProxy();
(() => {
j.getUrlForProxy(incomingUrl);
}).should.throw('session id');
j.getUrlForProxy(incomingUrl, 'POST');
}).should.throw('not set');
});
});
@@ -71,7 +71,7 @@ describe('JWProxy', function () {
it('should proxy /status', function () {
let incomingUrl = '/status';
let j = createJWProxy();
let proxyUrl = j.getUrlForProxy(incomingUrl);
let proxyUrl = j.getUrlForProxy(incomingUrl, 'GET');
proxyUrl.should.equal(testStatusURL);
});
it('should proxy /session', function () {
@@ -83,64 +83,64 @@ describe('JWProxy', function () {
it('should proxy /sessions', function () {
let incomingUrl = '/sessions';
let j = createJWProxy();
let proxyUrl = j.getUrlForProxy(incomingUrl);
let proxyUrl = j.getUrlForProxy(incomingUrl, 'GET');
proxyUrl.should.equal(createTestURL('', 'sessions'));
});
it('should proxy session commands based off /session', function () {
let incomingUrl = '/session/foobar/element';
let j = createJWProxy({sessionId: 'barbaz'});
let proxyUrl = j.getUrlForProxy(incomingUrl);
let proxyUrl = j.getUrlForProxy(incomingUrl, 'POST');
proxyUrl.should.equal(createTestURL('barbaz', 'element'));
});
it('should error session commands based off /session without session id', function () {
let incomingUrl = '/session/foobar/element';
let j = createJWProxy();
(() => {
j.getUrlForProxy(incomingUrl);
}).should.throw('session id');
j.getUrlForProxy(incomingUrl, 'POST');
}).should.throw('not set');
});
it('should proxy session commands based off ', function () {
let incomingUrl = '/session/3d001db2-7987-42a7-975d-8d5d5304083f/timeouts/implicit_wait';
let j = createJWProxy({sessionId: '123'});
let proxyUrl = j.getUrlForProxy(incomingUrl);
let proxyUrl = j.getUrlForProxy(incomingUrl, 'POST');
proxyUrl.should.equal(createTestURL('123', 'timeouts/implicit_wait'));
});
it('should proxy session commands based off /session as ""', function () {
let incomingUrl = '';
let j = createJWProxy();
(() => {
j.getUrlForProxy(incomingUrl);
}).should.throw('session id');
j.getUrlForProxy(incomingUrl, 'GET');
}).should.throw('not set');
j = createJWProxy({sessionId: '123'});
let proxyUrl = j.getUrlForProxy(incomingUrl);
let proxyUrl = j.getUrlForProxy(incomingUrl, 'GET');
proxyUrl.should.equal(createTestSessionURL('123'));
});
it('should proxy session commands without /session', function () {
let incomingUrl = '/element';
let j = createJWProxy({sessionId: 'barbaz'});
let proxyUrl = j.getUrlForProxy(incomingUrl);
let proxyUrl = j.getUrlForProxy(incomingUrl, 'POST');
proxyUrl.should.equal(createTestURL('barbaz', 'element'));
});
it(`should proxy session commands when '/session' is in the url`, function () {
let incomingUrl =
'/session/82a9b7da-faaf-4a1d-8ef3-5e4fb5812200/cookie/session-something-or-other';
let j = createJWProxy({sessionId: 'barbaz'});
let proxyUrl = j.getUrlForProxy(incomingUrl);
let proxyUrl = j.getUrlForProxy(incomingUrl, 'POST');
proxyUrl.should.equal(createTestURL('barbaz', 'cookie/session-something-or-other'));
});
it(`should proxy session commands when '/session' is in the url and not base on the original url`, function () {
let incomingUrl =
'/session/82a9b7da-faaf-4a1d-8ef3-5e4fb5812200/cookie/session-something-or-other';
let j = createJWProxy({sessionId: 'barbaz'});
let proxyUrl = j.getUrlForProxy(incomingUrl);
let proxyUrl = j.getUrlForProxy(incomingUrl, 'POST');
proxyUrl.should.equal(createTestURL('barbaz', 'cookie/session-something-or-other'));
});
it('should error session commands without /session without session id', function () {
let incomingUrl = '/element';
let j = createJWProxy();
(() => {
j.getUrlForProxy(incomingUrl);
}).should.throw('session id');
j.getUrlForProxy(incomingUrl, 'POST');
}).should.throw('not set');
});
});
});
+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.3.2](https://github.com/appium/appium/compare/@appium/base-plugin@2.3.1...@appium/base-plugin@2.3.2) (2025-02-20)
**Note:** Version bump only for package @appium/base-plugin
## [2.3.1](https://github.com/appium/appium/compare/@appium/base-plugin@2.3.0...@appium/base-plugin@2.3.1) (2025-02-19)
**Note:** Version bump only for package @appium/base-plugin
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/base-plugin",
"version": "2.3.1",
"version": "2.3.2",
"description": "The base plugin used to create Appium 2.0 plugins",
"keywords": [
"automation",
@@ -40,8 +40,8 @@
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
},
"dependencies": {
"@appium/base-driver": "^9.16.0",
"@appium/support": "^6.0.4"
"@appium/base-driver": "^9.16.1",
"@appium/support": "^6.0.5"
},
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.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.
## [1.0.31](https://github.com/appium/appium/compare/@appium/docutils@1.0.30...@appium/docutils@1.0.31) (2025-02-20)
**Note:** Version bump only for package @appium/docutils
## [1.0.30](https://github.com/appium/appium/compare/@appium/docutils@1.0.29...@appium/docutils@1.0.30) (2025-02-19)
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/docutils",
"version": "1.0.30",
"version": "1.0.31",
"description": "Documentation generation utilities for Appium and related projects",
"keywords": [
"automation",
@@ -48,8 +48,8 @@
"start": "node ./build/lib/cli/index.js"
},
"dependencies": {
"@appium/support": "^6.0.4",
"@appium/tsconfig": "^0.3.3",
"@appium/support": "^6.0.5",
"@appium/tsconfig": "^0.3.4",
"@sliphua/lilconfig-ts-loader": "3.2.2",
"chalk": "4.1.2",
"consola": "3.4.0",
+1 -1
View File
@@ -1,5 +1,5 @@
mkdocs==1.6.1
mkdocs-git-revision-date-localized-plugin==1.3.0
mkdocs-material==9.6.4
mkdocs-material==9.6.5
mkdocs-redirects==1.2.2
mike==2.1.3
@@ -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.
## [0.7.6](https://github.com/appium/appium/compare/@appium/driver-test-support@0.7.5...@appium/driver-test-support@0.7.6) (2025-02-20)
**Note:** Version bump only for package @appium/driver-test-support
## [0.7.5](https://github.com/appium/appium/compare/@appium/driver-test-support@0.7.4...@appium/driver-test-support@0.7.5) (2025-02-19)
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/driver-test-support",
"version": "0.7.5",
"version": "0.7.6",
"description": "Test utilities for Appium drivers",
"keywords": [
"automation",
@@ -41,7 +41,7 @@
},
"types": "./build/lib/index.d.ts",
"dependencies": {
"@appium/types": "^0.25.0",
"@appium/types": "^0.25.1",
"axios": "1.7.9",
"bluebird": "3.7.2",
"chai": "5.2.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.
## [3.2.2](https://github.com/appium/appium/compare/@appium/fake-plugin@3.2.1...@appium/fake-plugin@3.2.2) (2025-02-20)
**Note:** Version bump only for package @appium/fake-plugin
## [3.2.1](https://github.com/appium/appium/compare/@appium/fake-plugin@3.2.0...@appium/fake-plugin@3.2.1) (2025-02-19)
**Note:** Version bump only for package @appium/fake-plugin
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/fake-plugin",
"version": "3.2.1",
"version": "3.2.2",
"description": "A fake Appium 2.0 plugin",
"keywords": [
"automation",
@@ -39,8 +39,8 @@
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
},
"dependencies": {
"@appium/base-plugin": "^2.3.1",
"@appium/support": "^6.0.4",
"@appium/base-plugin": "^2.3.2",
"@appium/support": "^6.0.5",
"bluebird": "3.7.2",
"lodash": "4.17.21",
"source-map-support": "0.5.21"
+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.0.29](https://github.com/appium/appium/compare/@appium/images-plugin@3.0.28...@appium/images-plugin@3.0.29) (2025-02-20)
**Note:** Version bump only for package @appium/images-plugin
## [3.0.28](https://github.com/appium/appium/compare/@appium/images-plugin@3.0.27...@appium/images-plugin@3.0.28) (2025-02-19)
**Note:** Version bump only for package @appium/images-plugin
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/images-plugin",
"version": "3.0.28",
"version": "3.0.29",
"description": "Plugin for working with images and image elements in Appium",
"keywords": [
"automation",
@@ -40,7 +40,7 @@
},
"dependencies": {
"@appium/opencv": "^3.0.8",
"@appium/support": "^6.0.4",
"@appium/support": "^6.0.5",
"lodash": "4.17.21",
"lru-cache": "10.4.3",
"sharp": "0.33.5",
@@ -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.
## [0.3.51](https://github.com/appium/appium/compare/@appium/plugin-test-support@0.3.50...@appium/plugin-test-support@0.3.51) (2025-02-20)
**Note:** Version bump only for package @appium/plugin-test-support
## [0.3.50](https://github.com/appium/appium/compare/@appium/plugin-test-support@0.3.49...@appium/plugin-test-support@0.3.50) (2025-02-19)
**Note:** Version bump only for package @appium/plugin-test-support
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/plugin-test-support",
"version": "0.3.50",
"version": "0.3.51",
"description": "Testing utilities for Appium plugins",
"keywords": [
"automation",
@@ -41,7 +41,7 @@
"test:unit": "exit 0"
},
"dependencies": {
"@appium/types": "^0.25.0",
"@appium/types": "^0.25.1",
"get-port": "5.1.1",
"log-symbols": "4.1.0",
"source-map-support": "0.5.21",
+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.
## [0.8.1](https://github.com/appium/appium/compare/@appium/schema@0.8.0...@appium/schema@0.8.1) (2025-02-20)
**Note:** Version bump only for package @appium/schema
## [0.8.0](https://github.com/appium/appium/compare/@appium/schema@0.7.1...@appium/schema@0.8.0) (2025-02-19)
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/schema",
"version": "0.8.0",
"version": "0.8.1",
"description": "Appium Configuration Schema",
"keywords": [
"automation",
@@ -19,7 +19,7 @@
"repository": {
"type": "git",
"url": "https://github.com/appium/appium.git",
"directory": "schema"
"directory": "packages/schema"
},
"license": "Apache-2.0",
"author": "https://github.com/appium",
+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.
## [6.0.5](https://github.com/appium/appium/compare/@appium/support@6.0.4...@appium/support@6.0.5) (2025-02-20)
**Note:** Version bump only for package @appium/support
## [6.0.4](https://github.com/appium/appium/compare/@appium/support@6.0.3...@appium/support@6.0.4) (2025-02-19)
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/support",
"version": "6.0.4",
"version": "6.0.5",
"description": "Support libs used across appium packages",
"keywords": [
"automation",
@@ -42,8 +42,8 @@
},
"dependencies": {
"@appium/logger": "^1.6.1",
"@appium/tsconfig": "^0.3.3",
"@appium/types": "^0.25.0",
"@appium/tsconfig": "^0.3.4",
"@appium/types": "^0.25.1",
"@colors/colors": "1.6.0",
"archiver": "7.0.1",
"axios": "1.7.9",
+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.1.5](https://github.com/appium/appium/compare/@appium/test-support@3.1.4...@appium/test-support@3.1.5) (2025-02-20)
**Note:** Version bump only for package @appium/test-support
## [3.1.4](https://github.com/appium/appium/compare/@appium/test-support@3.1.3...@appium/test-support@3.1.4) (2025-02-19)
**Note:** Version bump only for package @appium/test-support
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/test-support",
"version": "3.1.4",
"version": "3.1.5",
"description": "A collection of test utilities used across Appium packages",
"keywords": [
"automation",
@@ -45,7 +45,7 @@
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
},
"dependencies": {
"@appium/support": "^6.0.4",
"@appium/support": "^6.0.5",
"@colors/colors": "1.6.0",
"bluebird": "3.7.2",
"lodash": "4.17.21",
+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.
## [0.3.4](https://github.com/appium/appium/compare/@appium/tsconfig@0.3.3...@appium/tsconfig@0.3.4) (2025-02-20)
**Note:** Version bump only for package @appium/tsconfig
## [0.3.3](https://github.com/appium/appium/compare/@appium/tsconfig@0.3.2...@appium/tsconfig@0.3.3) (2024-04-08)
+6 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/tsconfig",
"version": "0.3.3",
"version": "0.3.4",
"description": "Shared TypeScript Config for Appium",
"main": "tsconfig.json",
"keywords": [
@@ -21,6 +21,11 @@
"bugs": {
"url": "https://github.com/appium/appium/issues"
},
"repository": {
"type": "git",
"url": "https://github.com/appium/appium.git",
"directory": "packages/tsconfig"
},
"homepage": "https://appium.io",
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.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.
## [0.25.1](https://github.com/appium/appium/compare/@appium/types@0.25.0...@appium/types@0.25.1) (2025-02-20)
**Note:** Version bump only for package @appium/types
## [0.25.0](https://github.com/appium/appium/compare/@appium/types@0.24.0...@appium/types@0.25.0) (2025-02-19)
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/types",
"version": "0.25.0",
"version": "0.25.1",
"description": "Various type declarations used across Appium",
"keywords": [
"automation",
@@ -39,8 +39,8 @@
},
"dependencies": {
"@appium/logger": "^1.6.1",
"@appium/schema": "^0.8.0",
"@appium/tsconfig": "^0.3.3",
"@appium/schema": "^0.8.1",
"@appium/tsconfig": "^0.3.4",
"type-fest": "4.35.0"
},
"engines": {
@@ -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.0.29](https://github.com/appium/appium/compare/@appium/universal-xml-plugin@1.0.28...@appium/universal-xml-plugin@1.0.29) (2025-02-20)
**Note:** Version bump only for package @appium/universal-xml-plugin
## [1.0.28](https://github.com/appium/appium-plugins/compare/@appium/universal-xml-plugin@1.0.27...@appium/universal-xml-plugin@1.0.28) (2025-02-19)
+3 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/universal-xml-plugin",
"version": "1.0.28",
"version": "1.0.29",
"description": "Appium plugin for making XML source and XPath queries the same across iOS and Android",
"keywords": [
"automation",
@@ -18,7 +18,8 @@
},
"repository": {
"type": "git",
"url": "git+https://github.com/appium/appium-plugins.git"
"url": "https://github.com/appium/appium.git",
"directory": "packages/universal-xml-plugin"
},
"license": "Apache-2.0",
"author": "https://github.com/appium",
+1 -1
View File
@@ -42,7 +42,7 @@ Appium extension authors--or anyone else--may use this config as well.
- `:enableVulnerabilityAlerts` - For "security" purposes
- `:rebaseStalePrs` - Renovate will automatically rebase its PRs
- `:semanticCommits` - Renovate will use semantic commit messages
- `:semanticPrefixChore` - Renovate's PRs have the `chore` prefix in its semantic commit message
- `:semanticCommitTypeAll(chore)` - Renovate's PRs have the `chore` prefix in its semantic commit message
### Custom Rules
+1 -1
View File
@@ -10,7 +10,7 @@
":enableVulnerabilityAlerts",
":rebaseStalePrs",
":semanticCommits",
":semanticPrefixChore"
":semanticCommitTypeAll(chore)"
],
"packageRules": [
{