3408 Commits

Author SHA1 Message Date
Kazuaki Matsuo a090505184 fix(base-driver): reject implicit HEAD command routing (#22992) 2026-10-15 18:57:15 -07:00
Kazuaki Matsuo aba33a2d17 fix(base-driver): validate and merge all capability candidates (#22982) 2026-10-15 10:19:35 -07:00
Mykola Mokhnach 2bbb1d3a49 fix(http-server)!: reject browser-origin requests unless CORS is enabled (#22990)
BREAKING CHANGE: clients that send an Origin header must enable the CORS feature (--allow-insecure=*:cors).
BREAKING CHANGE: Library callers that depended on the implicit CORS default must now pass allowCors: true
2026-10-15 18:15:36 +02:00
Kazuaki Matsuo d05423e77d fix(base-driver): apply initial session timeouts (#22983)
* refactor(base-driver): share standard timeout value validation

Refs #22966 (F21).

* fix(base-driver): apply initial session timeouts

Refs #22966 (F21). Initialize local timeout state before driver backend startup.

* test(base-driver): cover initial session timeout state

Refs #22966 (F21). Covers nulls, bounds, invalid inputs, readback, defaults, and backend setter overrides.

* refactor(types): export the existing Timeouts type

* refactor(base-driver): reuse the shared Timeouts type

Use Partial<Timeouts> for initial session timeout state.

Validation: TypeScript build, base-driver type tests, and targeted lint/format checks passed.

* refactor(base-driver): share timeout mapping across initialization loops

* refactor(base-driver): normalize reset options in a loop

* refactor(base-driver): extract session preparation helpers

* fix(base-driver): identify timeout type in validation errors

* fix(base-driver): show invalid timeout values in errors

* refactor(base-driver): simplify timeout update mapping

* refactor(base-driver): centralize timeout metadata in timeout module

Share standard timeout names, local fields, and setters with session initialization. Reuse keyof Timeouts for validation. Refs #22966.

* refactor(base-driver): reuse timeout metadata for initial session state

Remove the duplicate timeout mapping from driver.ts. Preserve direct field initialization before backend startup. Validation: 578 base-driver tests, TypeScript build, type tests, and targeted lint/format checks passed.

* fix(types): allow partial initial timeout capabilities
2026-10-15 09:16:57 +09:00
Mohamed Mostafa f820e04000 fix(appium): apply default capabilities to every firstMatch candidate (#22988)
* fix(appium): apply default capabilities to every firstMatch candidate

* docs(appium): explain how default capabilities apply to firstMatch candidates
2026-10-15 09:16:28 +09:00
Mohamed Mostafa 814357aa7f fix(base-driver): reject an unsupported log type with InvalidArgumentError (#22986) 2026-10-14 17:48:34 +02:00
Mohamed Mostafa a9d1b1212d fix(base-driver): reject an unknown timeout type with InvalidArgumentError (#22987) 2026-10-14 18:43:50 +03:00
Kazuaki Matsuo f3edfc5e03 fix(base-driver)!: match standard capability names case-sensitively (#22976)
* Update migration guide for Appium 3 to 4

Refs #22966 (F12).

* Refactor capability imports and standard cap check

Refs #22966 (F12).

* Add test for insertAppiumPrefixes function

Refs #22966 (F12).

* Update isStandardCap to use exact matches

Refs #22966 (F12).

* Enhance capability tests for standard names

Refs #22966 (F12).

* Update error message in capability.spec.ts

Refs #22966 (F12).
2026-10-14 12:20:43 +09:00
Kazuaki Matsuo 07d324b488 fix(base-driver): preserve optional WebDriver error data (#22974)
* fix(base-driver): preserve optional WebDriver error data

Preserve supplied Classic WebDriver error data. Refs #22966 (F09).

* fix(base-driver): retain data in returned driver errors

* Add data handling to errorFromW3CJsonCode

Refs #22966 (F09).

* Add tests for error handling in ProxyRequestError

Refs #22966 (F09).

* Enhance proxy tests with error handling case

Refs #22966 (F09).

* test(http-server): cover returned driver error data
2026-10-14 12:09:48 +09:00
Kazuaki Matsuo b452a5eade fix(base-driver): preserve capability invalid argument errors (#22977)
* Change error type for non-W3C capabilities

Refs #22966 (F10).

* fix(base-driver): preserve capability invalid argument errors

Refs #22966 (F10).

* fix(base-driver): preserve capability invalid argument errors

Refs #22966 (F10).

* fix(base-driver): preserve capability invalid argument errors

Refs #22966 (F10).

* fix(base-driver): preserve capability invalid argument errors

Refs #22966 (F10).

* test(fake-driver): expect invalid argument for legacy capabilities
2026-10-14 12:07:37 +09:00
Kazuaki Matsuo f1cf93e368 fix(base-driver): omit null capabilities before merging (#22975)
* Implement omitNullCapabilities function

Refs #22966 (F13).

* Add tests for null capability values handling

Refs #22966 (F13).

* refactor(base-driver): avoid reassigning capability argument

Use a normalizedCaps local for validation and the return value, preserving null-omission behavior. Refs #22966 (F13).
2026-10-14 12:07:08 +09:00
Kazuaki Matsuo eef8246f8a fix(base-driver): validate standard timeouts and preserve null values (#22961)
* fix(base-driver): validate timeouts before applying changes

* test(base-driver): preserve timeouts on invalid updates

* fix(base-driver): preserve null script timeouts

* fix(base-driver): allow nullable script timeout state

* fix(types): accept null script timeouts

* test(base-driver): cover null script timeout updates

* docs(appium): document null script timeouts

* refactor(base-driver): loop over validated timeout updates

* fix(base-driver): validate standard timeouts and preserve null values

* refactor(types): introduce shared TimeoutValue type

Refactor Timeouts type to use TimeoutValue for better clarity.

* refactor(types): export TimeoutValue

* refactor(types): use TimeoutValue for driver timeout state

* refactor(types): use TimeoutValue in timeout command signatures

* refactor(base-driver): use shared type for timeout state

* refactor(base-driver): use TimeoutValue in timeout commands

* docs: simplify timeout API descriptions
2026-10-13 05:21:57 +09:00
Kazuaki Matsuo 3f82e6a181 fix(appium): suspend idle timeout during BiDi commands (#22947)
* fix(appium): track idle timeout across plugin commands

* fix(appium): suspend idle timeout during BiDi commands

* fix(base-driver): guard timeout restarts from legacy drivers

* review

* review

* fix(base-driver)!: require shared command activity tracking

Remove legacy timer method overrides and the compatibility capability flag. Document the driver migration requirement and verify shared activity across ESM copies without replacing timer methods.

BREAKING CHANGE: Drivers must use base-driver with shared command activity tracking. Custom timeout implementations must delegate timer creation to super.startNewCommandTimeout(); legacy private-counter implementations are no longer protected by method overrides.

* add fake driver/plugin example

* remove from readme

* fix(appium): release one proxied BiDi command per response

* test(appium): cover overlapping duplicate BiDi command IDs
2026-10-13 04:18:26 +09:00
Kazuaki Matsuo c10c41384c fix(appium)!: track idle timeout across plugin commands (#22946)
* fix(appium): track idle timeout across plugin commands

* fix(base-driver): guard timeout restarts from legacy drivers

* review

* fix(base-driver)!: require shared command activity tracking

Remove legacy timer method overrides and the compatibility capability flag. Document the driver migration requirement and verify shared activity across ESM copies without replacing timer methods.

BREAKING CHANGE: Drivers must use base-driver with shared command activity tracking. Custom timeout implementations must delegate timer creation to super.startNewCommandTimeout(); legacy private-counter implementations are no longer protected by method overrides.

* add fake driver/plugin example

* remove from readme

* Remove actions needed for driver updates in migration guide

Removed the section detailing actions needed for driver updates related to shared command activity tracking.

* refactor(base-driver): simplify shutdown promise handling

* Add actions needed for custom startNewCommandTimeout

Updated migration guide to include new requirements for custom command timeout implementations.
2026-10-13 03:22:51 +09:00
Kazuaki Matsuo 9b1ddb8bf6 fix(appium): classify driver selection failures as session not created (#22970) 2026-10-12 15:13:58 +09:00
Kazuaki Matsuo 4949ea4375 fix(http-server): set no-cache on WebDriver responses (#22971)
* fix(http-server): set no-cache on WebDriver responses

* test(http-server): isolate cache-control regression requests
2026-10-12 15:10:45 +09:00
Kazuaki Matsuo da8570d882 fix(http-server): return WebDriver errors for the root path (#22969)
* fix(http-server): return WebDriver errors for the root path

* test(http-server): isolate server ports between test cases
2026-10-12 15:07:04 +09:00
Kazuaki Matsuo 122c157292 fix(base-driver): preserve detached shadow root errors (#22968) 2026-10-12 15:05:41 +09:00
Mohamed Mostafa b0b2ce903c fix(images-plugin): return every image match from findElements (#22926) 2026-10-12 07:57:39 +02:00
Edgars Eglītis ba8d57f378 docs: fix missing prefix for platformVersion capability (#22967) 2026-10-11 22:59:46 +03:00
Edgars Eglītis 0b3fe1ce35 feat(appium): fallback to latest compatible extension version for CLI install (#22951)
* feat(appium): fallback to latest compatible extension version for CLI `install`

* fix: fail fast for fully outdated extensions

* fix: revert dep/peerDep requirement

* fix: address comments

* chore: fix tests

* docs: add feature to migration guide
2026-10-11 22:50:28 +03:00
Mykola Mokhnach b67054ad45 docs: update Appium 3 to 4 migration guide (#22965) 2026-10-11 20:32:27 +02:00
Kazuaki Matsuo 7b13975340 fix(support): preserve case-only moves on Windows (#22958)
* fix(support): move source symlinks without following their targets

* fix(support): compare move entries by device and inode

* fix(support): preserve case-only moves on Windows

* test(support): cover Windows case-only moves

* refactor

* refactor(support): extract internal MoveOperation module

This class handles moving files and directories with options for recursive transfers and error handling.

* refactor(support): use internal MoveOperation from fs

Removed the MoveOperation class and its associated methods, simplifying the file structure.
2026-10-11 23:22:17 +09:00
Kazuaki Matsuo 139f086941 fix(storage-plugin): contain upload event socket errors (#22963)
* fix(storage-plugin): contain upload event socket errors

* test(storage-plugin): cover upload event connection errors
2026-10-11 23:13:26 +09:00
Kazuaki Matsuo b54c51da1a fix(base-driver): contain idle timeout cleanup failures (#22964)
* fix(base-driver): contain idle timeout cleanup failures

* test(base-driver): keep other sessions alive after cleanup failures
2026-10-11 23:10:34 +09:00
Kazuaki Matsuo a520720d06 fix(base-driver): validate timeouts before applying changes (#22960)
* fix(base-driver): validate timeouts before applying changes

* test(base-driver): preserve timeouts on invalid updates

* refactor(base-driver): loop over validated timeout updates
2026-10-11 16:50:38 +09:00
Kazuaki Matsuo 6bae658c4b fix(support): reject all directory walk errors (#22956)
* fix(support): reject all directory walk errors

* review
2026-10-11 16:40:02 +09:00
Kazuaki Matsuo 9940156d1a fix(storage-plugin): reject concurrent WebSocket uploads (#22962)
* fix(storage-plugin): reject concurrent WebSocket uploads

* test(storage-plugin): cover upload contention and retries
2026-10-11 16:39:44 +09:00
Kazuaki Matsuo ef5468ceac fix(storage-plugin): reject reserved partial-file names (#22959)
* fix(storage-plugin): reject reserved partial-file names

* test(storage-plugin): cover reserved partial-file names
2026-10-11 16:36:23 +09:00
Kazuaki Matsuo f0d1cad091 fix(base-driver): notify IPC waiters on either unsubscribe path (#22955)
* fix(base-driver): notify IPC waiters on either unsubscribe path

* fix(base-driver): finish IPC waits before notifying observers
2026-10-11 05:33:11 +09:00
Kazuaki Matsuo 81dc35dc6b fix(support): move source symlinks without following their targets (#22954)
* fix(support): move source symlinks without following their targets

* fix(support): compare move entries by device and inode
2026-10-11 05:28:50 +09:00
Kazuaki Matsuo d8fff407cf fix(storage-plugin): preserve pending upload sockets across retries (#22948)
* fix(storage-plugin): preserve pending upload sockets across retries

* fix(storage-plugin): isolate upload names and renew retry expiry

* test(storage-plugin): bound upload waits and cleanup clients

* use sha1

* add test

* revert docs
2026-10-11 05:16:09 +09:00
Kazuaki Matsuo 8272eddcd2 chore: bump shell quote and remove workaround (#22953) 2026-10-11 02:24:46 +09:00
Mykola Mokhnach cce0b5814d feat(types)!: remove driver-specific capabilities from base constraints (#22952)
BREAKING CHANGE: the locale, language, autoWebview, orientation and udid capabilities are no longer part of the standard capability constraints. They are not generic enough and must be defined by the corresponding drivers.
2026-10-10 17:29:16 +02:00
Mykola Mokhnach 8822ceaabb feat(types)!: remove deprecated autoLaunch capability (#22950)
BREAKING CHANGE: the deprecated appium:autoLaunch capability is no longer part of the standard capability constraints.
2026-10-10 17:19:15 +02:00
Kazuaki Matsuo e870487757 fix(base-driver): preserve encoded proxy path parameters (#22945) 2026-10-10 16:15:43 +09:00
Kazuaki Matsuo 9cb4185b07 fix(http-server): contain WebSocket upgrade failures (#22944)
* fix(http-server): contain WebSocket upgrade failures

* test(http-server): bound and verify WebSocket exchanges
2026-10-10 16:15:24 +09:00
github-actions 3afce5b748 chore: publish
- appium@4.0.0-beta.4
 - @appium/base-driver@11.0.0-beta.3
 - @appium/base-plugin@4.0.0-beta.3
 - @appium/docutils@4.0.0-beta.3
 - @appium/driver-test-support@4.0.0-beta.3
 - @appium/execute-driver-plugin@8.0.0-beta.4
 - @appium/fake-driver@7.0.0-beta.4
 - @appium/fake-plugin@5.0.0-beta.4
 - @appium/http-server@1.0.0-beta.3
 - @appium/images-plugin@6.0.0-beta.4
 - @appium/logger@3.0.0-beta.2
 - @appium/opencv@6.0.0-beta.3
 - @appium/oxc-config@2.0.0-beta.2
 - @appium/plugin-test-support@4.0.0-beta.4
 - @appium/relaxed-caps-plugin@4.0.0-beta.4
 - @appium/schema@2.0.0-beta.2
 - @appium/storage-plugin@3.0.0-beta.4
 - @appium/support@8.0.0-beta.3
 - @appium/types@2.0.0-beta.3
 - @appium/universal-xml-plugin@4.0.0-beta.4
2026-10-09 17:41:46 +00:00
Kazuaki Matsuo c5ddcef894 fix: centralize URL hostname formatting and bracket IPv6 hosts (#22914)
* fix: bracket IPv6 hosts in proxy and helper URLs

* refactor(support): share URL hostname formatting across packages

* test: remove duplicate hostname formatting coverage

* refactor(support): move hostname formatting to net module
2026-10-08 23:52:44 +09:00
Edgars Eglītis 01c14af88f chore: port oxc dependency bumps from master (#22924) 2026-10-08 17:25:17 +03:00
Edgars Eglītis 27d3fe41f7 feat(oxc-config): enable plugins at the root level (#22908)
BREAKING CHANGE: enable 19 additional oxlint rules
2026-10-08 17:15:52 +03:00
Edgars Eglītis 57af81cc3b chore: port dependency bumps from master (#22921)
* chore: port dependency bumps from master

* chore: fix format
2026-10-08 17:14:32 +03:00
Edgars Eglītis 9f8455e197 fix: tune wincore driver integration (#22922)
* fix: tune wincore driver integration

* docs: adjust CLI reference doc
2026-10-08 17:04:24 +03:00
Edgars Eglītis 602f8a5ec9 chore: disable more oxlint rules for tests (#22919) 2026-10-08 17:03:03 +03:00
Mykola Mokhnach 7544a1008d feat(appium)!: replace obsolete windows driver with appium-wincore-driver (#22917)
BREAKING CHANGE: Replace the `windows` known-driver shortcut with `wincore` pointing to appium-wincore-driver instead of the obsolete appium-windows-driver
2026-10-08 11:34:50 +02:00
Michael Lip 3063ec9917 fix(universal-xml-plugin): keep the enabled attribute in transformed source (#22911) 2026-10-08 10:09:49 +02:00
Mohamed Mostafa aed3af9538 fix(support): do not drop directories while fs.mv moves a folder (#22913) 2026-10-08 15:27:12 +09:00
Mohamed Mostafa dbae73b921 fix(execute-driver-plugin): bracket IPv6 server hosts for webdriverio (#22912) 2026-10-08 15:24:06 +09:00
Mykola Mokhnach 8297d31fb1 fix(storage-plugin)!: mount routes under the server base path (#22906)
BREAKING CHANGE: the storage routes (and the stream/events websocket paths) were always mounted at the server root, ignoring --base-path. They are now prefixed with the base path, e.g. /wd/hub/appium/storage/add.
2026-10-07 10:13:24 +02:00
Edgars Eglītis 28c1f9392e chore: fix one more oxlint warning (#22907) 2026-10-06 20:37:46 +03:00