diff --git a/.changeset/show-trace-bin.md b/.changeset/show-trace-bin.md new file mode 100644 index 00000000..07c14ef5 --- /dev/null +++ b/.changeset/show-trace-bin.md @@ -0,0 +1,7 @@ +--- +'@wdio/devtools-service': patch +'@wdio/selenium-devtools': patch +'@wdio/nightwatch-devtools': patch +--- + +Ship the `show-trace` bin the package has always declared. The file was never committed, so `npx show-trace ` failed in a project that installed only this adapter. diff --git a/.changeset/snapshot-matches-the-wdio-cli.md b/.changeset/snapshot-matches-the-wdio-cli.md new file mode 100644 index 00000000..797b4599 --- /dev/null +++ b/.changeset/snapshot-matches-the-wdio-cli.md @@ -0,0 +1,6 @@ +--- +"@wdio/elements": minor +"@wdio/devtools-service": minor +--- + +`getSnapshot` can now render with `@wdio/snapshot`, the renderer behind `wdio session snapshot --selectors`. It is opt-in: on WebdriverIO 10.2 (prereleases included) with `@wdio/snapshot` 10.2 or later resolvable (`npm i -D @wdio/snapshot`), it is used; otherwise, including on WebdriverIO 9 and 10.0–10.1, the current output is kept. The result gains `format: 'legacy' | 'snapshot'`, and on the snapshot path `refs`; `elements` is filled on both paths. `viewport` is accepted next to `inViewportOnly`, and wins when both are set. `viewport` defaults to viewport-only on both renderers. `browser.getSnapshot()` in the service defaults to the viewport on both. Existing code keeps compiling. diff --git a/.changeset/wdio-10-1.md b/.changeset/wdio-10-1.md new file mode 100644 index 00000000..e3314dc5 --- /dev/null +++ b/.changeset/wdio-10-1.md @@ -0,0 +1,7 @@ +--- +"@wdio/devtools-backend": patch +"@wdio/selenium-devtools": patch +"@wdio/nightwatch-devtools": patch +--- + +The `@wdio/logger` each package depends on, and the `webdriverio` the Selenium and Nightwatch adapters depend on, move to their 10.1.0 lines (`^10.1.0`), alongside the rest of the WebdriverIO toolchain the repository now builds and tests against. An install that pinned either to 10.0.x resolves 10.1.x from now on. diff --git a/.github/scripts/wdio-peer-smoke/check-imports.mjs b/.github/scripts/wdio-peer-smoke/check-imports.mjs index 19974ebd..0f3c6128 100644 --- a/.github/scripts/wdio-peer-smoke/check-imports.mjs +++ b/.github/scripts/wdio-peer-smoke/check-imports.mjs @@ -40,11 +40,17 @@ async function checkEntryPoints() { const elements = await import('@wdio/elements') for (const fn of [ 'getSnapshot', + 'snapshotRenderer', 'getElements', 'getBrowserAccessibilityTree' ]) { assert.equal(typeof elements[fn], 'function', `@wdio/elements ${fn}`) } + assert.equal( + elements.snapshotRenderer(), + 'legacy', + 'no @wdio/snapshot is installed here, so the legacy renderer renders' + ) const locators = await import('@wdio/elements/locators') assert.equal(typeof locators.xmlToJSON, 'function', '@wdio/elements/locators') } diff --git a/.gitignore b/.gitignore index 69a54ecf..945c6f05 100644 --- a/.gitignore +++ b/.gitignore @@ -64,6 +64,7 @@ coverage/ # pnpm state, cache, logs, and debug files /packages/**/*.mjs +!/packages/*/bin/*.mjs .claude @@ -73,4 +74,3 @@ examples/**/allure-report*/ packages/**/allure-results*/ packages/**/allure-report*/ examples/wdio/cucumber/wdio.allure.conf.ts - diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index dbb41c9c..86ee78e7 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -188,7 +188,7 @@ The execution environment is the browser, not Node, so this package cannot impor The WDIO-typed element-detection API (`@wdio/elements`): `getSnapshot`, `getElements`, the accessibility-tree and interactable-element readers. Unlike `shared` and `core` this package **is** published, so its exported names are public API. -Imports from: `core`. The script bodies, serializers, types, and locator generation all live in `core` (`element-scripts.ts`, `element-snapshot.ts`, `element-types.ts`, `locators/`) because they're framework-agnostic; this package holds only the wrappers that take a `WebdriverIO.Browser` — which `core` can't type against. The arrow never reverses: `core` does not import `elements`, and the adapters' per-action capture (`captureActionSnapshot`) calls core's script bodies directly rather than going through this package. `elements/snapshot.ts` and `elements/locators/index.ts` are re-export shims kept for API stability. +Imports from: `core`. The script bodies, serializers, types, and locator generation all live in `core` (`element-scripts.ts`, `element-snapshot.ts`, `element-types.ts`, `locators/`) because they're framework-agnostic; this package holds only the wrappers that take a `WebdriverIO.Browser` — which `core` can't type against. The arrow never reverses: `core` does not import `elements`, and the adapters' per-action capture (`captureActionSnapshot`) calls core's script bodies directly rather than going through this package. `elements/locators/index.ts` is a re-export shim kept for API stability. The DOM-walking scripts run in the page via `browser.execute`, so — like `script` — they avoid Node-only APIs. diff --git a/CLAUDE.md b/CLAUDE.md index 1bff2f84..43e0c50d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -378,7 +378,7 @@ Documented divergences from the conventions above. They exist today as debt to b - Relatedly, cucumber's **per-step** `resetCommandTracking()` was wiping the native-assert buffer, so each scenario kept only its *last* step's assertions (measured 1 of 2). The buffer is per **test unit** — `resetTestTracking()` at `wrapBrowserOnce` now clears it. - **DOM `mutations` ARE captured**, and the old `ECONNRESET` / "collector not found" attribution is **wrong** — neither appears any more. The gap closed itself with document-start injection (`core/bidi-preload.ts`), confirmed on a *baseline* build so the credit belongs to that change and not to anything here. Measured per scenario with `traceGranularity:'test'` + `webSocketUrl: true`: 39 and 19 mutation entries, 2 DOM anchors each, **0 of 19 rows on the wrong document**. What remains is noise, not a gap: the screencast poller issues `/screenshot` every 200 ms into the session Nightwatch quits per scenario, logging 9–26 `WARN webdriverHttp: … socket hang up` per run. Fix is to stop the recorder before the per-scenario quit, or suppress the warn for a session in teardown. - **A tsup entry that another entry imports is not a leaf, so an `import.meta.url === process.argv[1]` self-start check inside it is dead code; a CLI has to be its own leaf entry.** tsup hoists a module body shared by two entries into `dist/chunk-*.js`, and there `import.meta.url` is the chunk's path, which can never equal `process.argv[1]`. `packages/backend/src/show-trace.ts` imports `start` from `index.ts`, which is what made index shared, so index's old "start if run directly" guard was dead in **every** build: `node dist/index.js` exited 0 without ever serving, while `dist/show-trace.js` self-started correctly for exactly the same reason inverted, being a leaf whose body stays in its own output file (it also compares realpaths, because the invoked path is the `node_modules/.bin` symlink). The live dashboard server is therefore its own leaf entry, `packages/backend/src/server.ts` (shebang, built to an executable `dist/server.js`, shipped as the `devtools-backend` bin, accepting `--port`, `--hostname`, `-h`/`--help`), and `index.ts` stays library-only for the three adapters' in-process `start`/`stop`. Same family as the `cucumberHooks.cts` entry above: the tsup entry list is part of the contract, and in both cases the symptom was silence rather than an error. -- **A captured text locator is generated in the recording runner's dialect; every other branch is portable CSS.** `shared/locator-dialect.ts` `locatorDialect(runner)` is the one fact table — WDIO runners (`mocha`/`jasmine`/`cucumber`) get `a*=Logout`, `nightwatch*`/`selenium-webdriver` and an **unidentified recorder** get `//a[contains(., "Logout")]`. The id reaches the page script as `CaptureActionSnapshotInput.runner` and the zip as an extension field on `context-options`, read back through `isTestRunnerId` onto `Metadata.runner`; absent in older and foreign zips, where the player shows no hint. Under WDIO a text carrying a `"` still emits XPath — WDIO compiles `tag*=` to XPath with `"` quoting and would build a broken expression — and WDIO resolves `//` itself. `locatorsMatch` decomposes **both** sides from either dialect, so `after.point` survives whichever way round the two grammars fall; the `concat()`-stitched literal is still left to exact comparison. `@wdio/elements`' standalone `getSnapshot` deliberately keeps the portable XPath default (its output is pasted into arbitrary tools), so a WDIO run's `browser.getSnapshot()` and its trace A11y tab disagree on that one branch. +- **A captured text locator is generated in the recording runner's dialect; every other branch is portable CSS.** `shared/locator-dialect.ts` `locatorDialect(runner)` is the one fact table — WDIO runners (`mocha`/`jasmine`/`cucumber`) get `a*=Logout`, `nightwatch*`/`selenium-webdriver` and an **unidentified recorder** get `//a[contains(., "Logout")]`. The id reaches the page script as `CaptureActionSnapshotInput.runner` and the zip as an extension field on `context-options`, read back through `isTestRunnerId` onto `Metadata.runner`; absent in older and foreign zips, where the player shows no hint. Under WDIO a text carrying a `"` still emits XPath — WDIO compiles `tag*=` to XPath with `"` quoting and would build a broken expression — and WDIO resolves `//` itself. `locatorsMatch` decomposes **both** sides from either dialect, so `after.point` survives whichever way round the two grammars fall; the `concat()`-stitched literal is still left to exact comparison. `@wdio/elements` `getSnapshot` on WebdriverIO ≥10.2 (`format: 'snapshot'`) is not on this table at all: it renders `@wdio/snapshot`'s `attachSelectors` choice, the renderer `wdio session snapshot --selectors` uses, which can be a WebdriverIO-v10-only strategy (`role/…`, `aria/…`), so a WDIO run's `browser.getSnapshot()` and its trace A11y tab can differ on that branch. - `Metadata.runner` (typed `TestRunnerId`) and `metadata.options.framework` (untyped `string`, read by the sidebar's `getFramework`) are two carriers of the same fact. All three adapters now set both; the next change to either should collapse `getFramework` onto `Metadata.runner`. - Selenium's `ctx.runner` (the *detected JS runner* — mocha/jest/cucumber, from `detectRunner()`) shadows the new `Metadata.runner` concept. Renamed to `detectedRunner` at the `driverMetadata` boundary only, where the two met inside one function and a swap would have been a silent dialect bug; the repo-wide rename in `plugin-internals.ts`/`session-lifecycle.ts` is still open. - **A node:assert's target comes from VALUE PROVENANCE, not from the assert call.** node:assert takes values, so `assert.equal(await el.getText(), …)` names no element. `core/read-value-locators.ts` owns the value→locator registry (`rememberReadValue`/`selectorForReadValue`/`resolveAssertTargetFromArgs`; most-recent-producer-wins, 200 keys, ≤256 chars, primitives only), reached through `patchNodeAssert`'s optional `resolveAssertTarget` hook, which walks the **raw** args (sanitizing destroys handle identity) onto the shared `CommandLog.selector`. It lives in core because all three JS adapters feed it. **The registry is scoped to one test**: `clearReadValues` empties it when a test or scenario starts (the service's `resetStack` from `beforeTest`/`beforeScenario`, Selenium's `startTest`/`startScenario`, which a plain script reaches through the public `startTest`, and Nightwatch's `resetTestTracking`), so a later test's `assert.ok(true)` cannot box an element an earlier test read `true` from. Nightwatch's plugin hook fires once per module on the BDD interface, so `BrowserProxy.scopeReadValuesToRowTest` also clears when the running `it` (`rowTestUid`) changes, before every record and every lookup; a value a `beforeEach` hook reads is therefore dropped at the `it`'s first command or assertion, since Nightwatch still names the previous `it` while that hook runs. Python clears at `pytest_runtest_logstart`. **The WDIO service** feeds it from `SessionCapturer.afterCommand` for every row it logs: a command ACTION_MAP classes `Element` (`command-selectors.ts` `isElementCommand`) records the selector the row resolved, and every other read (`getTitle`, `getUrl`) records the null sentinel; `wireAssertCapture` passes `resolveAssertTargetFromArgs` to `patchNodeAssert`. A node:assert row with no known producer names nothing rather than the last element a locator resolved, which is what boxed `h2` for `assert.notEqual(await browser.getTitle(), …)`. The user's own `getTitle` is a `Page.getTitle` row: the service's snapshot probe reads the title from inside a hook whose stack holds the spec frame, so `action-snapshot.ts` runs its own title read inside an `AsyncLocalStorage` context and both hooks skip a `getTitle` observed inside it (`isServiceProbe`; WDIO awaits a command's hooks within the command, so they inherit its context). A count of probes in flight was not enough: core's probe timeout abandons a `getTitle` still running, and the count then hid a user `getTitle` issued in that window. Listing `getTitle` in `INTERNAL_COMMANDS` hid the user's call too. **Python** mirrors it in `selenium_devtools/read_value_locators.py`, since it cannot import core: every captured command records its result from the patched `execute` (a driver-level read records `None`; `get_attribute`/`is_displayed`, which reach the wire as scripts, resolve the element passed as their argument), and a pytest or plain-script assertion row looks up the observed operand before the expected one. In both languages the first operand with a known producer decides, so a subject recorded as owned by no element (a title or url read) ends the lookup instead of letting the expected value borrow the box of an element that once read the same text. **Selenium** feeds it from `driverPatcher`'s settle path and composes it with its handle WeakMap (`helpers/element-locators.ts`, adapter-local — it keys on `WebElement` identity, which no other framework has). **Nightwatch** feeds it from `browserProxy`'s capture callback via `assertTarget.commandTargetSelector`, an allowlist of element-read commands; every other command — every driver-level read (`title`, `getCurrentUrl`, `source`) included — records the **null sentinel**, without which a page-title assertion inherits the box of an element that reads the same text (measured on selenium's mocha example, `h1` vs `document.title` both "Example Domain"; reproduced and fixed for Nightwatch on a local `#hero`/`` collision page). Measured: Nightwatch node:assert rows with a locator **0/7 → 4/7** (the 3 without are a title read, the title/`#hero` collision, and a literal); Selenium unchanged at 2/4 mocha and 2/3 cucumber. Residuals: boolean reads are weakly discriminating, so a value collision with no intervening producer can mis-attribute; Nightwatch's `element()/.find()` API and its ignored commands (`execute`, `executeAsync`, `perform`) are never wrapped, so their values neither claim nor clear. **`after.point` is deliberately not extended to assert rows** — `resolveActionPoint` gates on `class:'Element'` + `POINTABLE_METHODS`, so WDIO's folded assertion rows get none either; a point draws a click marker an assertion never earned. diff --git a/examples/wdio/package.json b/examples/wdio/package.json index 42f1becc..f3c53228 100644 --- a/examples/wdio/package.json +++ b/examples/wdio/package.json @@ -4,14 +4,14 @@ "private": true, "type": "module", "devDependencies": { - "@wdio/cli": "10.0.2", - "@wdio/cucumber-framework": "10.0.1", + "@wdio/cli": "10.1.0", + "@wdio/cucumber-framework": "10.1.0", "@wdio/devtools-service": "workspace:*", - "@wdio/globals": "10.0.2", - "@wdio/local-runner": "10.0.2", - "@wdio/mocha-framework": "10.0.1", - "@wdio/spec-reporter": "10.0.1", - "@wdio/types": "10.0.1", + "@wdio/globals": "10.1.0", + "@wdio/local-runner": "10.1.0", + "@wdio/mocha-framework": "10.1.0", + "@wdio/spec-reporter": "10.1.0", + "@wdio/types": "10.1.0", "expect-webdriverio": "^8.0.0", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", diff --git a/package.json b/package.json index 152a07df..5b60843f 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "@typescript-eslint/parser": "^8.71.0", "@typescript-eslint/utils": "^8.71.0", "@vitest/coverage-v8": "^5.0.2", - "@wdio/allure-reporter": "^10.0.1", + "@wdio/allure-reporter": "^10.1.0", "eslint": "^10.11.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-import": "^2.32.0", @@ -67,10 +67,10 @@ "unplugin-icons": "^24.0.0", "vite": "^8.3.2", "vitest": "^5.0.2", - "webdriverio": "^10.0.2", + "webdriverio": "^10.1.0", "ws": "^8.22.0" }, "dependencies": { - "@wdio/cli": "10.0.2" + "@wdio/cli": "10.1.0" } } diff --git a/packages/app/package.json b/packages/app/package.json index 8b26e7cc..f4ae0a91 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -28,13 +28,13 @@ "@iconify-json/mdi": "^1.2.3", "@lit/context": "^1.1.6", "@tailwindcss/postcss": "^4.3.3", - "@wdio/browser-runner": "^10.0.2", + "@wdio/browser-runner": "^10.1.0", "@wdio/devtools-shared": "workspace:^", "@wdio/devtools-trace": "workspace:^", - "@wdio/globals": "^10.0.2", - "@wdio/mocha-framework": "^10.0.1", + "@wdio/globals": "^10.1.0", + "@wdio/mocha-framework": "^10.1.0", "@wdio/protocols": "10.0.2", - "@wdio/reporter": "10.0.1", + "@wdio/reporter": "10.1.0", "codemirror": "^6.0.2", "expect-webdriverio": "^8.0.0", "lit": "^3.3.3", diff --git a/packages/backend/package.json b/packages/backend/package.json index e3bbc181..68f7cfb4 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -44,7 +44,7 @@ "@fastify/websocket": "^11.3.1", "@wdio/devtools-app": "workspace:^", "@wdio/devtools-script": "workspace:^", - "@wdio/logger": "10.0.0", + "@wdio/logger": "^10.1.0", "fastify": "^5.12.5", "fflate": "^0.8.2", "get-port": "^7.2.0", @@ -57,7 +57,7 @@ "devDependencies": { "@types/shell-quote": "^1.7.5", "@types/ws": "^8.18.2", - "@wdio/cli": "^10.0.2", + "@wdio/cli": "^10.1.0", "@wdio/devtools-shared": "workspace:^", "@wdio/devtools-trace": "workspace:^", "nodemon": "^3.1.14", diff --git a/packages/conformance/package.json b/packages/conformance/package.json index 3e6d335a..13c88d36 100644 --- a/packages/conformance/package.json +++ b/packages/conformance/package.json @@ -19,23 +19,23 @@ "@types/selenium-webdriver": "^4.35.6", "@types/ws": "^8.18.2", "@types/yazl": "^3.3.1", - "@wdio/cli": "10.0.2", + "@wdio/cli": "10.1.0", "@wdio/devtools-service": "workspace:^", "@wdio/devtools-shared": "workspace:^", "@wdio/devtools-trace": "workspace:^", - "@wdio/globals": "10.0.2", - "@wdio/local-runner": "10.0.2", - "@wdio/mocha-framework": "10.0.1", + "@wdio/globals": "10.1.0", + "@wdio/local-runner": "10.1.0", + "@wdio/mocha-framework": "10.1.0", "@wdio/nightwatch-devtools": "workspace:^", "@wdio/selenium-devtools": "workspace:^", - "@wdio/spec-reporter": "10.0.1", + "@wdio/spec-reporter": "10.1.0", "expect-webdriverio": "^8.0.0", "fflate": "^0.8.2", "mocha": "^12.0.3", "nightwatch": "^3.16.0", "selenium-webdriver": "^4.50.0", "vite": "^8.3.2", - "webdriverio": "^10.0.2", + "webdriverio": "^10.1.0", "ws": "^8.22.0", "yazl": "^3.3.1" } diff --git a/packages/conformance/src/constants.ts b/packages/conformance/src/constants.ts index 15037bc8..098d455f 100644 --- a/packages/conformance/src/constants.ts +++ b/packages/conformance/src/constants.ts @@ -183,6 +183,13 @@ export const RENDERED_AFTER_MS: Record<string, number> = { '#flash': 150 } export const BROKEN_PATH = '/broken' +/** W3C's session defaults: a real browser always answers `GET /timeouts` with all three, and WebdriverIO 10.1 reads `script` from it before every BiDi `execute`. */ +export const DEFAULT_TIMEOUTS = { + script: 30_000, + pageLoad: 300_000, + implicit: 0 +} + export const BIDI_PATH = '/session/conformance/bidi' /** BiDi acknowledgements whose callers read a field back; commands the fake browser models are answered from its state. */ diff --git a/packages/conformance/src/fake-webdriver.ts b/packages/conformance/src/fake-webdriver.ts index 290fa276..0ddda377 100644 --- a/packages/conformance/src/fake-webdriver.ts +++ b/packages/conformance/src/fake-webdriver.ts @@ -12,6 +12,7 @@ import { BLANK_PNG, BROKEN_PATH, COLLECTOR_SIGNATURE, + DEFAULT_TIMEOUTS, DOCUMENT_MIME, ELEMENT_KEY, ELEMENT_TEXT, @@ -62,6 +63,13 @@ type Reply = { const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms)) +const FIXED_REPLIES: Record<string, unknown> = { + '/screenshot': BLANK_PNG, + '/window/rect': { x: 0, y: 0, width: 1280, height: 720 }, + '/window': WINDOW_HANDLE, + '/window/handles': [WINDOW_HANDLE] +} + /** A W3C WebDriver over a two-page model with one late-rendered element; without a preload its collector anchors only when a drain forces it. */ export class FakeWebDriver { readonly origin: string @@ -217,6 +225,9 @@ export class FakeWebDriver { if (method === 'POST' && (path === '/element' || path === '/elements')) { return this.#find(String(params.value), path === '/elements') } + if (method === 'GET' && path === '/timeouts') { + return { value: DEFAULT_TIMEOUTS } + } const element = path.match(/^\/element\/([^/]+)\/(value|click|clear|text)$/) if (element) { return this.#onElement(element[1], element[2], params) @@ -224,19 +235,7 @@ export class FakeWebDriver { if (method === 'POST' && path.startsWith('/execute/')) { return this.#executeReply(params) } - if (path === '/screenshot') { - return { value: BLANK_PNG } - } - if (path === '/window/rect') { - return { value: { x: 0, y: 0, width: 1280, height: 720 } } - } - if (path === '/window') { - return { value: WINDOW_HANDLE } - } - if (path === '/window/handles') { - return { value: [WINDOW_HANDLE] } - } - return { value: null } + return { value: FIXED_REPLIES[path] ?? null } } async #navigate(path: string): Promise<Reply> { diff --git a/packages/conformance/tests/fakes.test.ts b/packages/conformance/tests/fakes.test.ts index fef2e848..f8c6b021 100644 --- a/packages/conformance/tests/fakes.test.ts +++ b/packages/conformance/tests/fakes.test.ts @@ -291,6 +291,24 @@ describe('the fake network', () => { }) }) +describe('the fake WebDriver', () => { + // WebdriverIO 10.1 destructures this before every BiDi execute; a null answer made every script throw unsent. + it('answers GET /timeouts with the W3C timeouts object', async () => { + const driver = await start('live') + await session(driver) + expect(await call(driver, 'GET', '/session/conformance/timeouts')).toEqual({ + script: 30_000, + pageLoad: 300_000, + implicit: 0 + }) + expect( + await call(driver, 'POST', '/session/conformance/timeouts', { + implicit: 5 + }) + ).toBeNull() + }) +}) + describe('the fake collector', () => { // Regression: re-injection kept the document anchored, so a duplicate anchor could never be modelled. it('anchors again after a second injection, which one-anchor-per-document flags', async () => { diff --git a/packages/core/tests/mobile-snapshot.test.ts b/packages/core/tests/mobile-snapshot.test.ts new file mode 100644 index 00000000..ef8a4fc6 --- /dev/null +++ b/packages/core/tests/mobile-snapshot.test.ts @@ -0,0 +1,100 @@ +import { describe, expect, it } from 'vitest' + +import { serializeMobileSnapshot } from '../src/element-snapshot.js' +import type { JSONElement } from '../src/locators/types.js' + +function mobileEl( + tagName: string, + attrs: JSONElement['attributes'], + children: JSONElement[] = [] +): JSONElement { + return { tagName, attributes: attrs, children, path: '' } +} + +describe('serializeMobileSnapshot', () => { + it('produces a platform header with device and viewport', () => { + const root = mobileEl('hierarchy', {}) + const out = serializeMobileSnapshot(root, { + platform: 'android', + deviceName: 'Pixel 7', + viewport: { width: 412, height: 915 } + }) + expect(out).toMatch('[android — Pixel 7 (412×915)]') + }) + + it('renders interactive Android element with accessibility-id locator', () => { + const root = mobileEl('hierarchy', {}, [ + mobileEl('android.widget.Button', { + clickable: 'true', + 'content-desc': 'Skip', + text: '' + }) + ]) + const out = serializeMobileSnapshot(root, { platform: 'android' }) + expect(out).toContain('button "Skip" → ~Skip') + }) + + it('falls back to resource-id when no content-desc', () => { + const root = mobileEl('hierarchy', {}, [ + mobileEl('android.widget.EditText', { + clickable: 'true', + 'content-desc': '', + 'resource-id': 'com.example:id/search', + text: '' + }) + ]) + const out = serializeMobileSnapshot(root, { platform: 'android' }) + expect(out).toContain('textbox "search" → id:com.example:id/search') + }) + + it('renders ∈ ancestor context when element has no identity', () => { + const root = mobileEl('hierarchy', {}, [ + mobileEl( + 'android.widget.LinearLayout', + { 'content-desc': 'Search section' }, + [ + mobileEl('android.widget.EditText', { + clickable: 'true', + 'content-desc': '', + 'resource-id': 'com.example:id/search', + text: '' + }) + ] + ) + ]) + const out = serializeMobileSnapshot(root, { platform: 'android' }) + expect(out).toContain( + 'textbox "search" ∈ "Search section" → id:com.example:id/search' + ) + }) + + it('renders iOS element with accessibility-id', () => { + const root = mobileEl('XCUIElementTypeApplication', {}, [ + mobileEl('XCUIElementTypeButton', { + accessible: 'true', + name: 'Accept All Cookies', + label: 'Accept All Cookies' + }) + ]) + const out = serializeMobileSnapshot(root, { platform: 'ios' }) + expect(out).toContain('button "Accept All Cookies" → ~Accept All Cookies') + }) + + it('simplifies iOS XCUIElementType prefix', () => { + const root = mobileEl('XCUIElementTypeApplication', {}, [ + mobileEl('XCUIElementTypeScrollView', {}) + ]) + const out = serializeMobileSnapshot(root, { platform: 'ios' }) + expect(out).toContain('ScrollView') + expect(out).not.toContain('XCUIElementType') + }) + + it('shows container without selector', () => { + const root = mobileEl('hierarchy', {}, [ + mobileEl('android.widget.FrameLayout', { 'content-desc': '' }) + ]) + const out = serializeMobileSnapshot(root, { platform: 'android' }) + expect(out).toContain('FrameLayout') + expect(out).not.toContain('→') + }) +}) diff --git a/packages/elements/README.md b/packages/elements/README.md index b188671c..d9585d5c 100644 --- a/packages/elements/README.md +++ b/packages/elements/README.md @@ -8,7 +8,7 @@ Element detection and locator generation for WebdriverIO — browser DOM queryin npm install @wdio/elements ``` -Requires `webdriverio` as a peer dependency (`^9.0.0 || ^10.0.0`). +Peer dependency: `webdriverio` `^9.0.0 || ^10.0.0`. Optional peer: `@wdio/snapshot` `^10.2.0-0`, the snapshot renderer (see below). ## Usage @@ -23,30 +23,47 @@ const result = await getElements(browser, { limit: 50, inViewportOnly: true }) ### Accessibility snapshot (`getSnapshot`) -A single call for web and mobile that returns an AI-readable accessibility/DOM snapshot as a `SnapshotResult` — a text tree with `e1`, `e2`, … virtual element IDs baked in, plus an `elements` map that resolves each ID to a real selector. No post-processing required. +Returns the accessibility tree as text: each actionable element gets an `eN` ref, and on the snapshot renderer its line ends in `→ <selector>`. The renderer is opt-in: + +- **Below 10.2** (9.x, 10.0, 10.1): the legacy renderer, which keeps this package's previous output. Do not install `@wdio/snapshot` on these versions: npm refuses it or nests a WebdriverIO 10 under your WebdriverIO 9. +- **10.2 and later, prereleases included** (`10.2.0-alpha.*`), with `@wdio/snapshot` 10.2 or later resolvable: `@wdio/snapshot`, the renderer behind `wdio session snapshot --selectors`. On WebdriverIO 10.2.0-alpha it matched the CLI on 6 of 15 pages checked; the differences are listed below. Install it yourself (`npm i -D @wdio/snapshot`, a 10.2 or later release). +- **10.2 and later without a resolvable `@wdio/snapshot` 10.2 or later**: the legacy renderer. It warns when an `@wdio/snapshot` below 10.2 is resolvable or resolution fails, and is silent only when `@wdio/snapshot` is not installed. ```ts import { getSnapshot } from '@wdio/elements' -const { text, elements } = await getSnapshot(browser, { inViewportOnly: true }) -// text: '[Page: Login — https://…]\n button "Log in" → //button[contains(., "Log in")]\n …' -// elements: { e1: { selector, qualifiedSelector?, tagName, role, text }, … } +const { format, text, elements, refs } = await getSnapshot(browser, { + viewport: true +}) +// text: '- button "start" [ref=e1] → ~start' (one line per node) +// elements: { e1: { selector, tagName, role, text } } +// refs: SnapshotRef[], on format 'snapshot' only ``` -Every locator this API returns is portable across WebdriverIO, Selenium and -Nightwatch: CSS where an id/attribute/class identifies the element uniquely, -XPath where its text does (WebdriverIO resolves a leading `//` as XPath; -Selenium takes it via `By.xpath`, Nightwatch via its `'xpath'` locate strategy). +The result fields: + +- `format`: `'snapshot'` or `'legacy'`, the renderer that produced the result. +- `text`: the tree with `eN` refs. +- `elements`: each ref's selector, role and name. On the snapshot path `tagName` is empty. +- `refs`: the `SnapshotRef[]` behind the text, on the snapshot path only. + +On the snapshot path a ref can carry no selector: when the page yields no unique candidate selector for it, under any transport, it has no `elements` entry and its line in `text` has no `→` part (its candidates stay in `refs`). + +Options: `viewport` (or its alias `inViewportOnly`; `viewport` wins when both are set). The default is viewport-only on both renderers. Pass `{ viewport: false }` for the full page, which is much larger on long pages. -The DevTools **per-action trace capture** runs the same scripts but asks for the -locator in the recording runner's own dialect, so a WebdriverIO trace shows -`button*=Log in` while a Selenium one shows the XPath above. Nightwatch prefers a -unique CSS selector and falls back to that XPath only when none exists. Only -the text branch differs; every other branch is the same portable CSS. +`snapshotRenderer()` returns `'snapshot'` when the installed `webdriverio` is 10.2 or later and the resolved `@wdio/snapshot` is 10.2 or later, else `'legacy'`. If `@wdio/snapshot` is installed but fails to load, `getSnapshot` falls back to legacy with a warning, `snapshotRenderer()` returns `'legacy'` from then on, and the result's `format` is the authoritative answer. -It auto-detects platform: web sessions walk the browser accessibility tree, mobile sessions parse the page-source XML. `@wdio/devtools-service` also registers a `browser.getSnapshot()` runtime accessor that calls this directly. +Native sessions (`platformName` of Android, iOS, Mac or Windows with no `browserName`) parse the page source on the snapshot path. Only collection failures `@wdio/snapshot` raises are `SnapshotError`s; they and driver errors propagate, driver errors unchanged. Two exceptions: a failed page-source read logs a warning and returns `text: '[No elements found]'` with empty `elements` and `refs`; and if the driver cannot report the window size a native viewport snapshot reads, the whole tree is rendered, as on the legacy path. -This is the snapshot the DevTools **trace player** consumes: the per-action accessibility tree feeds the player's **A11y tab** (roles + accessible names, hover to highlight, click to copy a locator), and the resolved `elements` back the player's **element overlay / pick-locator** (click-to-copy boxes drawn over each interacted element, cross-linked to the A11y rows). +The DevTools **per-action trace capture** is a separate path with its own page scripts, so a locator in a trace can differ from the one `getSnapshot` renders. + +Differences from the CLI, whose session holds state this function does not have. The renderer and selector logic are shared: + +- The CLI session installs a page recorder that marks elements with JS click listeners as clickable. A plain `getSnapshot` has none, so a control with only a click listener gets no ref. +- The CLI appends a `Requests failed:` note. +- The CLI numbers refs across the actions of its session. Here they start at `e1` on every call. + +`@wdio/devtools-service`'s `browser.getSnapshot()` calls this function with `viewport` defaulting to `true` on both renderers, so it reads the visible viewport unless you pass `{ viewport: false }`. If the call fails it logs a warning and returns `{ format, text: '[Snapshot unavailable]', elements: {} }` (plus `refs: []` on the snapshot format) instead of throwing; the `getSnapshot` exported here throws. ### Browser @@ -76,22 +93,30 @@ const elements = await getMobileVisibleElements(browser, 'ios', { }) ``` -For the raw JSON element tree alongside the flat list: +### AI-readable snapshots ```ts -import { getMobileVisibleElementsWithTree } from '@wdio/elements' +import { getBrowserAccessibilityTree, serializeWebSnapshot } from '@wdio/elements' -const { elements, tree } = await getMobileVisibleElementsWithTree(browser, 'android') +const nodes = await getBrowserAccessibilityTree(browser, { inViewportOnly: true }) +const text = serializeWebSnapshot( + nodes, + { url: await browser.getUrl(), title: await browser.getTitle() }, + { inViewportOnly: true } +) ``` -### AI-readable snapshots - ```ts -import { serializeWebSnapshot, serializeMobileSnapshot } from '@wdio/elements' - -const snapshot = await serializeWebSnapshot(browser, { includeBounds: true }) -// or -const snapshot = await serializeMobileSnapshot(browser, 'android', { includeLocators: true }) +import { serializeMobileSnapshot } from '@wdio/elements' +import { xmlToJSON } from '@wdio/elements/locators' + +const sourceXML = await browser.getPageSource() +const root = xmlToJSON(sourceXML) +const text = root && serializeMobileSnapshot( + root, + { platform: 'android', sourceXML }, + { inViewportOnly: true } +) ``` ### Locator generation @@ -121,11 +146,11 @@ Auto-detects platform and returns a unified result. ### `getSnapshot(browser, options)` -Auto-detects platform and returns a `SnapshotResult` — `{ text, elements }` — where `text` is the rendered accessibility tree with embedded `e1`, `e2`, … IDs and `elements` maps each ID to a `SnapshotElement` (`selector`, optional `qualifiedSelector` for `.instance(N)` disambiguation, `tagName`, `role`, `text`). +Returns `GetSnapshotResult` — `{ format, text, elements, refs? }`; see [Accessibility snapshot](#accessibility-snapshot-getsnapshot) for the fields. | Param | Type | Default | Description | |---|---|---|---| -| `inViewportOnly` | `boolean` | `true` | Only include elements whose bounds intersect the viewport | +| `viewport` | `boolean` | `true` | Only include what intersects the viewport; `inViewportOnly` is accepted as an alias and `viewport` wins when both are set | ### `getInteractableBrowserElements(browser, options)` @@ -139,14 +164,6 @@ Single DOM walk returning the accessibility tree as a flat `AccessibilityNode[]` Parses page source XML (2 HTTP calls total) and returns elements with generated locators. -### `getMobileVisibleElementsWithTree(browser, platform, options)` - -Same as above but also returns the raw `JSONElement` tree. - -### `serializeWebSnapshot(browser, options)` / `serializeMobileSnapshot(browser, platform, options)` - -Generate AI-readable (TOON-format) snapshots for LLM consumption. - ### `@wdio/elements/locators` Re-exports the full locator generation pipeline from `@wdio/devtools-core`: @@ -167,9 +184,8 @@ export type { MobileElementInfo, GetMobileElementsOptions, AccessibilityNode, VisibleElementsResult, - WebSnapshotOptions, MobileSnapshotOptions, - GetSnapshotOptions, - SnapshotResult, SnapshotElement + GetSnapshotOptions, GetSnapshotResult, + CandidateKind, SnapshotCandidate, SnapshotNode, SnapshotRef } from '@wdio/elements' // From @wdio/elements/locators: diff --git a/packages/elements/ROADMAP.md b/packages/elements/ROADMAP.md index e1eeeff6..a5fc510c 100644 --- a/packages/elements/ROADMAP.md +++ b/packages/elements/ROADMAP.md @@ -19,7 +19,9 @@ net first. ### 1.2 Snapshot-output golden tests -`serializeMobileSnapshot` and `serializeWebSnapshot` need output-fidelity tests +`serializeMobileSnapshot` (`packages/core/src/element-snapshot.ts`) and +`serializeWebSnapshot` (`packages/trace/src/a11y-snapshot.ts`, re-exported by +core) need output-fidelity tests before the interactive-element dedup or mobile pipeline unification. Without them, any change to the snapshot format is a blind regression risk for LLM consumers. diff --git a/packages/elements/package.json b/packages/elements/package.json index 526063e8..9f60ca68 100644 --- a/packages/elements/package.json +++ b/packages/elements/package.json @@ -43,13 +43,21 @@ "@microsoft/api-extractor": "^7.59.3", "@types/node": "26.6.4", "@wdio/devtools-core": "workspace:^", - "@wdio/globals": "10.0.2", + "@wdio/devtools-shared": "workspace:^", + "@wdio/globals": "10.1.0", + "@wdio/snapshot": "^10.2.0-0", "tsup": "^8.5.1", "typescript": "6.0.3", "vitest": "^5.0.2", - "webdriverio": "^10.0.2" + "webdriverio": "^10.1.0" }, "peerDependencies": { + "@wdio/snapshot": "^10.2.0-0", "webdriverio": "^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "@wdio/snapshot": { + "optional": true + } } } diff --git a/packages/elements/src/get-snapshot.ts b/packages/elements/src/get-snapshot.ts index 9f003a94..fdb5f54f 100644 --- a/packages/elements/src/get-snapshot.ts +++ b/packages/elements/src/get-snapshot.ts @@ -1,155 +1,53 @@ -/** - * Unified getSnapshot() — single call for web and mobile. - * - * Auto-detects platform, fetches the accessibility tree (web) or page source - * (mobile), converts to a flat SnapshotNode[], and renders a text tree with - * e1, e2, … virtual IDs baked in plus an elements map for direct selector - * resolution. - */ - -import type { SnapshotResult } from '@wdio/devtools-core/element-types' +import type { SnapshotElement } from '@wdio/devtools-core/element-types' +import type { SnapshotRef } from './snapshot-types.js' +import { getSnapshot as getLegacySnapshot } from './legacy-snapshot.js' +import { usesWdioSnapshot } from './webdriverio-version.js' import { - buildSnapshot, - accessibilityNodesToSnapshotNodes, - jsonElementToSnapshotNodes -} from '@wdio/devtools-core/element-snapshot' -import { getBrowserAccessibilityTree } from './accessibility-tree.js' -import { xmlToJSON } from './locators/index.js' + renderWdioSnapshot, + resolvesWdioSnapshot, + wdioSnapshotLoadFailed +} from './wdio-snapshot.js' + +export type SnapshotFormat = 'legacy' | 'snapshot' export interface GetSnapshotOptions { - /** Only include elements whose bounds intersect the viewport (default true). */ + /** Only include what intersects the viewport (default true on both renderers). */ inViewportOnly?: boolean + /** Same as `inViewportOnly`; wins when both are set. */ + viewport?: boolean } -/** - * Take a snapshot of the current page/app state. - * - * Returns a text tree with eN virtual IDs for every interactive element - * and an elements map so consumers can resolve e1, e2, … to real selectors - * without any post-processing. - */ -export async function getSnapshot( - browser: WebdriverIO.Browser, - options?: GetSnapshotOptions -): Promise<SnapshotResult> { - const { inViewportOnly = true } = options ?? {} - - if (browser.isAndroid || browser.isIOS) { - return getMobileSnapshot(browser, inViewportOnly) - } - return getWebSnapshot(browser, inViewportOnly) -} - -// --------------------------------------------------------------------------- -// Web -// --------------------------------------------------------------------------- - -async function getWebSnapshot( - browser: WebdriverIO.Browser, - inViewportOnly: boolean -): Promise<SnapshotResult> { - const [url, title, nodes] = await Promise.all([ - safeCall(() => browser.getUrl()), - safeCall(() => browser.getTitle()), - getBrowserAccessibilityTree(browser, { inViewportOnly }) - ]) - - const header = buildWebHeader(title, url) - const snapshotNodes = accessibilityNodesToSnapshotNodes(nodes, { - inViewportOnly - }) - return buildSnapshot(header, snapshotNodes) +export interface GetSnapshotResult { + format: SnapshotFormat + /** Accessibility tree as text, one `eN` ref per actionable element. */ + text: string + elements: Record<string, SnapshotElement> + /** Set on the `snapshot` format: the candidate selectors of each ref. */ + refs?: SnapshotRef[] } -function buildWebHeader(title?: string, url?: string): string { - let h = '[Page' - if (title) { - h += `: ${title}` - } - if (url) { - h += ` — ${url}` - } - h += ']' - return h +/** `snapshot` when WebdriverIO and @wdio/snapshot are both 10.2 or later, else `legacy`. */ +export function snapshotRenderer(): SnapshotFormat { + return usesWdioSnapshot() && + resolvesWdioSnapshot() && + !wdioSnapshotLoadFailed() + ? 'snapshot' + : 'legacy' } -// --------------------------------------------------------------------------- -// Mobile -// --------------------------------------------------------------------------- - -async function getMobileSnapshot( +/** `format` is what rendered, which can differ from `snapshotRenderer()` if @wdio/snapshot fails to load. */ +export async function getSnapshot( browser: WebdriverIO.Browser, - inViewportOnly: boolean -): Promise<SnapshotResult> { - const platform: 'android' | 'ios' = browser.isAndroid ? 'android' : 'ios' - - const [viewportSize, pageSource] = await Promise.all([ - safeCall(() => browser.getWindowSize()), - safeCall(() => browser.getPageSource()) - ]) - - if (!pageSource) { - return { text: '[No elements found]', elements: {} } - } - - const root = xmlToJSON(pageSource) - if (!root) { - return { text: '[No elements found]', elements: {} } - } - - // A zero-dimension viewport (minimized app, broken ADB connection) would - // silently clip every element. Treat it as unavailable instead. - const safeViewport = - viewportSize?.width && viewportSize?.height ? viewportSize : undefined - - const deviceName = getDeviceName(browser) - - const header = buildMobileHeader(platform, deviceName, safeViewport) - - const snapshotNodes = jsonElementToSnapshotNodes(root, platform, { - inViewportOnly, - viewport: safeViewport, - sourceXML: pageSource - }) - - return buildSnapshot(header, snapshotNodes) -} - -function buildMobileHeader( - platform: string, - deviceName: string, - viewport?: { width: number; height: number } -): string { - let h = `[${platform}` - if (deviceName) { - h += ` — ${deviceName}` - } - if (viewport) { - h += ` (${viewport.width}×${viewport.height})` - } - h += ']' - return h -} - -// --------------------------------------------------------------------------- -// Helpers -// --------------------------------------------------------------------------- - -async function safeCall<T>(fn: () => Promise<T>): Promise<T | undefined> { - try { - return await fn() - } catch { - return undefined - } -} - -function getDeviceName(browser: WebdriverIO.Browser): string { - try { - const caps = browser.capabilities as Record<string, unknown> - return ( - (caps['appium:deviceName'] as string) ?? (caps.deviceName as string) ?? '' - ) - } catch { - return '' - } + options: GetSnapshotOptions = {} +): Promise<GetSnapshotResult> { + const viewport = options.viewport ?? options.inViewportOnly ?? true + const rendered = + snapshotRenderer() === 'snapshot' + ? await renderWdioSnapshot(browser, viewport) + : undefined + if (rendered) { + return rendered + } + const legacy = await getLegacySnapshot(browser, { inViewportOnly: viewport }) + return { format: 'legacy', ...legacy } } diff --git a/packages/elements/src/index.ts b/packages/elements/src/index.ts index d1b1d9ca..a9b0999c 100644 --- a/packages/elements/src/index.ts +++ b/packages/elements/src/index.ts @@ -20,10 +20,32 @@ export type { export { getElements } from './get-elements.js' export type { VisibleElementsResult } from './get-elements.js' -export { serializeWebSnapshot, serializeMobileSnapshot } from './snapshot.js' -export type { WebSnapshotOptions, MobileSnapshotOptions } from './snapshot.js' export type { JSONElement } from './locators/index.js' -export { getSnapshot } from './get-snapshot.js' -export type { GetSnapshotOptions } from './get-snapshot.js' -export type { SnapshotResult, SnapshotElement } from './snapshot.js' +export { + serializeWebSnapshot, + serializeMobileSnapshot, + buildSnapshot, + accessibilityNodesToSnapshotNodes, + jsonElementToSnapshotNodes +} from './snapshot.js' +export type { + WebSnapshotOptions, + MobileSnapshotOptions, + SnapshotResult, + SnapshotElement +} from './snapshot.js' + +export { getSnapshot, snapshotRenderer } from './get-snapshot.js' +export type { + GetSnapshotOptions, + GetSnapshotResult, + SnapshotFormat +} from './get-snapshot.js' +export { SnapshotError } from './snapshot-error.js' +export type { + CandidateKind, + SnapshotCandidate, + SnapshotNode, + SnapshotRef +} from './snapshot-types.js' diff --git a/packages/elements/src/legacy-snapshot.ts b/packages/elements/src/legacy-snapshot.ts new file mode 100644 index 00000000..15c2efab --- /dev/null +++ b/packages/elements/src/legacy-snapshot.ts @@ -0,0 +1,130 @@ +/** Legacy renderer: used when @wdio/snapshot is absent or below 10.2. */ + +import type { SnapshotResult } from '@wdio/devtools-core/element-types' +import { + buildSnapshot, + accessibilityNodesToSnapshotNodes, + jsonElementToSnapshotNodes +} from '@wdio/devtools-core/element-snapshot' +import { getBrowserAccessibilityTree } from './accessibility-tree.js' +import { xmlToJSON } from './locators/index.js' +import { safeCall } from './safe-call.js' + +/** Text tree with eN refs and an elements map of their selectors. */ +export async function getSnapshot( + browser: WebdriverIO.Browser, + options?: { inViewportOnly?: boolean } +): Promise<SnapshotResult> { + const { inViewportOnly = true } = options ?? {} + + if (browser.isAndroid || browser.isIOS) { + return getMobileSnapshot(browser, inViewportOnly) + } + return getWebSnapshot(browser, inViewportOnly) +} + +// --------------------------------------------------------------------------- +// Web +// --------------------------------------------------------------------------- + +async function getWebSnapshot( + browser: WebdriverIO.Browser, + inViewportOnly: boolean +): Promise<SnapshotResult> { + const [url, title, nodes] = await Promise.all([ + safeCall(() => browser.getUrl()), + safeCall(() => browser.getTitle()), + getBrowserAccessibilityTree(browser, { inViewportOnly }) + ]) + + const header = buildWebHeader(title, url) + const snapshotNodes = accessibilityNodesToSnapshotNodes(nodes, { + inViewportOnly + }) + return buildSnapshot(header, snapshotNodes) +} + +function buildWebHeader(title?: string, url?: string): string { + let h = '[Page' + if (title) { + h += `: ${title}` + } + if (url) { + h += ` — ${url}` + } + h += ']' + return h +} + +// --------------------------------------------------------------------------- +// Mobile +// --------------------------------------------------------------------------- + +async function getMobileSnapshot( + browser: WebdriverIO.Browser, + inViewportOnly: boolean +): Promise<SnapshotResult> { + const platform: 'android' | 'ios' = browser.isAndroid ? 'android' : 'ios' + + const [viewportSize, pageSource] = await Promise.all([ + safeCall(() => browser.getWindowSize()), + safeCall(() => browser.getPageSource()) + ]) + + if (!pageSource) { + return { text: '[No elements found]', elements: {} } + } + + const root = xmlToJSON(pageSource) + if (!root) { + return { text: '[No elements found]', elements: {} } + } + + // A zero-dimension viewport (minimized app, broken ADB connection) would + // silently clip every element. Treat it as unavailable instead. + const safeViewport = + viewportSize?.width && viewportSize?.height ? viewportSize : undefined + + const deviceName = getDeviceName(browser) + + const header = buildMobileHeader(platform, deviceName, safeViewport) + + const snapshotNodes = jsonElementToSnapshotNodes(root, platform, { + inViewportOnly, + viewport: safeViewport, + sourceXML: pageSource + }) + + return buildSnapshot(header, snapshotNodes) +} + +function buildMobileHeader( + platform: string, + deviceName: string, + viewport?: { width: number; height: number } +): string { + let h = `[${platform}` + if (deviceName) { + h += ` — ${deviceName}` + } + if (viewport) { + h += ` (${viewport.width}×${viewport.height})` + } + h += ']' + return h +} + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +function getDeviceName(browser: WebdriverIO.Browser): string { + try { + const caps = browser.capabilities as Record<string, unknown> + return ( + (caps['appium:deviceName'] as string) ?? (caps.deviceName as string) ?? '' + ) + } catch { + return '' + } +} diff --git a/packages/elements/src/package-version.ts b/packages/elements/src/package-version.ts new file mode 100644 index 00000000..f61807d8 --- /dev/null +++ b/packages/elements/src/package-version.ts @@ -0,0 +1,41 @@ +import { existsSync, readFileSync } from 'node:fs' +import { dirname, join } from 'node:path' + +export function isModuleNotFound(err: unknown): boolean { + return ( + err instanceof Error && + 'code' in err && + (err.code === 'ERR_MODULE_NOT_FOUND' || err.code === 'MODULE_NOT_FOUND') + ) +} + +export function packageVersionOf( + resolvedFile: string, + name: string +): string | undefined { + try { + let dir = dirname(resolvedFile) + for (;;) { + const manifest = join(dir, 'package.json') + if (existsSync(manifest)) { + const pkg = JSON.parse(readFileSync(manifest, 'utf8')) as { + name?: string + version?: string + } + if (pkg.name === name) { + return pkg.version + } + } + const parent = dirname(dir) + if (parent === dir) { + return undefined + } + dir = parent + } + } catch (err) { + console.warn( + `@wdio/elements: could not read the version of ${name}: ${(err as Error).message}` + ) + return undefined + } +} diff --git a/packages/elements/src/safe-call.ts b/packages/elements/src/safe-call.ts new file mode 100644 index 00000000..0cf05ca9 --- /dev/null +++ b/packages/elements/src/safe-call.ts @@ -0,0 +1,9 @@ +export async function safeCall<T>( + fn: () => Promise<T> +): Promise<T | undefined> { + try { + return await fn() + } catch { + return undefined + } +} diff --git a/packages/elements/src/snapshot-error.ts b/packages/elements/src/snapshot-error.ts new file mode 100644 index 00000000..ed97c644 --- /dev/null +++ b/packages/elements/src/snapshot-error.ts @@ -0,0 +1,11 @@ +export class SnapshotError extends Error { + readonly code: string + readonly hint?: string + + constructor(code: string, message: string, opts?: { hint?: string }) { + super(message) + this.name = 'SnapshotError' + this.code = code + this.hint = opts?.hint + } +} diff --git a/packages/elements/src/snapshot-types.ts b/packages/elements/src/snapshot-types.ts new file mode 100644 index 00000000..7a67bb71 --- /dev/null +++ b/packages/elements/src/snapshot-types.ts @@ -0,0 +1,51 @@ +export type CandidateKind = + | 'testid' + | 'role' + | 'aria' + | 'id' + | 'text' + | 'name' + | 'aria-label' + | 'type' + | 'class' + | 'xpath-text' + | 'css-path' + | 'accessibility-id' + | 'resource-id' + | 'predicate' + | 'class-chain' + | 'uiautomator' + | 'xpath' + | 'tag' + | 'indexed' + +export interface SnapshotCandidate { + kind: CandidateKind + selector: string +} + +/** Web and native refs carry kind-tagged candidates, best first. */ +export interface SnapshotRef { + id: string + role: string + name?: string + candidates: SnapshotCandidate[] +} + +export interface SnapshotNode { + role: string + name?: string + ref?: string + value?: string + states?: string[] + url?: string + box?: number[] + note?: string + hint?: string + intent?: string + hidden?: boolean + interactive?: boolean + selector?: string + selectorPositional?: boolean + children?: SnapshotNode[] +} diff --git a/packages/elements/src/snapshot-version.ts b/packages/elements/src/snapshot-version.ts new file mode 100644 index 00000000..6b513b1b --- /dev/null +++ b/packages/elements/src/snapshot-version.ts @@ -0,0 +1,16 @@ +export const WDIO_SNAPSHOT_MIN = { major: 10, minor: 2 } as const + +const VERSION_RE = /^(\d+)\.(\d+)\./ + +export function rendersWithWdioSnapshot(version: string | undefined): boolean { + const match = VERSION_RE.exec(version ?? '') + if (!match) { + return false + } + const major = Number(match[1]) + const minor = Number(match[2]) + return ( + major > WDIO_SNAPSHOT_MIN.major || + (major === WDIO_SNAPSHOT_MIN.major && minor >= WDIO_SNAPSHOT_MIN.minor) + ) +} diff --git a/packages/elements/src/wdio-snapshot.ts b/packages/elements/src/wdio-snapshot.ts new file mode 100644 index 00000000..ed690030 --- /dev/null +++ b/packages/elements/src/wdio-snapshot.ts @@ -0,0 +1,228 @@ +import { fileURLToPath } from 'node:url' +import type * as WdioSnapshot from '@wdio/snapshot' +import type { NativePlatform, SnapshotNode, SnapshotRef } from '@wdio/snapshot' +import type { SnapshotElement } from '@wdio/devtools-core/element-types' +import { deepCapString } from '@wdio/devtools-shared/device' +import type { GetSnapshotResult } from './get-snapshot.js' +import { isModuleNotFound, packageVersionOf } from './package-version.js' +import { safeCall } from './safe-call.js' +import { SnapshotError } from './snapshot-error.js' +import { rendersWithWdioSnapshot } from './snapshot-version.js' + +type WdioSnapshotModule = typeof WdioSnapshot + +const frameHint = (ref: string) => `wdio session frame ${ref}` + +const NATIVE_PLATFORMS = new Set(['android', 'ios', 'mac', 'windows']) + +const CLASSIC_FAILURES_BEFORE_BIDI = 2 + +let loadFailureLogged = false + +let loadFailed = false + +let wdioSnapshotSupported: boolean | undefined + +export function resolvesWdioSnapshot(): boolean { + wdioSnapshotSupported ??= (() => { + try { + const entry = fileURLToPath(import.meta.resolve('@wdio/snapshot')) + const version = packageVersionOf(entry, '@wdio/snapshot') + if (rendersWithWdioSnapshot(version)) { + return true + } + if (version) { + console.warn( + `@wdio/elements: @wdio/snapshot ${version} is installed but the snapshot renderer needs 10.2 or later, using the legacy snapshot renderer` + ) + } + return false + } catch (err) { + if (!isModuleNotFound(err)) { + console.warn( + `@wdio/elements: could not resolve @wdio/snapshot, using the legacy snapshot renderer: ${(err as Error).message}` + ) + } + return false + } + })() + return wdioSnapshotSupported +} + +export function wdioSnapshotLoadFailed(): boolean { + return loadFailed +} + +async function loadWdioSnapshot(): Promise<WdioSnapshotModule | undefined> { + try { + return await import('@wdio/snapshot') + } catch (err) { + loadFailed = true + if (!loadFailureLogged) { + loadFailureLogged = true + console.warn( + `@wdio/elements: could not load @wdio/snapshot, using the legacy snapshot renderer: ${(err as Error).message}` + ) + } + return undefined + } +} + +// Matches @wdio/session's classify: a browserName makes a session web, even on mac/windows. +function nativePlatformName(caps: Record<string, unknown>): string | undefined { + const platformName = ( + deepCapString(caps, 'platformName') ?? + deepCapString(caps, 'appium:platformName') ?? + '' + ).toLowerCase() + return NATIVE_PLATFORMS.has(platformName) && + !deepCapString(caps, 'browserName') + ? platformName + : undefined +} + +// Keeps the @wdio/snapshot type out of exports: consumers without the optional peer would fail to build. +export async function renderWdioSnapshot( + browser: WebdriverIO.Browser, + viewport: boolean +): Promise<GetSnapshotResult | undefined> { + const snapshot = await loadWdioSnapshot() + if (!snapshot) { + return undefined + } + const caps = browser.capabilities as Record<string, unknown> + const platformName = nativePlatformName(caps) + try { + const collected = platformName + ? await collectNative( + snapshot, + browser, + snapshot.nativePlatform(caps, platformName), + viewport + ) + : await collectWebTree(snapshot, browser, viewport) + if (!collected) { + return { + format: 'snapshot', + text: '[No elements found]', + elements: {}, + refs: [] + } + } + const { tree, refs } = collected + + snapshot.attachSelectors(tree, refs) + return { + format: 'snapshot', + text: snapshot.formatSnapshot(tree, { selectors: true, frameHint }), + elements: elementsFromRefs(tree, refs), + refs + } + } catch (err) { + if (err instanceof snapshot.SnapshotError) { + throw new SnapshotError(err.code, err.message, { hint: err.hint }) + } + throw err + } +} + +// Keyed by ref id, for refs whose selector the rendered text prints. +function elementsFromRefs( + tree: SnapshotNode, + refs: SnapshotRef[] +): Record<string, SnapshotElement> { + const printed = new Map<string, string>() + collectPrintedSelectors(tree, printed) + return Object.fromEntries( + refs.flatMap((ref) => { + const selector = printed.get(ref.id) + return selector + ? [ + [ + ref.id, + { selector, tagName: '', role: ref.role, text: ref.name ?? '' } + ] as const + ] + : [] + }) + ) +} + +function collectPrintedSelectors( + node: SnapshotNode, + printed: Map<string, string> +): void { + if (node.ref && node.selector) { + printed.set(node.ref, node.selector) + } + node.children?.forEach((child) => collectPrintedSelectors(child, printed)) +} + +const classicFailures = new WeakMap<WebdriverIO.Browser, number>() + +async function collectWebTree( + snapshot: WdioSnapshotModule, + browser: WebdriverIO.Browser, + viewport: boolean +) { + const failures = classicFailures.get(browser) ?? 0 + const classic = browser.isBidi && failures < CLASSIC_FAILURES_BEFORE_BIDI + const result = await snapshot.collectWeb( + browser, + { counter: 0, all: false, boxes: false, viewport, assignRefs: 'ephemeral' }, + // 'bidi' is browser.execute; 'classic-first' applies only under BiDi, until executeScript fails CLASSIC_FAILURES_BEFORE_BIDI times in a row. + { transport: classic ? 'classic-first' : 'bidi' } + ) + if (classic) { + classicFailures.set(browser, result.classicUnavailable ? failures + 1 : 0) + } + return result +} + +async function readPageSource( + browser: WebdriverIO.Browser +): Promise<string | undefined> { + try { + return await browser.getPageSource() + } catch (err) { + console.warn( + `@wdio/elements: could not read the page source: ${(err as Error).message}` + ) + return undefined + } +} + +async function collectNative( + snapshot: WdioSnapshotModule, + browser: WebdriverIO.Browser, + platform: NativePlatform, + viewport: boolean +): Promise<{ tree: SnapshotNode; refs: SnapshotRef[] } | undefined> { + const [xml, size] = await Promise.all([ + readPageSource(browser), + viewport ? safeCall(() => browser.getWindowSize()) : undefined + ]) + if (!xml) { + return undefined + } + const parsed = snapshot.parseNativeSource(xml, platform, { + all: false, + counter: 0 + }) + // A zero-size window (minimized, broken ADB) would clip every element out of the tree. + if (!size?.width || !size?.height) { + return parsed + } + const tree = + snapshot.inViewport(parsed.tree, size.width, size.height) ?? parsed.tree + const shown = refIds(tree) + return { tree, refs: parsed.refs.filter((ref) => shown.has(ref.id)) } +} + +function refIds(node: SnapshotNode, ids = new Set<string>()): Set<string> { + if (node.ref) { + ids.add(node.ref) + } + node.children?.forEach((child) => refIds(child, ids)) + return ids +} diff --git a/packages/elements/src/webdriverio-version.ts b/packages/elements/src/webdriverio-version.ts new file mode 100644 index 00000000..ae558056 --- /dev/null +++ b/packages/elements/src/webdriverio-version.ts @@ -0,0 +1,26 @@ +import { createRequire } from 'node:module' +import { isModuleNotFound, packageVersionOf } from './package-version.js' +import { rendersWithWdioSnapshot } from './snapshot-version.js' + +export function installedWebdriverioVersion(): string | undefined { + try { + return packageVersionOf( + createRequire(import.meta.url).resolve('webdriverio'), + 'webdriverio' + ) + } catch (err) { + if (!isModuleNotFound(err)) { + console.warn( + `@wdio/elements: could not resolve webdriverio: ${(err as Error).message}` + ) + } + return undefined + } +} + +let usesSnapshot: boolean | undefined + +export function usesWdioSnapshot(): boolean { + usesSnapshot ??= rendersWithWdioSnapshot(installedWebdriverioVersion()) + return usesSnapshot +} diff --git a/packages/elements/tests/get-snapshot-load-failure.test.ts b/packages/elements/tests/get-snapshot-load-failure.test.ts new file mode 100644 index 00000000..de597d38 --- /dev/null +++ b/packages/elements/tests/get-snapshot-load-failure.test.ts @@ -0,0 +1,36 @@ +import { describe, expect, it, vi } from 'vitest' + +vi.mock('../src/webdriverio-version.js', () => ({ + usesWdioSnapshot: vi.fn(() => true) +})) + +vi.mock('../src/legacy-snapshot.js', () => ({ + getSnapshot: vi.fn(async () => ({ text: 'LEGACY', elements: {} })) +})) + +vi.mock('../src/wdio-snapshot.js', async (importActual) => ({ + ...(await importActual<Record<string, unknown>>()), + resolvesWdioSnapshot: vi.fn(() => true) +})) + +vi.mock('@wdio/snapshot', () => { + throw new Error('module graph broken') +}) + +import { getSnapshot, snapshotRenderer } from '../src/get-snapshot.js' + +describe('getSnapshot when @wdio/snapshot cannot load', () => { + it('falls back to the legacy renderer and logs the failure once', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + const browser = { capabilities: {} } as unknown as WebdriverIO.Browser + + const first = await getSnapshot(browser) + await getSnapshot(browser) + + expect(first).toEqual({ format: 'legacy', text: 'LEGACY', elements: {} }) + expect(snapshotRenderer()).toBe('legacy') + expect(warn).toHaveBeenCalledTimes(1) + expect(warn.mock.calls[0][0]).toContain('could not load @wdio/snapshot') + warn.mockRestore() + }) +}) diff --git a/packages/elements/tests/get-snapshot-renderer.test.ts b/packages/elements/tests/get-snapshot-renderer.test.ts new file mode 100644 index 00000000..14d681e1 --- /dev/null +++ b/packages/elements/tests/get-snapshot-renderer.test.ts @@ -0,0 +1,134 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest' + +const loaded = vi.hoisted(() => vi.fn()) + +vi.mock('../src/webdriverio-version.js', () => ({ + usesWdioSnapshot: vi.fn(() => false) +})) + +vi.mock('../src/legacy-snapshot.js', () => ({ + getSnapshot: vi.fn(async () => ({ text: 'LEGACY', elements: {} })) +})) + +vi.mock('../src/wdio-snapshot.js', async (importActual) => ({ + ...(await importActual<Record<string, unknown>>()), + resolvesWdioSnapshot: vi.fn(() => true) +})) + +vi.mock('@wdio/snapshot', async (importActual) => { + loaded() + const actual = await importActual<typeof WdioSnapshot>() + return { ...actual, collectWeb: vi.fn() } +}) + +import * as snap from '@wdio/snapshot' +import type * as WdioSnapshot from '@wdio/snapshot' +import { getSnapshot as getLegacySnapshot } from '../src/legacy-snapshot.js' +import { usesWdioSnapshot } from '../src/webdriverio-version.js' +import { resolvesWdioSnapshot } from '../src/wdio-snapshot.js' +import { getSnapshot, snapshotRenderer } from '../src/get-snapshot.js' + +const browser = { + capabilities: { browserName: 'chrome' }, + isBidi: false +} as unknown as WebdriverIO.Browser + +beforeEach(() => { + vi.clearAllMocks() + vi.mocked(usesWdioSnapshot).mockReturnValue(false) + vi.mocked(resolvesWdioSnapshot).mockReturnValue(true) +}) + +describe('getSnapshot renderer routing', () => { + it('renders legacy without loading @wdio/snapshot when the gate is closed', async () => { + const result = await getSnapshot(browser) + + expect(result).toEqual({ format: 'legacy', text: 'LEGACY', elements: {} }) + expect(loaded).not.toHaveBeenCalled() + expect(snap.collectWeb).not.toHaveBeenCalled() + }) + + it('picks the snapshot renderer only when the version gate and the resolver both pass', () => { + expect(snapshotRenderer()).toBe('legacy') + + vi.mocked(usesWdioSnapshot).mockReturnValue(true) + expect(snapshotRenderer()).toBe('snapshot') + }) + + it('renders legacy silently when @wdio/snapshot is not installed', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + vi.mocked(usesWdioSnapshot).mockReturnValue(true) + vi.mocked(resolvesWdioSnapshot).mockReturnValue(false) + + const result = await getSnapshot(browser) + + expect(result).toEqual({ format: 'legacy', text: 'LEGACY', elements: {} }) + expect(snapshotRenderer()).toBe('legacy') + expect(loaded).not.toHaveBeenCalled() + expect(warn).not.toHaveBeenCalled() + warn.mockRestore() + }) + + it.each([ + [{}, true], + [{ inViewportOnly: false }, false], + [{ viewport: false }, false], + [{ viewport: true, inViewportOnly: false }, true] + ])( + 'maps options %j to the legacy viewport flag %s', + async (options, expected) => { + await getSnapshot(browser, options) + + expect(getLegacySnapshot).toHaveBeenCalledWith(browser, { + inViewportOnly: expected + }) + } + ) +}) + +describe('getSnapshot on the @wdio/snapshot renderer', () => { + beforeEach(() => { + vi.mocked(usesWdioSnapshot).mockReturnValue(true) + vi.mocked(snap.collectWeb).mockResolvedValue({ + tree: { + role: 'document', + children: [{ role: 'button', name: 'Go', ref: 'e1' }] + }, + refs: [ + { + id: 'e1', + role: 'button', + name: 'Go', + candidates: [{ kind: 'role', selector: 'button' }] + } + ], + counter: 1 + } as never) + }) + + it('returns the snapshot format with elements keyed by ref id', async () => { + const result = await getSnapshot(browser) + + expect(result.format).toBe('snapshot') + expect(result.refs?.map((ref) => ref.id)).toEqual(['e1']) + expect(result.elements).toEqual({ + e1: { selector: 'button', tagName: '', role: 'button', text: 'Go' } + }) + expect(getLegacySnapshot).not.toHaveBeenCalled() + }) + + it.each([ + [{}, true], + [{ inViewportOnly: false }, false], + [{ viewport: false }, false], + [{ viewport: true, inViewportOnly: false }, true] + ])('maps options %j to the viewport flag %s', async (options, expected) => { + await getSnapshot(browser, options) + + expect(snap.collectWeb).toHaveBeenCalledWith( + browser, + expect.objectContaining({ viewport: expected }), + expect.anything() + ) + }) +}) diff --git a/packages/elements/tests/get-snapshot.test.ts b/packages/elements/tests/get-snapshot.test.ts new file mode 100644 index 00000000..8ec91f51 --- /dev/null +++ b/packages/elements/tests/get-snapshot.test.ts @@ -0,0 +1,381 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest' + +vi.mock('@wdio/snapshot', async (importActual) => { + const actual = await importActual<typeof snap>() + return { + ...actual, + collectWeb: vi.fn(), + attachSelectors: vi.fn(), + formatSnapshot: vi.fn(() => 'TEXT'), + inViewport: vi.fn(), + parseNativeSource: vi.fn(actual.parseNativeSource) + } +}) + +vi.mock('../src/webdriverio-version.js', () => ({ + usesWdioSnapshot: vi.fn(() => true) +})) + +import * as snap from '@wdio/snapshot' +import { getSnapshot } from '../src/get-snapshot.js' + +const TREE = { role: 'document', children: [] } as unknown as snap.SnapshotNode +const REFS = [{ id: 'e1', candidates: [] }] as unknown as snap.SnapshotRef[] + +function browser(overrides: Record<string, unknown>) { + return { + capabilities: { browserName: 'chrome' }, + ...overrides + } as unknown as WebdriverIO.Browser +} + +beforeEach(() => { + vi.clearAllMocks() + vi.mocked(snap.collectWeb).mockResolvedValue({ + tree: TREE, + refs: REFS, + counter: 1 + } as never) +}) + +describe('getSnapshot (web)', () => { + it('collects the viewport by default and renders with selectors', async () => { + const b = browser({ isBidi: true }) + const result = await getSnapshot(b) + + expect(snap.collectWeb).toHaveBeenCalledWith( + b, + { + counter: 0, + all: false, + boxes: false, + viewport: true, + assignRefs: 'ephemeral' + }, + { transport: 'classic-first' } + ) + expect(snap.attachSelectors).toHaveBeenCalledWith(TREE, REFS) + expect(snap.formatSnapshot).toHaveBeenCalledWith(TREE, { + selectors: true, + frameHint: expect.any(Function) + }) + expect( + vi.mocked(snap.formatSnapshot).mock.calls[0][1]?.frameHint?.('e3') + ).toBe('wdio session frame e3') + expect(result).toEqual( + expect.objectContaining({ format: 'snapshot', text: 'TEXT', refs: REFS }) + ) + }) + + it('passes viewport through, and uses the bidi transport on a classic session', async () => { + const b = browser({ isBidi: false }) + await getSnapshot(b, { viewport: true }) + + expect(snap.collectWeb).toHaveBeenCalledWith( + b, + expect.objectContaining({ viewport: true, assignRefs: 'ephemeral' }), + { transport: 'bidi' } + ) + }) + + it('stops trying classic execute on a BiDi browser after two failures in a row', async () => { + const actual = await vi.importActual<typeof snap>('@wdio/snapshot') + vi.mocked(snap.collectWeb).mockImplementation(actual.collectWeb) + const executeScript = vi.fn().mockRejectedValue(new Error('unsupported')) + const execute = vi + .fn() + .mockResolvedValue({ tree: TREE, refs: REFS, counter: 1 }) + const b = browser({ isBidi: true, executeScript, execute }) + + await getSnapshot(b) + await getSnapshot(b) + await getSnapshot(b) + + expect(executeScript).toHaveBeenCalledTimes(2) + expect(execute).toHaveBeenCalledTimes(3) + expect( + vi.mocked(snap.collectWeb).mock.calls.map((call) => call[2]) + ).toEqual([ + { transport: 'classic-first' }, + { transport: 'classic-first' }, + { transport: 'bidi' } + ]) + }) + + it('resets the classic failure count when classic execute succeeds', async () => { + const actual = await vi.importActual<typeof snap>('@wdio/snapshot') + vi.mocked(snap.collectWeb).mockImplementation(actual.collectWeb) + const failure = new Error('unsupported') + const executeScript = vi + .fn() + .mockRejectedValueOnce(failure) + .mockResolvedValueOnce({ tree: TREE, refs: REFS, counter: 1 }) + .mockRejectedValueOnce(failure) + .mockRejectedValueOnce(failure) + const b = browser({ + isBidi: true, + executeScript, + execute: vi.fn().mockResolvedValue({ tree: TREE, refs: REFS, counter: 1 }) + }) + + for (let call = 0; call < 5; call++) { + await getSnapshot(b) + } + + expect( + vi.mocked(snap.collectWeb).mock.calls.map((call) => call[2]) + ).toEqual([ + { transport: 'classic-first' }, + { transport: 'classic-first' }, + { transport: 'classic-first' }, + { transport: 'classic-first' }, + { transport: 'bidi' } + ]) + }) + + it('omits a ref whose selector is not printed from elements but keeps it in refs', async () => { + const tree = { + role: 'document', + children: [{ role: 'button', ref: 'e1', selector: '#go' }] + } as unknown as snap.SnapshotNode + const refs = [ + { id: 'e1', role: 'button', name: 'go', candidates: [] }, + { id: 'e2', role: 'button', name: 'stale', candidates: [] } + ] as unknown as snap.SnapshotRef[] + vi.mocked(snap.collectWeb).mockResolvedValueOnce({ + tree, + refs, + counter: 2 + } as never) + + const result = await getSnapshot(browser({ isBidi: false })) + + expect(result.elements).toEqual({ + e1: { selector: '#go', tagName: '', role: 'button', text: 'go' } + }) + expect(result.refs).toEqual(refs) + }) +}) + +const ANDROID_XML = `<?xml version="1.0" encoding="UTF-8"?> +<hierarchy rotation="0"> + <android.widget.FrameLayout bounds="[0,0][1080,2400]"> + <android.widget.Button text="Start" content-desc="start" clickable="true" resource-id="com.x:id/start" bounds="[100,200][400,300]" /> + </android.widget.FrameLayout> +</hierarchy>` + +function nativeBrowser() { + return browser({ + capabilities: { platformName: 'Android' }, + getPageSource: vi.fn().mockResolvedValue(ANDROID_XML), + getWindowSize: vi.fn().mockResolvedValue({ width: 1080, height: 2400 }) + }) +} + +it('renders the full native tree when the window size cannot be read', async () => { + const b = browser({ + capabilities: { platformName: 'Android' }, + getPageSource: vi.fn().mockResolvedValue(ANDROID_XML), + getWindowSize: vi.fn().mockRejectedValue(new Error('no window')) + }) + + const result = await getSnapshot(b) + + expect(result.format).toBe('snapshot') + expect(snap.inViewport).not.toHaveBeenCalled() + expect(snap.formatSnapshot).toHaveBeenCalledWith( + expect.objectContaining({ role: expect.any(String) }), + expect.anything() + ) +}) + +it('returns an empty snapshot and warns when the page source cannot be read', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + try { + const result = await getSnapshot( + browser({ + capabilities: { platformName: 'Android' }, + getPageSource: vi.fn().mockRejectedValue(new Error('no session')) + }) + ) + + expect(result).toEqual({ + format: 'snapshot', + text: '[No elements found]', + elements: {}, + refs: [] + }) + expect(warn).toHaveBeenCalledWith( + '@wdio/elements: could not read the page source: no session' + ) + } finally { + warn.mockRestore() + } +}) + +it('parses a vendor-bag-only native session with the resolved platform', async () => { + await getSnapshot( + browser({ + capabilities: { 'bstack:options': { platformName: 'iOS' } }, + getPageSource: vi.fn().mockResolvedValue(ANDROID_XML) + }) + ) + expect(vi.mocked(snap.collectWeb)).not.toHaveBeenCalled() + expect(vi.mocked(snap.parseNativeSource).mock.calls[0][1]).toBe('ios') +}) + +describe('getSnapshot web/native routing (same as wdio session)', () => { + it.each([ + ['Android app', { platformName: 'Android' }, 'native'], + ['iOS app via appium: prefix', { 'appium:platformName': 'iOS' }, 'native'], + ['macOS app', { platformName: 'mac' }, 'native'], + ['Windows app', { platformName: 'Windows' }, 'native'], + [ + 'Android app with platformName only in a vendor bag', + { + 'bstack:options': { platformName: 'Android' }, + 'appium:automationName': 'UiAutomator2' + }, + 'native' + ], + [ + 'Safari on iOS with both only in a vendor bag', + { 'bstack:options': { platformName: 'iOS', browserName: 'Safari' } }, + 'web' + ], + [ + 'Chrome on Android', + { platformName: 'Android', browserName: 'chrome' }, + 'web' + ], + ['Safari on iOS', { platformName: 'iOS', browserName: 'Safari' }, 'web'], + [ + 'desktop Chrome on mac', + { platformName: 'mac', browserName: 'chrome' }, + 'web' + ], + [ + 'desktop Chrome on linux', + { platformName: 'linux', browserName: 'chrome' }, + 'web' + ] + ])('%s is %s', async (_label, capabilities, expected) => { + await getSnapshot( + browser({ + capabilities, + getPageSource: vi.fn().mockResolvedValue(ANDROID_XML) + }) + ) + expect(vi.mocked(snap.collectWeb).mock.calls.length > 0).toBe( + expected === 'web' + ) + }) +}) + +describe('getSnapshot (native)', () => { + it('cuts the page source to the viewport by default', async () => { + const b = nativeBrowser() + vi.mocked(snap.inViewport).mockReturnValue(undefined) + await getSnapshot(b) + + expect(snap.parseNativeSource).toHaveBeenCalledWith( + ANDROID_XML, + 'android', + { + all: false, + counter: 0 + } + ) + expect(b.getWindowSize).toHaveBeenCalled() + expect(snap.inViewport).toHaveBeenCalledWith(expect.anything(), 1080, 2400) + expect(snap.collectWeb).not.toHaveBeenCalled() + }) + + it('renders the full page source when viewport is false', async () => { + const b = nativeBrowser() + await getSnapshot(b, { viewport: false }) + + expect(b.getWindowSize).not.toHaveBeenCalled() + expect(snap.inViewport).not.toHaveBeenCalled() + expect(snap.collectWeb).not.toHaveBeenCalled() + }) + + it('cuts to the window size when viewport is set, keeping the tree if nothing remains', async () => { + const b = nativeBrowser() + vi.mocked(snap.inViewport).mockReturnValue(undefined) + await getSnapshot(b, { viewport: true }) + + expect(snap.inViewport).toHaveBeenCalledWith(expect.anything(), 1080, 2400) + const rendered = vi.mocked(snap.formatSnapshot).mock.calls[0][0] + expect(rendered).toBe(vi.mocked(snap.attachSelectors).mock.calls[0][0]) + }) + + it('renders refs with selectors from a real parse', async () => { + const actual = await vi.importActual<typeof snap>('@wdio/snapshot') + vi.mocked(snap.attachSelectors).mockImplementation(actual.attachSelectors) + vi.mocked(snap.formatSnapshot).mockImplementation(actual.formatSnapshot) + + const { text, refs = [] } = await getSnapshot(nativeBrowser()) + + expect(refs.length).toBeGreaterThan(0) + expect(text).toMatch(/\be1\b/) + expect(text).toContain('→') + expect(text).toContain('start') + }) + + it('parses an appium:-prefixed iOS session as iOS, not the android fallback', async () => { + await getSnapshot( + browser({ + capabilities: { 'appium:platformName': 'iOS' }, + getPageSource: vi + .fn() + .mockResolvedValue('<XCUIElementTypeApplication />') + }) + ) + expect(vi.mocked(snap.parseNativeSource).mock.calls[0][1]).toBe('ios') + }) + + it('returns only the refs left in the tree after a viewport cut', async () => { + const parsedRefs = [ + { id: 'e1', role: 'button', candidates: [] }, + { id: 'e2', role: 'button', candidates: [] } + ] + vi.mocked(snap.parseNativeSource).mockReturnValueOnce({ + tree: TREE, + refs: parsedRefs, + located: [], + counter: 2 + }) + vi.mocked(snap.inViewport).mockReturnValue({ + role: 'application', + children: [{ role: 'button', ref: 'e2' }] + }) + + const { refs = [] } = await getSnapshot(nativeBrowser(), { viewport: true }) + + expect(refs.map((ref) => ref.id)).toEqual(['e2']) + }) + + it('keeps the whole parsed tree when the window reports a zero size', async () => { + const parsedRefs = [ + { id: 'e1', role: 'button', candidates: [] }, + { id: 'e2', role: 'button', candidates: [] } + ] + vi.mocked(snap.parseNativeSource).mockReturnValueOnce({ + tree: TREE, + refs: parsedRefs, + located: [], + counter: 2 + }) + const b = browser({ + capabilities: { platformName: 'Android' }, + getPageSource: vi.fn().mockResolvedValue(ANDROID_XML), + getWindowSize: vi.fn().mockResolvedValue({ width: 0, height: 0 }) + }) + + const { refs = [] } = await getSnapshot(b, { viewport: true }) + + expect(snap.inViewport).not.toHaveBeenCalled() + expect(refs.map((ref) => ref.id)).toEqual(['e1', 'e2']) + }) +}) diff --git a/packages/elements/tests/locators/locator-generation.test.ts b/packages/elements/tests/locators/locator-generation.test.ts index c5d2de4b..d8d58bf7 100644 --- a/packages/elements/tests/locators/locator-generation.test.ts +++ b/packages/elements/tests/locators/locator-generation.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from 'vitest' -import { locatorsToObject } from '@wdio/elements/locators' +import { locatorsToObject } from '../../src/locators/index.js' describe('locatorsToObject', () => { it('converts locator array to object', () => { diff --git a/packages/elements/tests/package-version.test.ts b/packages/elements/tests/package-version.test.ts new file mode 100644 index 00000000..2b93b6dd --- /dev/null +++ b/packages/elements/tests/package-version.test.ts @@ -0,0 +1,47 @@ +import { mkdtempSync, mkdirSync, writeFileSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { dirname, join } from 'node:path' +import { fileURLToPath } from 'node:url' +import { describe, expect, it, vi } from 'vitest' +import { packageVersionOf } from '../src/package-version.js' + +function fixturePackage(name: string, version: string): string { + const root = mkdtempSync(join(tmpdir(), 'elements-pkg-')) + mkdirSync(join(root, 'build')) + writeFileSync(join(root, 'package.json'), JSON.stringify({ name, version })) + const entry = join(root, 'build', 'index.js') + writeFileSync(entry, '') + return entry +} + +describe('packageVersionOf', () => { + it('reads the version of the named package above the resolved file', () => { + const entry = fixturePackage('@wdio/snapshot', '10.1.0') + + expect(packageVersionOf(entry, '@wdio/snapshot')).toBe('10.1.0') + }) + + it('returns undefined when the nearest package has another name', () => { + const entry = fixturePackage('@wdio/other', '10.2.0') + + expect(packageVersionOf(entry, '@wdio/snapshot')).toBeUndefined() + }) + + it('warns and returns undefined when the manifest cannot be parsed', () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + const entry = fixturePackage('@wdio/snapshot', '10.1.0') + writeFileSync(join(dirname(dirname(entry)), 'package.json'), '{') + + expect(packageVersionOf(entry, '@wdio/snapshot')).toBeUndefined() + expect(warn).toHaveBeenCalledWith( + expect.stringContaining('could not read the version of @wdio/snapshot') + ) + warn.mockRestore() + }) + + it('reads the installed @wdio/snapshot through its resolved entry', () => { + const entry = fileURLToPath(import.meta.resolve('@wdio/snapshot')) + + expect(packageVersionOf(entry, '@wdio/snapshot')).toMatch(/^\d+\.\d+\./) + }) +}) diff --git a/packages/elements/tests/result-compat.test.ts b/packages/elements/tests/result-compat.test.ts new file mode 100644 index 00000000..06b691b7 --- /dev/null +++ b/packages/elements/tests/result-compat.test.ts @@ -0,0 +1,28 @@ +import { describe, expect, it } from 'vitest' +import { + getSnapshot, + type GetSnapshotResult, + type SnapshotResult +} from '../src/index.js' + +// Compiled by `pnpm typecheck`: code written against the pre-format types must still build. +async function usesPreFormatTypes(browser: WebdriverIO.Browser) { + const result: SnapshotResult = await getSnapshot(browser) + const selector: string | undefined = result.elements['e1']?.selector + const legacy = await getSnapshot(browser, { inViewportOnly: false }) + const assignable: SnapshotResult = legacy + return [selector, assignable.text] +} + +describe('GetSnapshotResult compatibility', () => { + it('keeps the pre-format SnapshotResult assignable from getSnapshot', () => { + const fromNew: GetSnapshotResult = { + format: 'snapshot', + text: '', + elements: {} + } + const fromOld: SnapshotResult = fromNew + expect(fromOld.elements).toEqual({}) + expect(usesPreFormatTypes).toBeTypeOf('function') + }) +}) diff --git a/packages/elements/tests/snapshot-renderer-gate.test.ts b/packages/elements/tests/snapshot-renderer-gate.test.ts new file mode 100644 index 00000000..9d64bb74 --- /dev/null +++ b/packages/elements/tests/snapshot-renderer-gate.test.ts @@ -0,0 +1,40 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest' + +const installed = vi.hoisted(() => ({ + version: undefined as string | undefined +})) + +vi.mock('../src/package-version.js', async (importActual) => ({ + ...(await importActual<Record<string, unknown>>()), + packageVersionOf: vi.fn(() => installed.version) +})) + +async function resolvesWdioSnapshot(): Promise<boolean> { + vi.resetModules() + const { resolvesWdioSnapshot } = await import('../src/wdio-snapshot.js') + return resolvesWdioSnapshot() +} + +describe('resolvesWdioSnapshot', () => { + beforeEach(() => { + installed.version = undefined + }) + + it('keeps the legacy renderer when @wdio/snapshot 10.1 is resolved', async () => { + installed.version = '10.1.0' + + expect(await resolvesWdioSnapshot()).toBe(false) + }) + + it('uses the snapshot renderer when @wdio/snapshot 10.2 prerelease is resolved', async () => { + installed.version = '10.2.0-alpha.100.sha-b38abd894' + + expect(await resolvesWdioSnapshot()).toBe(true) + }) + + it('keeps the legacy renderer when the resolved version is unreadable', async () => { + installed.version = undefined + + expect(await resolvesWdioSnapshot()).toBe(false) + }) +}) diff --git a/packages/elements/tests/wdio-snapshot-warnings.test.ts b/packages/elements/tests/wdio-snapshot-warnings.test.ts new file mode 100644 index 00000000..baba351b --- /dev/null +++ b/packages/elements/tests/wdio-snapshot-warnings.test.ts @@ -0,0 +1,104 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import type * as NodeModule from 'node:module' +import type * as NodeUrl from 'node:url' +import type * as PackageVersion from '../src/package-version.js' + +vi.mock('node:url', async (importActual) => { + const actual = await importActual<typeof NodeUrl>() + return { ...actual, fileURLToPath: vi.fn(actual.fileURLToPath) } +}) + +vi.mock('node:module', async (importActual) => { + const actual = await importActual<typeof NodeModule>() + return { ...actual, createRequire: vi.fn(actual.createRequire) } +}) + +vi.mock('../src/package-version.js', async (importActual) => { + const actual = await importActual<typeof PackageVersion>() + return { ...actual, packageVersionOf: vi.fn(actual.packageVersionOf) } +}) + +function withCode(message: string, code: string): Error { + return Object.assign(new Error(message), { code }) +} + +beforeEach(() => { + vi.resetModules() + vi.spyOn(console, 'warn').mockImplementation(() => {}) +}) + +afterEach(() => { + vi.restoreAllMocks() +}) + +describe('resolvesWdioSnapshot warnings', () => { + it('warns when resolution fails for a reason other than absence', async () => { + const { fileURLToPath } = await import('node:url') + const { resolvesWdioSnapshot } = await import('../src/wdio-snapshot.js') + vi.mocked(fileURLToPath).mockImplementationOnce(() => { + throw new Error('bad url') + }) + + expect(resolvesWdioSnapshot()).toBe(false) + expect(console.warn).toHaveBeenCalledTimes(1) + expect(vi.mocked(console.warn).mock.calls[0][0]).toContain( + 'could not resolve @wdio/snapshot' + ) + }) + + it('stays silent when @wdio/snapshot is not installed', async () => { + const { fileURLToPath } = await import('node:url') + const { resolvesWdioSnapshot } = await import('../src/wdio-snapshot.js') + vi.mocked(fileURLToPath).mockImplementationOnce(() => { + throw withCode('Cannot find package', 'ERR_MODULE_NOT_FOUND') + }) + + expect(resolvesWdioSnapshot()).toBe(false) + expect(console.warn).not.toHaveBeenCalled() + }) + + it('warns when the resolved @wdio/snapshot is below 10.2, once', async () => { + const { packageVersionOf } = await import('../src/package-version.js') + const { resolvesWdioSnapshot } = await import('../src/wdio-snapshot.js') + vi.mocked(packageVersionOf).mockReturnValueOnce('10.1.0') + + expect(resolvesWdioSnapshot()).toBe(false) + expect(resolvesWdioSnapshot()).toBe(false) + expect(console.warn).toHaveBeenCalledTimes(1) + expect(vi.mocked(console.warn).mock.calls[0][0]).toContain( + '@wdio/snapshot 10.1.0 is installed but the snapshot renderer needs 10.2 or later' + ) + }) +}) + +describe('installedWebdriverioVersion warnings', () => { + async function unresolvable(code?: string) { + const { createRequire } = await import('node:module') + vi.mocked(createRequire).mockReturnValueOnce({ + resolve: () => { + throw code ? withCode('no webdriverio', code) : new Error('bad resolve') + } + } as unknown as ReturnType<typeof createRequire>) + } + + it('warns when webdriverio cannot be resolved for a reason other than absence', async () => { + const { installedWebdriverioVersion } = + await import('../src/webdriverio-version.js') + await unresolvable() + + expect(installedWebdriverioVersion()).toBeUndefined() + expect(console.warn).toHaveBeenCalledTimes(1) + expect(vi.mocked(console.warn).mock.calls[0][0]).toContain( + 'could not resolve webdriverio' + ) + }) + + it('stays silent when webdriverio is not installed', async () => { + const { installedWebdriverioVersion } = + await import('../src/webdriverio-version.js') + await unresolvable('MODULE_NOT_FOUND') + + expect(installedWebdriverioVersion()).toBeUndefined() + expect(console.warn).not.toHaveBeenCalled() + }) +}) diff --git a/packages/elements/tests/webdriverio-version.test.ts b/packages/elements/tests/webdriverio-version.test.ts new file mode 100644 index 00000000..5d961d89 --- /dev/null +++ b/packages/elements/tests/webdriverio-version.test.ts @@ -0,0 +1,34 @@ +import { describe, expect, it } from 'vitest' +import { installedWebdriverioVersion } from '../src/webdriverio-version.js' +import { rendersWithWdioSnapshot } from '../src/snapshot-version.js' + +describe('rendersWithWdioSnapshot', () => { + it.each(['9.32.0', '10.1.0', '10.1.9'])( + 'keeps the legacy renderer on %s', + (version) => { + expect(rendersWithWdioSnapshot(version)).toBe(false) + } + ) + + it.each([ + '10.2.0-alpha.1', + '10.2.0-alpha.100.sha-b38abd894', + '10.2.0', + '11.0.0' + ])('renders with @wdio/snapshot on %s', (version) => { + expect(rendersWithWdioSnapshot(version)).toBe(true) + }) + + it.each(['garbage', '', undefined])( + 'falls back to legacy for an unreadable version %j', + (version) => { + expect(rendersWithWdioSnapshot(version)).toBe(false) + } + ) +}) + +describe('installedWebdriverioVersion', () => { + it('reads the webdriverio version the package resolves', () => { + expect(installedWebdriverioVersion()).toMatch(/^\d+\.\d+\.\d+/) + }) +}) diff --git a/packages/elements/tsconfig.json b/packages/elements/tsconfig.json index 3bcc9638..89949f1c 100644 --- a/packages/elements/tsconfig.json +++ b/packages/elements/tsconfig.json @@ -10,7 +10,7 @@ "allowImportingTsExtensions": false, "declaration": true, "skipLibCheck": true, - "types": ["node", "@wdio/globals/types"] + "types": ["node", "webdriverio"] }, "include": ["src/**/*"] } diff --git a/packages/nightwatch-devtools/bin/show-trace.mjs b/packages/nightwatch-devtools/bin/show-trace.mjs new file mode 100755 index 00000000..83cac9cb --- /dev/null +++ b/packages/nightwatch-devtools/bin/show-trace.mjs @@ -0,0 +1,4 @@ +#!/usr/bin/env node +import { runShowTraceCli } from '@wdio/devtools-backend/show-trace' + +void runShowTraceCli(process.argv.slice(2)) diff --git a/packages/nightwatch-devtools/package.json b/packages/nightwatch-devtools/package.json index 60c6c9d7..a73d47d9 100644 --- a/packages/nightwatch-devtools/package.json +++ b/packages/nightwatch-devtools/package.json @@ -53,12 +53,12 @@ "dependencies": { "@wdio/devtools-backend": "workspace:*", "@wdio/devtools-script": "workspace:*", - "@wdio/logger": "^10.0.0", + "@wdio/logger": "^10.1.0", "@xmldom/xmldom": "^0.9.12", "fluent-ffmpeg": "^2.1.3", "import-meta-resolve": "^4.2.0", "stacktrace-parser": "^0.1.11", - "webdriverio": "^10.0.2", + "webdriverio": "^10.1.0", "ws": "^8.22.0", "xpath": "^0.0.34", "yazl": "^3.3.1" diff --git a/packages/selenium-devtools/bin/show-trace.mjs b/packages/selenium-devtools/bin/show-trace.mjs new file mode 100755 index 00000000..83cac9cb --- /dev/null +++ b/packages/selenium-devtools/bin/show-trace.mjs @@ -0,0 +1,4 @@ +#!/usr/bin/env node +import { runShowTraceCli } from '@wdio/devtools-backend/show-trace' + +void runShowTraceCli(process.argv.slice(2)) diff --git a/packages/selenium-devtools/package.json b/packages/selenium-devtools/package.json index d816d736..601c6a0e 100644 --- a/packages/selenium-devtools/package.json +++ b/packages/selenium-devtools/package.json @@ -53,10 +53,10 @@ "dependencies": { "@wdio/devtools-backend": "workspace:*", "@wdio/devtools-script": "workspace:*", - "@wdio/logger": "^10.0.0", + "@wdio/logger": "^10.1.0", "@xmldom/xmldom": "^0.9.12", "stacktrace-parser": "^0.1.11", - "webdriverio": "^10.0.2", + "webdriverio": "^10.1.0", "ws": "^8.22.0", "xpath": "^0.0.34", "yazl": "^3.3.1" diff --git a/packages/service/bin/show-trace.mjs b/packages/service/bin/show-trace.mjs new file mode 100755 index 00000000..83cac9cb --- /dev/null +++ b/packages/service/bin/show-trace.mjs @@ -0,0 +1,4 @@ +#!/usr/bin/env node +import { runShowTraceCli } from '@wdio/devtools-backend/show-trace' + +void runShowTraceCli(process.argv.slice(2)) diff --git a/packages/service/package.json b/packages/service/package.json index cc0aa1cf..9c3d53a1 100644 --- a/packages/service/package.json +++ b/packages/service/package.json @@ -64,18 +64,18 @@ "@types/fluent-ffmpeg": "^2.1.28", "@types/stack-trace": "^0.0.33", "@types/ws": "^8.18.2", - "@wdio/allure-reporter": "^10.0.1", + "@wdio/allure-reporter": "^10.1.0", "@wdio/devtools-core": "workspace:^", "@wdio/devtools-shared": "workspace:^", - "@wdio/globals": "10.0.2", - "@wdio/logger": "10.0.0", + "@wdio/globals": "10.1.0", + "@wdio/logger": "10.1.0", "@wdio/protocols": "10.0.2", - "@wdio/reporter": "10.0.1", - "@wdio/types": "10.0.1", + "@wdio/reporter": "10.1.0", + "@wdio/types": "10.1.0", "typescript": "6.0.3", "vite": "^8.3.2", "vite-plugin-dts": "^5.1.1", - "webdriverio": "^10.0.2" + "webdriverio": "^10.1.0" }, "peerDependencies": { "@wdio/allure-reporter": "^9.0.0 || ^10.0.0", diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index f21d970b..e9351196 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -57,6 +57,12 @@ import { import { ScreencastLifecycle } from './screencast-lifecycle.js' import { attachBidiListeners } from './bidi-listeners.js' import { type ServiceOptions, TraceType } from './types.js' +import type { + GetSnapshotOptions, + GetSnapshotResult, + SnapshotFormat +} from '@wdio/elements' +import type * as Elements from '@wdio/elements' import { CONTEXT_CHANGE_COMMANDS, INTERNAL_COMMANDS, @@ -300,17 +306,25 @@ export default class DevToolsHookService implements Services.ServiceInstance { * @wdio/elements' getSnapshot() directly — no trace-mode overhead, * no screenshot round-trip, no page-settling. * - * Returns { text, elements } — see @wdio/elements SnapshotResult. + * Returns { format, text, elements, refs? } — see @wdio/elements GetSnapshotResult. */ browser.addCommand( 'getSnapshot', - async (options?: { inViewportOnly?: boolean }) => { + async (options?: GetSnapshotOptions): Promise<GetSnapshotResult> => { + let elements: typeof Elements | undefined try { - const { getSnapshot } = await import('@wdio/elements') - return await getSnapshot(browser, options ?? { inViewportOnly: true }) + elements = await import('@wdio/elements') + // Viewport-only keeps the tree small enough for an agent loop to call repeatedly. + return await elements.getSnapshot(browser, { + viewport: options?.viewport ?? options?.inViewportOnly ?? true + }) } catch (err) { log.warn(`getSnapshot failed: ${errorMessage(err)}`) - return { text: '[Snapshot unavailable]', elements: {} } + const format: SnapshotFormat = + elements?.snapshotRenderer() ?? 'legacy' + return format === 'snapshot' + ? { format, text: '[Snapshot unavailable]', elements: {}, refs: [] } + : { format, text: '[Snapshot unavailable]', elements: {} } } } ) diff --git a/packages/service/src/types.ts b/packages/service/src/types.ts index 1263df01..bc358e1a 100644 --- a/packages/service/src/types.ts +++ b/packages/service/src/types.ts @@ -4,7 +4,7 @@ // @wdio/devtools-service/types. New code should import directly from // @wdio/devtools-shared. -import type { SnapshotResult } from '@wdio/devtools-core/element-types' +import type { GetSnapshotOptions, GetSnapshotResult } from '@wdio/elements' export { TraceType, @@ -77,7 +77,7 @@ declare namespace WebdriverIO { getPuppeteer?: () => Promise<unknown> // Runtime DOM snapshot for agent auto-healing. Added by // @wdio/devtools-service in the before hook. - getSnapshot(options?: { inViewportOnly?: boolean }): Promise<SnapshotResult> + getSnapshot(options?: GetSnapshotOptions): Promise<GetSnapshotResult> } } diff --git a/packages/service/tests/index.test.ts b/packages/service/tests/index.test.ts index cc8f5b12..e6197b5c 100644 --- a/packages/service/tests/index.test.ts +++ b/packages/service/tests/index.test.ts @@ -103,6 +103,12 @@ vi.mock('../src/intercepted-network.js', () => ({ }) })) +const elementsMock = vi.hoisted(() => ({ + getSnapshot: vi.fn(), + snapshotRenderer: vi.fn(() => 'legacy') +})) +vi.mock('@wdio/elements', () => elementsMock) + vi.mock('node:fs/promises', () => ({ default: { writeFile: vi.fn().mockResolvedValue(undefined) } })) @@ -137,6 +143,7 @@ describe('DevtoolsService - Internal Command Filtering', () => { beforeEach(() => { vi.clearAllMocks() + elementsMock.snapshotRenderer.mockReturnValue('legacy') mockSessionCapturerInstance.afterCommand.mockClear() mockSessionCapturerInstance.sendUpstream.mockClear() service = new DevToolsHookService() @@ -158,6 +165,74 @@ describe('DevtoolsService - Internal Command Filtering', () => { }) }) + describe('getSnapshot command', () => { + const getSnapshotCommand = (): ((options?: object) => Promise<unknown>) => { + const call = mockBrowser.addCommand.mock.calls.find( + ([name]: [string]) => name === 'getSnapshot' + ) + return call[1] + } + + beforeEach(async () => { + elementsMock.getSnapshot.mockReset() + await service.before({} as any, [], mockBrowser) + }) + + it('defaults to the viewport and passes an explicit inViewportOnly through', async () => { + elementsMock.getSnapshot.mockResolvedValue({ + format: 'legacy', + text: 'T', + elements: {} + }) + + await getSnapshotCommand()() + expect(elementsMock.getSnapshot).toHaveBeenLastCalledWith(mockBrowser, { + viewport: true + }) + + await getSnapshotCommand()({ inViewportOnly: false }) + expect(elementsMock.getSnapshot).toHaveBeenLastCalledWith(mockBrowser, { + viewport: false + }) + }) + + it('reports the legacy failure value without refs', async () => { + elementsMock.getSnapshot.mockRejectedValue(new Error('no tree')) + + await expect(getSnapshotCommand()()).resolves.toEqual({ + format: 'legacy', + text: '[Snapshot unavailable]', + elements: {} + }) + }) + + it('reports the renderer that ran when the attempt flipped it to legacy', async () => { + elementsMock.snapshotRenderer.mockReturnValue('snapshot') + elementsMock.getSnapshot.mockImplementation(async () => { + elementsMock.snapshotRenderer.mockReturnValue('legacy') + throw new Error('@wdio/snapshot failed to load') + }) + + await expect(getSnapshotCommand()()).resolves.toEqual({ + format: 'legacy', + text: '[Snapshot unavailable]', + elements: {} + }) + }) + + it('reports the snapshot failure value with empty refs', async () => { + elementsMock.snapshotRenderer.mockReturnValue('snapshot') + elementsMock.getSnapshot.mockRejectedValue(new Error('no tree')) + + await expect(getSnapshotCommand()()).resolves.toEqual({ + format: 'snapshot', + text: '[Snapshot unavailable]', + elements: {}, + refs: [] + }) + }) + }) + // Regression: a request the app made after the test's last command was left out of that test's trace. describe('native network at the test boundary', () => { beforeEach(async () => { diff --git a/packages/shared/src/device.ts b/packages/shared/src/device.ts index 15a535db..f3c8a97a 100644 --- a/packages/shared/src/device.ts +++ b/packages/shared/src/device.ts @@ -56,7 +56,7 @@ function capString( * so a request-shaped bag's `firstMatch` array is deliberately not scanned: the * server merges `alwaysMatch` with the ONE entry it chose, and reading a * browser out of any entry would claim one the session never got. */ -function deepCapString( +export function deepCapString( caps: Record<string, unknown>, key: string ): string | undefined { diff --git a/packages/shared/src/snapshot-format.ts b/packages/shared/src/snapshot-format.ts index feeb8651..6a5b87d6 100644 --- a/packages/shared/src/snapshot-format.ts +++ b/packages/shared/src/snapshot-format.ts @@ -62,8 +62,7 @@ export const INTERACTIVE_ROLES = new Set([ ]) /** The fields of a node this module's helpers read. Deliberately narrower than - * `AccessibilityNode` so core's mobile `SnapshotNode` satisfies it too — both - * snapshot pipelines share these helpers. */ + * `AccessibilityNode` so the web and mobile serializers' nodes both satisfy it. */ export interface SnapshotFormatNode { role: string name: string diff --git a/packages/shared/tests/device.test.ts b/packages/shared/tests/device.test.ts index daf28c69..7842fe69 100644 --- a/packages/shared/tests/device.test.ts +++ b/packages/shared/tests/device.test.ts @@ -1,6 +1,7 @@ import { describe, expect, it } from 'vitest' import { + deepCapString, deviceFromCapabilities, deviceLabel, isNativeAppSession, @@ -254,3 +255,21 @@ describe('isNativeAppSession', () => { expect(isNativeAppSession({})).toBe(false) }) }) + +describe('deepCapString', () => { + it('prefers a top-level key over a vendor bag', () => { + expect(deepCapString({ k: 'top', 'v:options': { k: 'nested' } }, 'k')).toBe( + 'top' + ) + }) + + it('reads one level of vendor options', () => { + expect(deepCapString({ 'v:options': { k: 'nested' } }, 'k')).toBe('nested') + }) + + it('does not descend further or into arrays', () => { + expect( + deepCapString({ a: { b: { k: 'deep' } }, c: [{ k: 'arr' }] }, 'k') + ).toBeUndefined() + }) +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8550f798..ef16f207 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,21 +8,43 @@ overrides: vite: ^8.0.7 '@types/node': 26.6.4 '@codemirror/state': 6.5.4 + webdriverio: 10.2.0-alpha.100.sha-b38abd894 + webdriver: 10.2.0-alpha.100.sha-b38abd894 + '@wdio/allure-reporter': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/browser-runner': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/cli': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/config': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/cucumber-framework': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/display-server': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/dot-reporter': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/globals': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/local-runner': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/logger': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/mocha-framework': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/protocols': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/repl': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/reporter': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/runner': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/session': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/snapshot': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/spec-reporter': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/types': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/utils': 10.2.0-alpha.100.sha-b38abd894 importers: .: dependencies: '@wdio/cli': - specifier: 10.0.2 - version: 10.0.2(@types/node@26.6.4)(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)))(supports-color@11.0.0)(yauzl@2.10.0) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(@types/node@26.6.4)(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(yauzl@2.10.0) devDependencies: '@changesets/cli': specifier: ^3.0.3 version: 3.0.3 '@eslint/js': specifier: ^10.0.1 - version: 10.0.1(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0)) + version: 10.0.1(eslint@10.12.0(jiti@2.7.0)) '@types/node': specifier: 26.6.4 version: 26.6.4 @@ -31,37 +53,37 @@ importers: version: 8.18.2 '@typescript-eslint/eslint-plugin': specifier: ^8.71.0 - version: 8.71.0(@typescript-eslint/parser@8.71.0(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)(typescript@6.0.3))(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)(typescript@6.0.3) + version: 8.71.0(@typescript-eslint/parser@8.71.0(eslint@10.12.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.12.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/parser': specifier: ^8.71.0 - version: 8.71.0(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)(typescript@6.0.3) + version: 8.71.0(eslint@10.12.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/utils': specifier: ^8.71.0 - version: 8.71.0(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)(typescript@6.0.3) + version: 8.71.0(eslint@10.12.0(jiti@2.7.0))(typescript@6.0.3) '@vitest/coverage-v8': specifier: ^5.0.2 version: 5.0.3(vitest@5.0.3) '@wdio/allure-reporter': - specifier: ^10.0.1 - version: 10.0.1 + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894 eslint: specifier: ^10.11.0 - version: 10.12.0(jiti@2.7.0)(supports-color@11.0.0) + version: 10.12.0(jiti@2.7.0) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0)) + version: 10.1.8(eslint@10.12.0(jiti@2.7.0)) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.71.0(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)(typescript@6.0.3))(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + version: 2.32.0(@typescript-eslint/parser@8.71.0(eslint@10.12.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.12.0(jiti@2.7.0)) eslint-plugin-prettier: specifier: ^5.5.6 - version: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0)))(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(prettier@3.9.9) + version: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.12.0(jiti@2.7.0)))(eslint@10.12.0(jiti@2.7.0))(prettier@3.9.9) eslint-plugin-security: specifier: 4.2.0 version: 4.2.0 eslint-plugin-unicorn: specifier: ^76.0.0 - version: 76.0.0(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0)) + version: 76.0.0(eslint@10.12.0(jiti@2.7.0)) happy-dom: specifier: ^20.14.5 version: 20.14.5 @@ -73,7 +95,7 @@ importers: version: 8.5.28 postcss-lit: specifier: ^1.4.1 - version: 1.4.1(jiti@2.7.0)(postcss@8.5.28)(supports-color@11.0.0)(tsx@4.23.15)(yaml@2.9.1) + version: 1.4.1(jiti@2.7.0)(postcss@8.5.28)(tsx@4.23.15)(yaml@2.9.1) prettier: specifier: ^3.9.9 version: 3.9.9 @@ -97,10 +119,10 @@ importers: version: 8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) vitest: specifier: ^5.0.2 - version: 5.0.3(@types/node@26.6.4)(@vitest/coverage-v8@5.0.3)(happy-dom@20.14.5)(jsdom@24.1.3(supports-color@11.0.0))(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) + version: 5.0.3(@types/node@26.6.4)(@vitest/coverage-v8@5.0.3)(happy-dom@20.14.5)(jsdom@24.1.3)(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) webdriverio: - specifier: ^10.0.2 - version: 10.0.2(supports-color@11.0.0)(yauzl@2.10.0) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) ws: specifier: ^8.22.0 version: 8.22.0 @@ -112,7 +134,7 @@ importers: version: link:../../packages/nightwatch-devtools nightwatch: specifier: ^3.16.0 - version: 3.16.0(@cucumber/cucumber@13.2.1)(geckodriver@7.0.0(supports-color@8.1.1))(supports-color@8.1.1) + version: 3.16.0(@cucumber/cucumber@13.2.1) examples/selenium-js: dependencies: @@ -130,32 +152,32 @@ importers: examples/wdio: devDependencies: '@wdio/cli': - specifier: 10.0.2 - version: 10.0.2(@types/node@26.6.4)(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)))(supports-color@11.0.0)(yauzl@2.10.0) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(@types/node@26.6.4)(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(yauzl@2.10.0) '@wdio/cucumber-framework': - specifier: 10.0.1 - version: 10.0.1(supports-color@11.0.0)(yauzl@2.10.0) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) '@wdio/devtools-service': specifier: workspace:* version: link:../../packages/service '@wdio/globals': - specifier: 10.0.2 - version: 10.0.2(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)))(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)) '@wdio/local-runner': - specifier: 10.0.2 - version: 10.0.2(supports-color@11.0.0)(tsx@4.23.15)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0))(yauzl@2.10.0) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(tsx@4.23.15)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0))(yauzl@2.10.0) '@wdio/mocha-framework': - specifier: 10.0.1 - version: 10.0.1(supports-color@11.0.0)(yauzl@2.10.0) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) '@wdio/spec-reporter': - specifier: 10.0.1 - version: 10.0.1 + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894 '@wdio/types': - specifier: 10.0.1 - version: 10.0.1 + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894 expect-webdriverio: specifier: ^8.0.0 - version: 8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)) + version: 8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)) ts-node: specifier: ^10.9.2 version: 10.9.2(@swc/core@1.16.13)(@swc/wasm@1.16.13)(@types/node@26.6.4)(typescript@6.0.3) @@ -193,8 +215,8 @@ importers: specifier: ^4.3.3 version: 4.3.3 '@wdio/browser-runner': - specifier: ^10.0.2 - version: 10.0.2(@types/node@26.6.4)(esbuild@0.14.54)(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)))(jiti@2.7.0)(magicast@0.5.5)(rollup@4.64.0)(supports-color@11.0.0)(tsx@4.23.15)(webdriver@10.0.2(supports-color@11.0.0)(yauzl@2.10.0))(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0))(yaml@2.9.1)(yauzl@2.10.0) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(@types/node@26.6.4)(esbuild@0.28.2)(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(jiti@2.7.0)(magicast@0.5.5)(rollup@4.64.0)(tsx@4.23.15)(webdriver@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0))(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0))(yaml@2.9.1)(yauzl@2.10.0) '@wdio/devtools-shared': specifier: workspace:^ version: link:../shared @@ -202,23 +224,23 @@ importers: specifier: workspace:^ version: link:../trace '@wdio/globals': - specifier: ^10.0.2 - version: 10.0.2(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)))(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)) '@wdio/mocha-framework': - specifier: ^10.0.1 - version: 10.0.1(supports-color@11.0.0)(yauzl@2.10.0) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) '@wdio/protocols': - specifier: 10.0.2 - version: 10.0.2 + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894 '@wdio/reporter': - specifier: 10.0.1 - version: 10.0.1 + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894 codemirror: specifier: ^6.0.2 version: 6.0.2 expect-webdriverio: specifier: ^8.0.0 - version: 8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)) + version: 8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)) lit: specifier: ^3.3.3 version: 3.3.3 @@ -242,13 +264,13 @@ importers: version: 4.64.0 stylelint: specifier: ^17.16.0 - version: 17.16.0(supports-color@11.0.0)(typescript@6.0.3) + version: 17.16.0(typescript@6.0.3) stylelint-config-recommended: specifier: ^18.0.0 - version: 18.0.0(stylelint@17.16.0(supports-color@11.0.0)(typescript@6.0.3)) + version: 18.0.0(stylelint@17.16.0(typescript@6.0.3)) stylelint-config-tailwindcss: specifier: ^1.0.1 - version: 1.0.1(stylelint@17.16.0(supports-color@11.0.0)(typescript@6.0.3))(tailwindcss@4.3.3) + version: 1.0.1(stylelint@17.16.0(typescript@6.0.3))(tailwindcss@4.3.3) tailwindcss: specifier: ~4.3.3 version: 4.3.3 @@ -257,7 +279,7 @@ importers: version: 6.0.3 vite: specifier: ^8.0.7 - version: 8.3.5(@types/node@26.6.4)(esbuild@0.14.54)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) + version: 8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) packages/backend: dependencies: @@ -277,8 +299,8 @@ importers: specifier: workspace:^ version: link:../script '@wdio/logger': - specifier: 10.0.0 - version: 10.0.0 + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894 fastify: specifier: ^5.12.5 version: 5.12.5 @@ -311,8 +333,8 @@ importers: specifier: ^8.18.2 version: 8.18.2 '@wdio/cli': - specifier: ^10.0.2 - version: 10.0.2(@types/node@26.6.4)(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@5.5.0)(yauzl@2.10.0)))(supports-color@5.5.0)(yauzl@2.10.0) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(@types/node@26.6.4)(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(yauzl@2.10.0) '@wdio/devtools-shared': specifier: workspace:^ version: link:../shared @@ -324,7 +346,7 @@ importers: version: 3.1.14 tsup: specifier: ^8.5.1 - version: 8.5.1(@microsoft/api-extractor@7.59.3(@types/node@26.6.4))(@swc/core@1.16.13)(jiti@2.7.0)(postcss@8.5.28)(supports-color@5.5.0)(tsx@4.23.15)(typescript@6.0.3)(yaml@2.9.1) + version: 8.5.1(@microsoft/api-extractor@7.59.3(@types/node@26.6.4))(@swc/core@1.16.13)(jiti@2.7.0)(postcss@8.5.32)(tsx@4.23.15)(typescript@6.0.3)(yaml@2.9.1) typescript: specifier: 6.0.3 version: 6.0.3 @@ -344,8 +366,8 @@ importers: specifier: ^3.3.1 version: 3.3.1 '@wdio/cli': - specifier: 10.0.2 - version: 10.0.2(@types/node@26.6.4)(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)))(supports-color@11.0.0)(yauzl@2.10.0) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(@types/node@26.6.4)(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(yauzl@2.10.0) '@wdio/devtools-service': specifier: workspace:^ version: link:../service @@ -356,14 +378,14 @@ importers: specifier: workspace:^ version: link:../trace '@wdio/globals': - specifier: 10.0.2 - version: 10.0.2(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)))(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)) '@wdio/local-runner': - specifier: 10.0.2 - version: 10.0.2(supports-color@11.0.0)(tsx@4.23.15)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0))(yauzl@2.10.0) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(tsx@4.23.15)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0))(yauzl@2.10.0) '@wdio/mocha-framework': - specifier: 10.0.1 - version: 10.0.1(supports-color@11.0.0)(yauzl@2.10.0) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) '@wdio/nightwatch-devtools': specifier: workspace:^ version: link:../nightwatch-devtools @@ -371,11 +393,11 @@ importers: specifier: workspace:^ version: link:../selenium-devtools '@wdio/spec-reporter': - specifier: 10.0.1 - version: 10.0.1 + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894 expect-webdriverio: specifier: ^8.0.0 - version: 8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)) + version: 8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)) fflate: specifier: ^0.8.2 version: 0.8.3 @@ -384,7 +406,7 @@ importers: version: 12.0.3 nightwatch: specifier: ^3.16.0 - version: 3.16.0(@cucumber/cucumber@13.2.1)(geckodriver@7.0.0(supports-color@11.0.0))(supports-color@11.0.0) + version: 3.16.0(@cucumber/cucumber@13.2.1) selenium-webdriver: specifier: ^4.50.0 version: 4.50.0 @@ -392,8 +414,8 @@ importers: specifier: ^8.0.7 version: 8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) webdriverio: - specifier: ^10.0.2 - version: 10.0.2(supports-color@11.0.0)(yauzl@2.10.0) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) ws: specifier: ^8.22.0 version: 8.22.0 @@ -446,21 +468,27 @@ importers: '@wdio/devtools-core': specifier: workspace:^ version: link:../core + '@wdio/devtools-shared': + specifier: workspace:^ + version: link:../shared '@wdio/globals': - specifier: 10.0.2 - version: 10.0.2(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)))(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)) + '@wdio/snapshot': + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) tsup: specifier: ^8.5.1 - version: 8.5.1(@microsoft/api-extractor@7.59.3(@types/node@26.6.4))(@swc/core@1.16.13)(jiti@2.7.0)(postcss@8.5.28)(supports-color@11.0.0)(tsx@4.23.15)(typescript@6.0.3)(yaml@2.9.1) + version: 8.5.1(@microsoft/api-extractor@7.59.3(@types/node@26.6.4))(@swc/core@1.16.13)(jiti@2.7.0)(postcss@8.5.32)(tsx@4.23.15)(typescript@6.0.3)(yaml@2.9.1) typescript: specifier: 6.0.3 version: 6.0.3 vitest: specifier: ^5.0.2 - version: 5.0.3(@types/node@26.6.4)(@vitest/coverage-v8@5.0.3)(happy-dom@20.14.5)(jsdom@24.1.3(supports-color@11.0.0))(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) + version: 5.0.3(@types/node@26.6.4)(@vitest/coverage-v8@5.0.3)(happy-dom@20.14.5)(jsdom@24.1.3)(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) webdriverio: - specifier: ^10.0.2 - version: 10.0.2(supports-color@11.0.0)(yauzl@2.10.0) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) packages/nightwatch-devtools: dependencies: @@ -471,8 +499,8 @@ importers: specifier: workspace:* version: link:../script '@wdio/logger': - specifier: ^10.0.0 - version: 10.0.0 + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894 '@xmldom/xmldom': specifier: ^0.9.12 version: 0.9.12 @@ -486,8 +514,8 @@ importers: specifier: ^0.1.11 version: 0.1.11 webdriverio: - specifier: ^10.0.2 - version: 10.0.2(supports-color@11.0.0)(yauzl@2.10.0) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) ws: specifier: ^8.22.0 version: 8.22.0 @@ -515,10 +543,10 @@ importers: version: link:../shared nightwatch: specifier: ^3.16.0 - version: 3.16.0(@cucumber/cucumber@13.2.1)(geckodriver@7.0.0(supports-color@11.0.0))(supports-color@11.0.0) + version: 3.16.0(@cucumber/cucumber@13.2.1) tsup: specifier: ^8.5.1 - version: 8.5.1(@microsoft/api-extractor@7.59.3(@types/node@26.6.4))(@swc/core@1.16.13)(jiti@2.7.0)(postcss@8.5.28)(supports-color@11.0.0)(tsx@4.23.15)(typescript@6.0.3)(yaml@2.9.1) + version: 8.5.1(@microsoft/api-extractor@7.59.3(@types/node@26.6.4))(@swc/core@1.16.13)(jiti@2.7.0)(postcss@8.5.32)(tsx@4.23.15)(typescript@6.0.3)(yaml@2.9.1) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -547,8 +575,8 @@ importers: specifier: workspace:* version: link:../script '@wdio/logger': - specifier: ^10.0.0 - version: 10.0.0 + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894 '@xmldom/xmldom': specifier: ^0.9.12 version: 0.9.12 @@ -556,8 +584,8 @@ importers: specifier: ^0.1.11 version: 0.1.11 webdriverio: - specifier: ^10.0.2 - version: 10.0.2(supports-color@11.0.0)(yauzl@2.10.0) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) ws: specifier: ^8.22.0 version: 8.22.0 @@ -591,7 +619,7 @@ importers: version: 3.13.0(mocha@12.0.3) jest: specifier: ^30.5.2 - version: 30.5.2(@types/node@26.6.4)(supports-color@11.0.0)(ts-node@10.9.2(@swc/core@1.16.13)(@swc/wasm@1.16.13)(@types/node@26.6.4)(typescript@6.0.3)) + version: 30.5.2(@types/node@26.6.4)(ts-node@10.9.2(@swc/core@1.16.13)(@swc/wasm@1.16.13)(@types/node@26.6.4)(typescript@6.0.3)) mocha: specifier: ^12.0.3 version: 12.0.3 @@ -600,13 +628,13 @@ importers: version: 4.50.0 tsup: specifier: ^8.5.1 - version: 8.5.1(@microsoft/api-extractor@7.59.3(@types/node@26.6.4))(@swc/core@1.16.13)(jiti@2.7.0)(postcss@8.5.28)(supports-color@11.0.0)(tsx@4.23.15)(typescript@6.0.3)(yaml@2.9.1) + version: 8.5.1(@microsoft/api-extractor@7.59.3(@types/node@26.6.4))(@swc/core@1.16.13)(jiti@2.7.0)(postcss@8.5.32)(tsx@4.23.15)(typescript@6.0.3)(yaml@2.9.1) typescript: specifier: ^6.0.3 version: 6.0.3 vitest: specifier: ^5.0.2 - version: 5.0.3(@types/node@26.6.4)(@vitest/coverage-v8@5.0.3)(happy-dom@20.14.5)(jsdom@24.1.3(supports-color@11.0.0))(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) + version: 5.0.3(@types/node@26.6.4)(@vitest/coverage-v8@5.0.3)(happy-dom@20.14.5)(jsdom@24.1.3)(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) optionalDependencies: fluent-ffmpeg: specifier: ^2.1.3 @@ -619,7 +647,7 @@ importers: version: 7.29.9 '@babel/traverse': specifier: ^7.29.8 - version: 7.29.8(supports-color@11.0.0) + version: 7.29.8 '@babel/types': specifier: ^7.29.8 version: 7.29.8 @@ -676,8 +704,8 @@ importers: specifier: ^8.18.2 version: 8.18.2 '@wdio/allure-reporter': - specifier: ^10.0.1 - version: 10.0.1 + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894 '@wdio/devtools-core': specifier: workspace:^ version: link:../core @@ -685,20 +713,20 @@ importers: specifier: workspace:^ version: link:../shared '@wdio/globals': - specifier: 10.0.2 - version: 10.0.2(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)))(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)) '@wdio/logger': - specifier: 10.0.0 - version: 10.0.0 + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894 '@wdio/protocols': - specifier: 10.0.2 - version: 10.0.2 + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894 '@wdio/reporter': - specifier: 10.0.1 - version: 10.0.1 + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894 '@wdio/types': - specifier: 10.0.1 - version: 10.0.1 + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894 typescript: specifier: 6.0.3 version: 6.0.3 @@ -707,10 +735,10 @@ importers: version: 8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) vite-plugin-dts: specifier: ^5.1.1 - version: 5.1.2(@microsoft/api-extractor@7.59.3(@types/node@26.6.4))(esbuild@0.28.2)(rolldown@1.2.16)(rollup@4.64.0)(supports-color@11.0.0)(typescript@6.0.3)(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) + version: 5.1.2(@microsoft/api-extractor@7.59.3(@types/node@26.6.4))(esbuild@0.28.2)(rolldown@1.2.16)(rollup@4.64.0)(typescript@6.0.3)(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) webdriverio: - specifier: ^10.0.2 - version: 10.0.2(supports-color@11.0.0)(yauzl@2.10.0) + specifier: 10.2.0-alpha.100.sha-b38abd894 + version: 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) packages/shared: {} @@ -1608,134 +1636,134 @@ packages: '@iconify/utils@3.1.7': resolution: {integrity: sha512-JZHlwdID+dy+lTgbYC8NEC4zeugqeYsc6jewvzb4c58kHauJn+X7rNwQjxz5p2qSjqaEeQoLkCIQ9v/H4PK0/w==} - '@inquirer/ansi@1.0.2': - resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} - engines: {node: '>=18'} + '@inquirer/ansi@2.0.10': + resolution: {integrity: sha512-dwrc+1aqVZpHNkNDswXGtn1typ+Pxpo5FHZRyBw1le7onEJUkPUkYOY1FIFC1LvFMYUqqLuWBwElhAmencL7MQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - '@inquirer/checkbox@4.3.2': - resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} - engines: {node: '>=18'} + '@inquirer/checkbox@5.2.8': + resolution: {integrity: sha512-NY/S1EalQhlonqhwwsarrcnkH7s9ByQuvjWYdk1jB2Gb9EPQJjKkhCTWjM3yQ0UpHaLm1XbIL89b+32G8rhO5w==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': 26.6.4 peerDependenciesMeta: '@types/node': optional: true - '@inquirer/confirm@5.1.21': - resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} - engines: {node: '>=18'} + '@inquirer/confirm@6.3.5': + resolution: {integrity: sha512-BJ59BOyURiZiAxdr9AuRu38/k+rV+DcTIM2fUF/c/BXrab6H8zMZTTOl3LgkSJH96Xob2vOJxDiBkHiz32Xx2w==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': 26.6.4 peerDependenciesMeta: '@types/node': optional: true - '@inquirer/core@10.3.2': - resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} - engines: {node: '>=18'} + '@inquirer/core@12.0.6': + resolution: {integrity: sha512-5yxn2LsJ8Tu4ei2a+yNkmFRhM/cb+JMEsEs/AW6CCOnBnpMy4IjYiPMFyHtYq8weOmlTyqqCx40y0DsD7OsEPw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': 26.6.4 peerDependenciesMeta: '@types/node': optional: true - '@inquirer/editor@4.2.23': - resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} - engines: {node: '>=18'} + '@inquirer/editor@5.3.6': + resolution: {integrity: sha512-Z5SOeRC5VNkINfKN4rY8BSaYKb3GYi8iSEqZZRqogsE2GhBBToQ0Xw25SbI+4bcatLzU009mZ5d9EuJNiJuUCg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': 26.6.4 peerDependenciesMeta: '@types/node': optional: true - '@inquirer/expand@4.0.23': - resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} - engines: {node: '>=18'} + '@inquirer/expand@5.1.8': + resolution: {integrity: sha512-dMEnTkpLqzM/sbILwL7QJgx9iX5hoEM8+bh6shgwd9mYJamdOnth7y2mMaFd08Glj9AXEFKllWcGYyBqnJsHrA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': 26.6.4 peerDependenciesMeta: '@types/node': optional: true - '@inquirer/external-editor@1.0.3': - resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} - engines: {node: '>=18'} + '@inquirer/external-editor@3.0.7': + resolution: {integrity: sha512-enNqTJpojgISCG+a5acjnfJ02hcRTFUBVm8uXiCY40PRPZtSzFnNLskOTU+kDUUEODYma90syxuea1rRtUFh0Q==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': 26.6.4 peerDependenciesMeta: '@types/node': optional: true - '@inquirer/figures@1.0.15': - resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} - engines: {node: '>=18'} + '@inquirer/figures@2.0.10': + resolution: {integrity: sha512-51elrUJV3jZpvD0ygz8+U10Kc6+Lzqln+/tYmnbhy6jo5oXpE6hMCcv+OTBC0enwJXsb3JIuT3VtEinRNCSK2A==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - '@inquirer/input@4.3.1': - resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} - engines: {node: '>=18'} + '@inquirer/input@5.1.9': + resolution: {integrity: sha512-2Vd5T7lTxfgJMpAd3aOu6bQpbUnCU7tBgvTQIZkP/7juJzmRmTM2t5XfOCuirFduWLTSJI/WZp32Cq1E01TVeg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': 26.6.4 peerDependenciesMeta: '@types/node': optional: true - '@inquirer/number@3.0.23': - resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} - engines: {node: '>=18'} + '@inquirer/number@4.2.6': + resolution: {integrity: sha512-22LnGGCDm1M/pKXxxF8n6ppr/1IztdsxqeqeBRUMTTNnJTkjIBiAkewiDM4u/gjtazj/FvZS+nk9AbO/vEcBFQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': 26.6.4 peerDependenciesMeta: '@types/node': optional: true - '@inquirer/password@4.0.23': - resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} - engines: {node: '>=18'} + '@inquirer/password@5.2.5': + resolution: {integrity: sha512-0v0wLQA4uhWbybmdH6oPl7ooxCiymNylkvi2gCSc+mA5ZQB6QoJLVhoHq12T82lhozpp9fpMJnJkC1nJrU/A+A==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': 26.6.4 peerDependenciesMeta: '@types/node': optional: true - '@inquirer/prompts@7.10.1': - resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==} - engines: {node: '>=18'} + '@inquirer/prompts@8.7.5': + resolution: {integrity: sha512-l/IWwC+QhOyXgxkZloOh+n5quGzc1m5ZawyzBmoizCZaxbJeLRdS3pStoqg/JVInJRXaG5aHMhjK6H6oYiBC9A==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': 26.6.4 peerDependenciesMeta: '@types/node': optional: true - '@inquirer/rawlist@4.1.11': - resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} - engines: {node: '>=18'} + '@inquirer/rawlist@5.3.8': + resolution: {integrity: sha512-h+6Y4pPvYvuRbksn1kIBdD9tCYD+E468W5sIcVfLmoLP5IasnY0r33N+r+46ej/P8b2PCREjyKR+MnnfPGdTzg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': 26.6.4 peerDependenciesMeta: '@types/node': optional: true - '@inquirer/search@3.2.2': - resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} - engines: {node: '>=18'} + '@inquirer/search@4.3.6': + resolution: {integrity: sha512-JZj9ttkIvuaFQIc2oxsyqC1ad05WL02ku6W/INVKTCzNaVq1KkhP3AfTRC0m7OWlKZyw+EWwPBFZfYiG9jF6Yw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': 26.6.4 peerDependenciesMeta: '@types/node': optional: true - '@inquirer/select@4.4.2': - resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} - engines: {node: '>=18'} + '@inquirer/select@5.2.8': + resolution: {integrity: sha512-BklkkAAOpjdCfuQw5fVGcDuhKxA7T1iBpn6b2JUvDDdkIsO3Ftlg+WnWUCVpkUBFagL2o036OFW+xL4lC9wIPw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': 26.6.4 peerDependenciesMeta: '@types/node': optional: true - '@inquirer/type@3.0.10': - resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} - engines: {node: '>=18'} + '@inquirer/type@4.2.1': + resolution: {integrity: sha512-lDkPsnv5M5CcYB2T1qTc3dobNTPkVr4DU3Ic2Q6SW8/qVRHgvzdRdmVZ6YqG9Ag1aJTeMsLU0s0WPRh3CZWDQQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': 26.6.4 peerDependenciesMeta: @@ -1927,7 +1955,6 @@ packages: engines: {node: ^22.20 || ^24.12 || >=25} cpu: [x64] os: [linux] - libc: [glibc] '@napi-rs/nice-android-arm-eabi@1.1.1': resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==} @@ -2103,42 +2130,36 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm-musl@2.6.0': resolution: {integrity: sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.6.0': resolution: {integrity: sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.6.0': resolution: {integrity: sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [musl] '@parcel/watcher-linux-x64-glibc@2.6.0': resolution: {integrity: sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-x64-musl@2.6.0': resolution: {integrity: sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [musl] '@parcel/watcher-win32-arm64@2.6.0': resolution: {integrity: sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==} @@ -2228,42 +2249,36 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-arm64-musl@1.2.16': resolution: {integrity: sha512-hrJpblMsrQ58U9veWpbXzkhV5zStunds6HWLprqq1qauvgBr1E6P+24kLj6lSLI9vjRn/RYpjprhkHQPKGWpNg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [musl] '@rolldown/binding-linux-ppc64-gnu@1.2.16': resolution: {integrity: sha512-qJd/dC6j6CwLG9/s/RP2nb1RZ0GIgj7Ioj7x/SYa3RzjVrlzrmH0fhIOpfvqQDeIsdP0loi+kHaMhJzY1PBIaA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-s390x-gnu@1.2.16': resolution: {integrity: sha512-Vx7Xg5uUJuNcujJjI70OICaH0EYj80BtOLZTSN7uOYg8QOLlyKnaG0IW7Fn/J0IpJsaKzmDKMhOQv1JBM9m9vg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] - libc: [glibc] '@rolldown/binding-linux-x64-gnu@1.2.16': resolution: {integrity: sha512-TNKhgE3uJTsTzatUSSYt0Kgo+Oa2uSlSjz4r1aEIea7HX6ULBym4fAlYUhG1i6pjNf2njfCUAfKwr6C3E9Xg1w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-x64-musl@1.2.16': resolution: {integrity: sha512-7chXdpjXZ8qG0+mIxECN3cT9kvhZ3/oZhMX6Pp876P7CDrIy8nJswva6Mq357JR7eYXfuskwZxMeV1SzoZdHrA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [musl] '@rolldown/binding-openharmony-arm64@1.2.16': resolution: {integrity: sha512-Kwjt+7uNTJK5/MDkGWGVO2KQPnj8yAV75dMpfwyHZrJSXWHrniOB0aUEWlVYf3H1hOqFLIStLdM5QXq6bnKmOQ==} @@ -2348,103 +2363,86 @@ packages: resolution: {integrity: sha512-J/6xhutJPtFyIkmHdf4olOdHHKH5kOJNumojdWn+Elv5ICEYTVOa362Vw27TxsK0BLzb1le3EDlO3UbvFK1lnQ==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.64.0': resolution: {integrity: sha512-G4L/Nnx59d2LvDoV/P4S5lZ7oVLT6hodOHMacqjiq2LL2gts86KbkEBTYL53+fBt0odhf7XPIbIATGoYiJctxg==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.44.0': resolution: {integrity: sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-gnu@4.64.0': resolution: {integrity: sha512-zF16pvJDEUksGYRbfnXne7pdklAyj2XDmJeYKgP93oq0cUyX9Y8O7lUo1R+IY1GagP/YBvCEDCe7eEcAKpw//g==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.44.0': resolution: {integrity: sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-musl@4.64.0': resolution: {integrity: sha512-nIggWn8n+w12+R5lsV+PYYoUY8vuObxPAQqJI7WES+9v0qspYuAHoZMfYM0yLxlipasT5BY9ht5W8t5c/rSCkg==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.64.0': resolution: {integrity: sha512-WLOTiHPzszP0dxIMsHpFeDSOSB5I49Mj8K4+yKE3H1X/D0JRG5XZ5jrctJLMjnUc/LUzaKiwq6EHWNJ8pup8PA==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.64.0': resolution: {integrity: sha512-35RK9aRhh7g7Pmeu5gQ01aCvrhXzj9LoBE6xtUcEH1ns+nyTaSzxSpADmBQINu4QiTDGvmQYwo1j5hlg1rRXFw==} cpu: [loong64] os: [linux] - libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.64.0': resolution: {integrity: sha512-RqTfnpoTjuWfPAmqK5p2edt2AMCDJWm6oTn7sKfmyx+6tRga0ip05SJ977o6udTcIiDeF/CJMUfkaN4gtWt6Aw==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.64.0': resolution: {integrity: sha512-RQjZPigjxFvFZDijG6rjlSXxhRaTf9zLYVpGK+lVcga64oMqP1GbgVqCb46eHTTceSIgp89Ja0y5aPe3GFBYHg==} cpu: [ppc64] os: [linux] - libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.64.0': resolution: {integrity: sha512-tjL58mgQcTRnDRpeky+Sth1MKQeYi2Ct6r3Luq9E5aTSjnM/i/JbozqZkKqp9thM5+oDSZxo+05f9kdQedfTGA==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.64.0': resolution: {integrity: sha512-ictoRyVaoZ8C67myHef+8hhCa6IplXJJ/xUCkVCxziV4zxMZh+jvhkhGsPBLqj1S72fnqD0QH5zL4lcaa4X7DQ==} cpu: [riscv64] os: [linux] - libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.64.0': resolution: {integrity: sha512-8aVvZ2hfr9RLFzBQkQNmYeHLDja8fLeQAmLt757zdKN/B+8L809KlLJKctQjS22wZotptV8G6o7fVPuAs8S1tQ==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.44.0': resolution: {integrity: sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.64.0': resolution: {integrity: sha512-2dEF8GAcDKwshUfydD+GhosppNyBzhVUHkdFF3CXd3FpOkzj/RZzF5aoEtzklujklT5qFVRU2GK/cFeLaTNKVg==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.44.0': resolution: {integrity: sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-linux-x64-musl@4.64.0': resolution: {integrity: sha512-3XHTvoo2hKkh0MiOfS7SkhHjMaaWF7P4F3drocZZaho/Z8w7h/jpnuBHm91BOQLfvrKHs1yR+zir4E8RI3XzTQ==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-openbsd-x64@4.64.0': resolution: {integrity: sha512-HKtkzodL4a3KFWDXDoO61cRynAWTR3LnAE0oGtfG9lcNFpNuVYUFOByxDgNqEvic9rvaQbAj+SFwTEWDptRaIw==} @@ -2566,42 +2564,36 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [glibc] '@swc/core-linux-arm64-musl@1.16.13': resolution: {integrity: sha512-aeoYoG6fQsOS3mFOuTKvnJo1aaaxYNI0aRRlhdHaGP4q1YQx4XOc5Hkd35IFduWCBG3eZl3fPTjRuYvxpl7eTA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [musl] '@swc/core-linux-ppc64-gnu@1.16.13': resolution: {integrity: sha512-eEFoueZXWZ2S1lsqL8Ve2C8RjhzH9+Ktj8U4IGTUQL6CNG04+VhQiYQWJOf5xfVBU6I+PbH80yvsYegqZOOSZQ==} engines: {node: '>=10'} cpu: [ppc64] os: [linux] - libc: [glibc] '@swc/core-linux-s390x-gnu@1.16.13': resolution: {integrity: sha512-K0q1ReVXL3d5bzBgZxS+yJq5q2xRjg4k2XXGj9yiCEpE5ZqJGQ4Gtk1sRrk8W2lo3KY0DCJD3Myt6x2SMvGArQ==} engines: {node: '>=10'} cpu: [s390x] os: [linux] - libc: [glibc] '@swc/core-linux-x64-gnu@1.16.13': resolution: {integrity: sha512-Qvpihw30irhIjy2f91BR1pamcJBCgf8hmr9XWenztAX1YLkneRkkTB/PFGWQubhaBqQhY2uZKViMj/xV61uMBQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [glibc] '@swc/core-linux-x64-musl@1.16.13': resolution: {integrity: sha512-iCGxHbh3Cq5vqRvCPlw3XkkDz4RlkPSyQwfFKbOKTMj5tiEuojY/rLmf4BMfI9Z8yPJTf9VB07t3NbKInoC97g==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [musl] '@swc/core-win32-arm64-msvc@1.16.13': resolution: {integrity: sha512-iOabn6cd+hg3cnoKlAC8j3Yufv8nQHBVU5OIDX8dCPA95PjAZ0B0TlDn9sWivk8ezo/cLJux7p9n0B9vRej+1Q==} @@ -2677,28 +2669,24 @@ packages: engines: {node: '>= 20'} cpu: [arm64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.3.3': resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] - libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.3.3': resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==} engines: {node: '>= 20'} cpu: [x64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.3.3': resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==} engines: {node: '>= 20'} cpu: [x64] os: [linux] - libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.3.3': resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==} @@ -2759,9 +2747,6 @@ packages: '@types/babel__generator@7.27.0': resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} - '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} @@ -2816,8 +2801,8 @@ packages: '@types/shell-quote@1.7.5': resolution: {integrity: sha512-+UE8GAGRPbJVQDdxi16dgadcBfQ+KG2vgZhV1+3A1XmHbmwcdwhCUwIdy+d3pAGrbvgRoVSjeI9vOWyq376Yzw==} - '@types/sinonjs__fake-timers@8.1.5': - resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} + '@types/sinonjs__fake-timers@15.0.1': + resolution: {integrity: sha512-Ko2tjWJq8oozHzHV+reuvS5KYIRAokHnGbDwGh/J64LntgpbuylF74ipEL24HCyRjf9FOlBiBHWBR1RlVKsI1w==} '@types/split2@4.2.3': resolution: {integrity: sha512-59OXIlfUsi2k++H6CHgUQKEb2HKRokUA39HY1i1dS8/AIcqVjtAAFdf8u+HxTWK/4FUHMJQlKSZ4I6irCBJ1Zw==} @@ -2834,9 +2819,6 @@ packages: '@types/whatwg-mimetype@3.0.2': resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} - '@types/which@2.0.2': - resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==} - '@types/ws@8.18.2': resolution: {integrity: sha512-67MQl+fpWKVTT1NYdnmo3U4sc/xPo/zQBncVnI74qmQa0z/b+1g6iYqNmGCPbxO+zz2aklb08a0oHfegiVd0/w==} @@ -3070,90 +3052,86 @@ packages: '@volar/typescript@2.4.28': resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} - '@wdio/allure-reporter@10.0.1': - resolution: {integrity: sha512-Unxlc1THjU8V3DDRqcFMWvFvZVdaeYUrNgQO4RlZvLF+ygio7mOkYjfz7SGmrrCsy7xye5Elqn4VCw/ic0pstQ==} - engines: {node: '>=22.19.0'} + '@wdio/allure-reporter@10.2.0-alpha.100.sha-b38abd894': + resolution: {integrity: sha512-V8wlbLE0T7tOo8reC9EuBKNyJA6njIoYRRKoS7mn/pBR7MjKlXMedfxQmiFRqhK0a2Ojs0dZ1AmTvtlmAMI8GA==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} - '@wdio/browser-runner@10.0.2': - resolution: {integrity: sha512-IJQZ725cBPQDFp3spmycFyOiBj76H0+7vB128us3+wpX2rjLG7UcFJZXfYLubquDa8ybMCZojzoIifHoiJH9ww==} - engines: {node: '>=22.19.0'} + '@wdio/browser-runner@10.2.0-alpha.100.sha-b38abd894': + resolution: {integrity: sha512-CS7E/8f5K5GaMC6r5Wv1A6AOWqub8wxuZzjigkDXzpLM83Shxv04LkFerzxip6CzJc2CP1feiX/hwS1IzQ7G4g==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} peerDependencies: - expect-webdriverio: ^8.0.0-0 || ^8.0.0-alpha.3 - webdriver: ^10.0.0-0 || ^10.0.0 - webdriverio: ^10.0.0-0 || ^10.0.0 + expect-webdriverio: ^8.0.0 + webdriver: 10.2.0-alpha.100.sha-b38abd894 + webdriverio: 10.2.0-alpha.100.sha-b38abd894 - '@wdio/cli@10.0.2': - resolution: {integrity: sha512-t67EIII06oAtzCyy9RYNgmChzSnwY91Vw5NW8QwJg2p8ZT2cvDYrtytEYO/x3jZQK3uJ/mba2GlQQP4SHJK+Uw==} - engines: {node: '>=22.19.0'} + '@wdio/cli@10.2.0-alpha.100.sha-b38abd894': + resolution: {integrity: sha512-PQfSnkgbEaVc6/5CwF16yherLXrJ2+2k/ZY4ZxRuyZTlbSaAC76cWqYntZswYtDMsIWxx9VWuSoC9ej5Y6QfVQ==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} hasBin: true - '@wdio/config@10.0.1': - resolution: {integrity: sha512-n6elHE4ItKAtr4lwAaWIh/sAFuEFhyesLM27i5l9IWBJEK6VECdt0Pigj/4vUD2tliOoBtsWxphSW4oiNFXotg==} - engines: {node: '>=22.19.0'} + '@wdio/config@10.2.0-alpha.100.sha-b38abd894': + resolution: {integrity: sha512-pblwGCBMLRVtVJePlheEQGXfmS8oNXE5Wawyu6ag+ED1cRq0IomIYD10o6Din1SqD/3rcD6VLk+/qwx/M2idOA==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} - '@wdio/cucumber-framework@10.0.1': - resolution: {integrity: sha512-bcN2wlpUG/qtZ01TNPgrAnq8bWZKYp6C0qZglBz+PqBjzKQYGJ8fKt/bkHiuf6X93JqL3zqgzwG7mau5v5f/1w==} - engines: {node: '>=22.19.0 <23 || >=24 <25 || >=26'} + '@wdio/cucumber-framework@10.2.0-alpha.100.sha-b38abd894': + resolution: {integrity: sha512-7NGK3Q0IIjYKAplkvU2g6EIygdURaZJLzeskmMSIJR2aGPm5SxGtDwIUgcH4AbgEOgMeAficI0lxVvT4t7LcYQ==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} - '@wdio/display-server@10.0.1': - resolution: {integrity: sha512-DMXpSCUpk/3KArcTFNlyEPI6O7EzeW9b3C4m54yZSlwaXFtix0P96c6ofiuvZ6bf/6bVd7s2GAxGk3yhmK8giw==} - engines: {node: '>=22.19.0'} + '@wdio/display-server@10.2.0-alpha.100.sha-b38abd894': + resolution: {integrity: sha512-4yZTToREgpPSd4s00IuKYl9+AbaD+Eoa4XfJuUNxwT1yiZ7LD4LcJ21F/cm7M5PR9ul/5YTG2HlL4OsoG6TDeg==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} - '@wdio/dot-reporter@10.0.1': - resolution: {integrity: sha512-R0wuXuj4+f1yeXWnDyFqVPnJQzHrnepLH8ynS47wb87BVbtX9aVsbT9jctfplnfGHKySLm525w3/ajTj//anFg==} - engines: {node: '>=22.19.0'} + '@wdio/dot-reporter@10.2.0-alpha.100.sha-b38abd894': + resolution: {integrity: sha512-ZDJOx8AWokrX2VSwTKcTtoHyabO1hya2tzt5sfWOq9tR+MxAAYfI3XFTQygoAvpZw2LFyK0FhgFCJP0yfrDI+g==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} - '@wdio/globals@10.0.2': - resolution: {integrity: sha512-gQgKy2Yo99E9CIiHJgKDKrRPU3sYR92kZGStROArQvZqVcLsdPQZ3Ktf6L3cRyes1Vee/H82L/FG24vrB3C+mQ==} - engines: {node: '>=22.19.0'} + '@wdio/globals@10.2.0-alpha.100.sha-b38abd894': + resolution: {integrity: sha512-lvhyjOL2wfDBf7Kywyiddxn/gA4Jnrfh/5+L+W+Qjo/VHG+sgcH6QwVd0Gmx1m7nF+N5aaRVGUMNweFlvGnnJg==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} peerDependencies: - expect-webdriverio: ^8.0.0-0 || ^8.0.0-alpha.3 - webdriverio: ^10.0.0-0 || ^10.0.0 - - '@wdio/local-runner@10.0.2': - resolution: {integrity: sha512-w3mamc9/CWttRYE+sLXYwHl7sDi2nxt7R8RpY41gT5sK2ol/UQ+96TaG4fO3KsotmLhNe15wfP/Z2umgeEx+Tg==} - engines: {node: '>=22.19.0'} + expect-webdriverio: ^8.0.0 + webdriverio: 10.2.0-alpha.100.sha-b38abd894 - '@wdio/logger@10.0.0': - resolution: {integrity: sha512-kUIw0ZzMs1mvXOaLEcjrM1nqNXY1reaJKReKNcjDSnfhnfUIb0Q5pAsxiMeil2uR0WsSUPzn0r3D9v//7vTOkA==} - engines: {node: '>=22.19.0'} + '@wdio/local-runner@10.2.0-alpha.100.sha-b38abd894': + resolution: {integrity: sha512-zV1wFhonpZNjyqj6QFiLjLF0JgLboZEzwfoQwAIBtzYhf0K9FTNckIgWpnidTaJv0zHCXVWQVHOh2B+DCEdq5A==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} - '@wdio/logger@9.29.1': - resolution: {integrity: sha512-0ZAEIo6PNyMIJPlOGkIgyOJUjcd0pC8/QHlVAAe1c91/IcjZ1X+k0yidXHaboJdN7dq1XPUacmhRdtua0U5EZg==} - engines: {node: '>=18.20.0'} + '@wdio/logger@10.2.0-alpha.100.sha-b38abd894': + resolution: {integrity: sha512-vmPDlNPutpib7xvzfrDAuAjmbR+MxrryP4n5Kok9wes7/xI3fzXHsNmOHBRBsVLdnoWXdClD/p5/Si+QUFaapw==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} - '@wdio/mocha-framework@10.0.1': - resolution: {integrity: sha512-OZ++XMxtJnCmRZ2EA+ElzMxLXJNo27H9vvm3wWdFTFOFGuu5jWOlb6x090BVeX0c7jXYYjpAu0aXqix+dBItxQ==} - engines: {node: '>=22.19.0'} + '@wdio/mocha-framework@10.2.0-alpha.100.sha-b38abd894': + resolution: {integrity: sha512-aiMB8r/sJrvByYiIMXHo9jLVP29K17WHTYSvDWGZ69nvcaZ281hkPPZTlVQM5SNmgZafKve4gHZLTN8XNfeR6w==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} - '@wdio/protocols@10.0.2': - resolution: {integrity: sha512-ewuQuu+niq/ZpV1TLn904nDA4F9n4LLu9X1U8Juwwm1ahq09dpEP8lEytDnpaD0f21uIx//mFBKmBAjSexMdEA==} - engines: {node: '>=22.19.0'} + '@wdio/protocols@10.2.0-alpha.100.sha-b38abd894': + resolution: {integrity: sha512-eoq3KlWOIPcZl7nxeD8/30cfscfkUuUV9dyN+dK6BbN045sYOpP+65P7QPBwBQJke1I5jmyRrpAbF5LadOVtRA==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} - '@wdio/repl@10.0.0': - resolution: {integrity: sha512-wAC9ksdWWv2E3Sj86eNKxB3IUt0gEyw9rgDGAWjk/GWgi6K3e+/n3erGNweI9JMJyC/+RNe0qHgVPQpRJMRVpg==} - engines: {node: '>=22.19.0'} + '@wdio/repl@10.2.0-alpha.100.sha-b38abd894': + resolution: {integrity: sha512-1etG12ECrbp56zvDgT5WGkLjRc1XoYrEcr0oTYtZYx4+wNDYBn+DgOdbM3FtMS/LVNTHpZzFcnxFjkV6ZyGWpw==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} - '@wdio/reporter@10.0.1': - resolution: {integrity: sha512-A917SeniucyosspqazR9tGH6t9JaecU5SRP3VzRGyIo0JBEKV6walJU1VBauMH+7n043huzgiQvNJ414Vi8dmQ==} - engines: {node: '>=22.19.0'} + '@wdio/reporter@10.2.0-alpha.100.sha-b38abd894': + resolution: {integrity: sha512-ei4Wh4xmTBScEVnMnOijld/8S8BSx1J2gzPGA0CxS2xzjn9/bBbq6yXS+geSoF0vLWPLpHetWiP77WvbtMi3gw==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} - '@wdio/runner@10.0.2': - resolution: {integrity: sha512-+BnWawcWrqQh9RoKhqtnlJ3onRDpahu5BuJx1ESrWvR/+MDdlOx617Mk5Pvw69+vpDpMUdox9XqFMAt3H3hL7Q==} - engines: {node: '>=22.19.0'} + '@wdio/runner@10.2.0-alpha.100.sha-b38abd894': + resolution: {integrity: sha512-vhehqCr1j2a15C7dPkPlGIky4xXEz05iwUKwJ74f3ACvjnruA3imeQtWUXTu/49vHlDGkwE3QGQbGVMzFl8UFg==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} peerDependencies: - expect-webdriverio: ^8.0.0-0 || ^8.0.0-alpha.3 - webdriverio: ^10.0.0-0 || ^10.0.0 + expect-webdriverio: ^8.0.0 + webdriverio: 10.2.0-alpha.100.sha-b38abd894 - '@wdio/session@10.0.2': - resolution: {integrity: sha512-Ttu2425dZ+r5whjScFRWVkAHAyhg/5nheN/bkTWPf2gluJb4/na2NM7bElOZ4IZFgwFgM5gFkE+9o5WwSVJfSQ==} - engines: {node: '>=22.19.0'} + '@wdio/session@10.2.0-alpha.100.sha-b38abd894': + resolution: {integrity: sha512-l8giL9mn+XSOa+7O8jxSjad1QAW5qcxMXcqz1gu5VeOeFNb/R2ZhqlXEIohZNi5V3Yt0hAeVFeCaP5L2NTLV+g==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} hasBin: true peerDependencies: '@wdio/electron-service': '*' - '@wdio/visual-service': '*' + '@wdio/visual-service': ^10.0.0 || ^11.0.0 appium: ^3.0.0 - expect-webdriverio: '*' + expect-webdriverio: ^8.0.0 tsx: '*' peerDependenciesMeta: '@wdio/electron-service': @@ -3167,28 +3145,28 @@ packages: tsx: optional: true - '@wdio/snapshot@10.0.2': - resolution: {integrity: sha512-eN5DJEr4bQKGOMkA3x4FglMJxe9U91QUGXuChHjFAnzV9OcNQcfVNIsK3uIB3wJ0tnUlzqQ27Dbm8vP+2bA38w==} - engines: {node: '>=22.19.0'} + '@wdio/snapshot@10.2.0-alpha.100.sha-b38abd894': + resolution: {integrity: sha512-kmjlW1iPEK4lx2KvdGm1PA5DVZwUHy/dUSlcPhMcSE+jbEa3myNPNRg2325ssu3d16gS5C+63nkLYqX/zu/zKA==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} - '@wdio/spec-reporter@10.0.1': - resolution: {integrity: sha512-zu4PQ7T95KQ/b3/coHQ3RLK5ffQDrpdXkxsfcTXU9Zd+l9K1GzTyJEgXCE7zY1l+INbrBqhM17aUmQvaBZH+JA==} - engines: {node: '>=22.19.0'} + '@wdio/spec-reporter@10.2.0-alpha.100.sha-b38abd894': + resolution: {integrity: sha512-l4Cp7le4Td4iJmPPibYIWqh5zjJXk3mN0+EB68w3WdXuAxMhG2oVLP2fSvrwj3y1Dv5hDakpeCyRI44xHsSVdg==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} - '@wdio/types@10.0.1': - resolution: {integrity: sha512-HGP9lAYXCsLAXzugfT4khCh7tYByWOMIxZHCG+tUvgmpwNzi6lfIsxyIlWownXK1wYJUpk6tkDBX/iXwN+q0lg==} - engines: {node: '>=22.19.0'} + '@wdio/types@10.2.0-alpha.100.sha-b38abd894': + resolution: {integrity: sha512-YjBBgky4xKBbpgLmJ8yew8kYse/4oQXKTdMUKEzDjai39Jh8iyh8XI15RF7J7TsZsJNhOQabZtR9zP1zf/O/iA==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} - '@wdio/utils@10.0.1': - resolution: {integrity: sha512-aYvTtF+7IYsvkFdXdu32Q2vexEaXYK79R1wLTnAXrT2Q7fp0oCDL0UgBx8Jgo5Tn98ZLWx4JlUeZsDRAIkV4Zw==} - engines: {node: '>=22.19.0'} + '@wdio/utils@10.2.0-alpha.100.sha-b38abd894': + resolution: {integrity: sha512-lid4YEwGKP7XbRxfu+UrATMN8KGGia5DNLHQNJd0+uEGjwqaoIMP5wZns9MGcHT2booWJmxtfdbP8sRregpzLQ==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} '@xmldom/xmldom@0.9.12': resolution: {integrity: sha512-5AXjrcMClTryPe9LgZrygpB1lj7s0S9E0+W+AHaVKAVyHanafK86iPSvG5xHVSp/jC+VH1UXu0TAEmY279xH7A==} engines: {node: '>=14.6'} - '@zip.js/zip.js@2.20.0': - resolution: {integrity: sha512-ws8m/tIfbt10L7E9PZj4h0vePKBodxpF13z9JzXdNw1e9ZMFdqnS7ppcK7vXPfN7vwSv2TuRTP7cO2OetdndvA==} + '@zip.js/zip.js@2.24.0': + resolution: {integrity: sha512-WlaVKzdqBK+RF3bdiXZWbdCnvGB6PdO4IHC1mn/2Yfl3bASgqUNegnU3+PNg61iecwoPfUi5BgLUPqBukXpyWw==} engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=18.0.0'} abort-controller@3.0.0: @@ -3221,6 +3199,10 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + agent-base@9.0.0: + resolution: {integrity: sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==} + engines: {node: '>= 20'} + ajv-draft-04@1.0.0: resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} peerDependencies: @@ -3635,9 +3617,9 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chalk@6.0.1: + resolution: {integrity: sha512-/Ce6KNm3vIbWdMlNna6RVIZ/ICQxnJxCicet5LBKK9ZffBkqzDw0xh9EiKSljdRtiIQ1S1z4YgcscUUGzNCWrA==} + engines: {node: '>=22'} change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} @@ -3674,6 +3656,10 @@ packages: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} + chokidar@6.0.0: + resolution: {integrity: sha512-Ec2Z7wpcKBiMpR7DxteoqS/sq5G5d2A4fpxzPv6+fD7xNNdrTghn7L11YwV5EN1B3i72Erc3XVT5FkWIDx90+A==} + engines: {node: '>= 22.22'} + ci-info@3.3.0: resolution: {integrity: sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==} @@ -3752,10 +3738,6 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - commander@15.0.0: resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} engines: {node: '>=22.12.0'} @@ -3838,9 +3820,9 @@ packages: create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - create-wdio@10.0.2: - resolution: {integrity: sha512-d3Z+a46mOhPVogOzqTatXoI5k+a2cYNpkvhLjbJaiteapxyGALBfM7XQO1po+NTIu1WTaVT0pM1eAoMkw14CNQ==} - engines: {node: '>=22.19.0'} + create-wdio@10.2.0-alpha.100.sha-b38abd894: + resolution: {integrity: sha512-ej5g0VpUyoSWXUsxKhm5BP1eVaVa7kI6eTON+svDfdFP08O6sNUaE0plGXnKr6ecm7B9wf9cCZ/SPgObUcIuIw==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} hasBin: true crelt@1.0.6: @@ -3934,6 +3916,10 @@ packages: resolution: {integrity: sha512-G7Cqgaelq68XHJNGlZ7lrNQyhZGsFqpwtGFexqUv4IQdjKoSYF7ipZ9UuTJZUSQXFj/XaoBLuEVIVqr8EJngEQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + decamelize@7.0.0: + resolution: {integrity: sha512-uT/0KzZIx9u4b5vW3HLWtSYwjLTuY2QFVY3xNmfXXUmTqnfgzfT8DEA2gY93go5sXEjnbqP66KcURdVxm0rDXA==} + engines: {node: '>=22'} + decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} @@ -4056,6 +4042,11 @@ packages: resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} + dotenv@18.0.9: + resolution: {integrity: sha512-3fVOW4cB02R066PUSwn8O4TJyz9NckQl7F81blIbaq9jKBm2tSmOKky7ZHIXzGvkVPXCSn6jkpziBPZdGFs8Tw==} + engines: {node: '>=12'} + hasBin: true + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -4069,20 +4060,23 @@ packages: easy-table@1.2.0: resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} - edge-paths@3.0.5: - resolution: {integrity: sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==} - engines: {node: '>=14.0.0'} - - edgedriver@7.0.0: - resolution: {integrity: sha512-4sJLhorcBSfzaqMN41q2VI9KVW9Qcpo7CHbUcBUDWeQ7uHiWnRWayV1KZOQr9jllSBOHD2aXzhUWrC2yCt+PRA==} - engines: {node: '>=20.0.0'} + edgedriver@8.0.0: + resolution: {integrity: sha512-h4twAKTFILvpjrxfeN1gslvnggztA6Cgb4iHQdLzEq3TivaHHlf6qEETpCgU7+iw9JIWjcveeckrDlbcY28a/A==} + engines: {node: '>=22.19.0'} hasBin: true + peerDependencies: + '@wdio/logger': 10.2.0-alpha.100.sha-b38abd894 ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} hasBin: true + ejs@7.0.2: + resolution: {integrity: sha512-LcDSEP6Oclb9sTiSyG0MpG0RuKvLDRxCOOt+2sIk+kdk1rMkFU8SRnT0qaNt5zvU0LOV1YXXOvIoZL/sKwabvw==} + engines: {node: '>=0.12.18'} + hasBin: true + electron-to-chromium@1.5.443: resolution: {integrity: sha512-TDJG36L9A3CWWwZ97HKaE+Iz1sW80pNp6sAU0owzCIV3Zc9eVyRqZK8Vz6NKuMIU8WjP0pIkoqCa0VRf/yFD0Q==} @@ -4410,10 +4404,6 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint-visitor-keys@5.0.1: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -4428,10 +4418,6 @@ packages: jiti: optional: true - espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@11.2.0: resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -4474,17 +4460,17 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + execa@10.2.1: + resolution: {integrity: sha512-/Bofl3ZBh2Q4/PG0W63qFzP5vDAypi8Zc90UWTBzaDNIYiX7apPOd0N6L8hG8CojUdq4V51adu8BObP+iVsSTw==} + engines: {node: '>=22'} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} - execa@9.6.1: - resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} - engines: {node: ^18.19.0 || >=20.5.0} - - exit-hook@4.0.0: - resolution: {integrity: sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==} - engines: {node: '>=18'} + exit-hook@5.1.0: + resolution: {integrity: sha512-INjr2xyxHo7bhAqf5ong++GZPPnpcuBcaXUKt03yf7Fie9yWD7FapL4teOU0+awQazGs5ucBh7xWs/AD+6nhog==} + engines: {node: '>=20'} exit-x@0.2.2: resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} @@ -4498,8 +4484,8 @@ packages: resolution: {integrity: sha512-MoZ7u0vv/DsPsc2oVvt1HyaTXVXgpKcrhaUB8wad07z2g7RPnF9olHNClKK6ZqFeC1YS9xZYeGgzkA9EWjfgWQ==} engines: {node: '>=22.19.0'} peerDependencies: - '@wdio/types': ^10.0.0 - webdriverio: ^10.0.0 + '@wdio/types': 10.2.0-alpha.100.sha-b38abd894 + webdriverio: 10.2.0-alpha.100.sha-b38abd894 expect@30.5.2: resolution: {integrity: sha512-0LNuMvs8/5mRYhnCR4k+lGV7fqPMs6Bnksda4S3zsCUmdxBpAn4zU4NNzXdq1pMKe/H4W5t/zVIDSJ/H3e0vDA==} @@ -4612,10 +4598,6 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - fix-dts-default-cjs-exports@1.0.1: resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} @@ -4671,10 +4653,12 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - geckodriver@7.0.0: - resolution: {integrity: sha512-RypjU7cNcyjWK3ruEriCkWMRa9nroCT3y2qwkPynGzKTK1wG0UCWubb4AfVDTXzG9BhzRTwg29DoeK7PCRnK1w==} - engines: {node: '>=20.0.0'} + geckodriver@8.0.0: + resolution: {integrity: sha512-2jGCA6deI5MAjODxmHljPqvaUccGbeeqMUHXlW4k3FNDp4YDpxSI+P5QG+w5KIsnCeuGEfTTNi2euKqHI1eD6Q==} + engines: {node: '>=22.19.0'} hasBin: true + peerDependencies: + '@wdio/logger': 10.2.0-alpha.100.sha-b38abd894 generator-function@2.0.1: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} @@ -4850,17 +4834,13 @@ packages: hookified@2.2.0: resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==} + hosted-git-info@10.1.1: + resolution: {integrity: sha512-DeOnSPAvOndYKfw075gt8yZzQ7S2hNztw34zBTfhIzLhmBTswIBg5/y+pqu/VD5cYWm5goAFTusDmUEmKZ0PEQ==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - hosted-git-info@7.0.2: - resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} - engines: {node: ^16.14.0 || >=18.0.0} - - hosted-git-info@8.1.0: - resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==} - engines: {node: ^18.17.0 || >=20.5.0} - hosted-git-info@9.0.3: resolution: {integrity: sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==} engines: {node: ^20.17.0 || >=22.9.0} @@ -4897,6 +4877,10 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} + https-proxy-agent@9.1.0: + resolution: {integrity: sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA==} + engines: {node: '>= 20'} + human-id@4.2.1: resolution: {integrity: sha512-zPGsiS+dWoTZtZ4AtpA9Y+BdSFSNWvnouNlWNoUFyAM6xHOHmdCvqO3k8AIbdamCOv4gUFUVNPf6rJFfc4UiJw==} hasBin: true @@ -4989,9 +4973,9 @@ packages: resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - inquirer@12.11.1: - resolution: {integrity: sha512-9VF7mrY+3OmsAfjH3yKz/pLbJ5z22E23hENKw3/LNSaA/sAt3v49bDRY+Ygct1xwuKT+U+cBfTzjCPySna69Qw==} - engines: {node: '>=18'} + inquirer@14.2.5: + resolution: {integrity: sha512-s5r4MqAyAXGau1AYf9weaQbj6wbkY/wuuqROGRwyEiR3KvE4QSJ8y5OYfOfWLYyRVhoK6zU2hNmf9vbt/k+Wag==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': 26.6.4 peerDependenciesMeta: @@ -5197,10 +5181,6 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isexe@4.0.0: - resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} - engines: {node: '>=20'} - istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -5400,10 +5380,6 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-parse-even-better-errors@3.0.2: - resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - json-schema-ref-resolver@3.0.0: resolution: {integrity: sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==} @@ -5540,56 +5516,48 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] lightningcss-linux-arm64-gnu@1.33.0: resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] lightningcss-linux-arm64-musl@1.32.0: resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [musl] lightningcss-linux-arm64-musl@1.33.0: resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [musl] lightningcss-linux-x64-gnu@1.32.0: resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [glibc] lightningcss-linux-x64-gnu@1.33.0: resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [glibc] lightningcss-linux-x64-musl@1.32.0: resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [musl] lightningcss-linux-x64-musl@1.33.0: resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [musl] lightningcss-win32-arm64-msvc@1.32.0: resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} @@ -5630,10 +5598,6 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lines-and-columns@2.0.4: - resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lit-element@4.2.2: resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} @@ -5670,10 +5634,6 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lodash.clonedeep@4.5.0: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} @@ -5880,9 +5840,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mute-stream@2.0.0: - resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} - engines: {node: ^18.17.0 || >=20.5.0} + mute-stream@3.0.0: + resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} + engines: {node: ^20.17.0 || >=22.9.0} mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -5946,21 +5906,21 @@ packages: engines: {node: '>=10'} hasBin: true + non-error@0.1.0: + resolution: {integrity: sha512-TMB1uHiGsHRGv1uYclfhivcnf0/PdFp2pNqRxXjncaAsjYMoisaQJI+SSZCqRq+VliwRTC8tsMQfmrWjDMhkPQ==} + engines: {node: '>=20'} + normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - normalize-package-data@6.0.2: - resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} - engines: {node: ^16.14.0 || >=18.0.0} - - normalize-package-data@7.0.1: - resolution: {integrity: sha512-linxNAT6M0ebEYZOx2tO6vBEFsVgnPpv+AVjk0wJHfaUIbq31Jm3T6vvZaarnOeWDh8ShnwXuaAyM7WT3RzErA==} - engines: {node: ^18.17.0 || >=20.5.0} - normalize-package-data@8.0.0: resolution: {integrity: sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==} engines: {node: ^20.17.0 || >=22.9.0} + normalize-package-data@9.0.0: + resolution: {integrity: sha512-la34cHOCAT6itNOYCvPi40XP8r0y6OHuNkooOfnfFUHdgy5MBw665qq5xsuS02AEC7WPQvhwvb7E9PI1gipplw==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -6062,10 +6022,6 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -6074,10 +6030,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -6107,10 +6059,6 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse-json@7.1.1: - resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} - engines: {node: '>=16'} - parse-json@8.3.0: resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} engines: {node: '>=18'} @@ -6135,10 +6083,6 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -6321,6 +6265,10 @@ packages: resolution: {integrity: sha512-byhRAPguVKMQIj4kjJwJ5lAskVhfuiSdiYl/aLTWpgkGEmic2jYhJh1yE9ih8Ox44Xg9ccCT11/S6QrzSJuNrg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + pretty-ms@10.0.0: + resolution: {integrity: sha512-6BWuxY2dCNgT45VnGzZcfNy7WeLqXiZqhhy4aHThTE6KI56R2ZBw9HQ7spPFKYchDizvJbPxTEknIpmW4FSmQA==} + engines: {node: '>=22'} + pretty-ms@9.3.1: resolution: {integrity: sha512-HzMy3Geq23nVALD/M2LliU+F+M+gVNsvkQWWqeBZ8HDiCgzo6YPJ/Omrmtq24EFrIsk0a3EkQGEd7bDOo+IhGA==} engines: {node: '>=18'} @@ -6341,6 +6289,15 @@ packages: property-expr@2.0.6: resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} + proxy-agent-negotiate@1.1.0: + resolution: {integrity: sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ==} + engines: {node: '>= 20'} + peerDependencies: + kerberos: ^2.0.0 + peerDependenciesMeta: + kerberos: + optional: true + psl@1.15.0: resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} @@ -6396,10 +6353,6 @@ packages: resolution: {integrity: sha512-Q5hMVBYur/eQNWDdbF4/Wqqr9Bjvtrw2kjGxxBbKLbx8bVCL8gcArjTy8zDUuLGQicftpMuU0riQNcAsbtOVsw==} engines: {node: '>=20'} - read-pkg-up@10.1.0: - resolution: {integrity: sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==} - engines: {node: '>=16'} - read-pkg@10.1.0: resolution: {integrity: sha512-I8g2lArQiP78ll51UeMZojewtYgIRCKCWqZEgOO8c/uefTI+XDXvCSXu3+YNUaTNvZzobrL5+SqHjBrByRRTdg==} engines: {node: '>=20'} @@ -6408,10 +6361,6 @@ packages: resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} engines: {node: '>=4'} - read-pkg@8.1.0: - resolution: {integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==} - engines: {node: '>=16'} - readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -6554,12 +6503,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - rxjs@7.8.2: - resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - - safaridriver@2.0.0: - resolution: {integrity: sha512-LL7Ufa9p1cltLmw0WGIbM6FFXibWMoM9NjJuS5QFiAAtEnEwkwMxaXy1BRKCBZKSZ+brs9eYd3LHHiJfIgjmZg==} - engines: {node: '>=18.0.0'} + safaridriver@3.0.0: + resolution: {integrity: sha512-NJSsR0tgn5j4fhg7vj4kD5mQ+t2ZRH3GX1jdUYraEjej9j8ZtBXEe4WZh2/89i7S9+GO3cZKWhUisWb7gyjRwA==} + engines: {node: '>=22.19.0'} safe-array-concat@1.1.4: resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} @@ -6646,9 +6592,9 @@ packages: engines: {node: '>=10'} hasBin: true - serialize-error@12.0.0: - resolution: {integrity: sha512-ZYkZLAvKTKQXWuh5XpBw7CdbSzagarX39WyZ2H07CDLC5/KfsRGlIXV8d4+tfqX1M7916mRqR1QfNHSij+c9Pw==} - engines: {node: '>=18'} + serialize-error@13.0.2: + resolution: {integrity: sha512-G+YKwp9I6IvWMe5RlwqxdmTPIcq/G8HK/sU51gdV1XAJznYkRSTB0ph+zB9AfSxG0fx6xrqYA6i9HeIcHFTXow==} + engines: {node: '>=20'} serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} @@ -7000,6 +6946,10 @@ packages: resolution: {integrity: sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==} engines: {node: '>=18'} + test-exclude@8.0.0: + resolution: {integrity: sha512-ZOffsNrXYggvU1mDGHk54I96r26P8SyMjO5slMKSc7+IWmtB/MQKnEC2fP51imB3/pT6YK5cT5E8f+Dd9KdyOQ==} + engines: {node: 20 || >=22} + text-decoder@1.2.7: resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} @@ -7155,10 +7105,6 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - type-fest@4.26.0: resolution: {integrity: sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==} engines: {node: '>=16'} @@ -7167,6 +7113,10 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} + type-fest@5.10.0: + resolution: {integrity: sha512-NoSdpq/WEiAg5sjmBkmV/hfxv6HJH4NqPNrqjtSO5CwRmpsDfaf4begxW34KdJykH/l1yHtwBWQkCRdoXO8mPA==} + engines: {node: '>=20'} + type-fest@5.8.0: resolution: {integrity: sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==} engines: {node: '>=20'} @@ -7221,6 +7171,10 @@ packages: resolution: {integrity: sha512-u4UB2/IrKdU6lFxumHmmo1a3fCQO5tzQllRorfoRS63txhrB7xTpSn1PftwC4qEHkOaqP95fCWW4lJzwErwzhQ==} engines: {node: '>=22.19.0'} + undici@8.12.3: + resolution: {integrity: sha512-+fdndUTwBP86cVjihTp21hZHo7d6oj1c/47XPA3lL8mM0XHs+C4EkcjmgRsFnFk2f/UONGDy9ItBItmXsLOQHw==} + engines: {node: '>=22.19.0'} + unicorn-magic@0.3.0: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} @@ -7404,8 +7358,8 @@ packages: vite: optional: true - vite-plugin-istanbul@7.2.1: - resolution: {integrity: sha512-DSPi4ulvYsjnP44sTI5oriNosbM0E6m3uoCxjdxboTtVzxSkFwcDy3/JnSYKebjr+ZToJwVLTms+2CM0rmbbzQ==} + vite-plugin-istanbul@9.0.1: + resolution: {integrity: sha512-zgcdcqa4r3urX+xqhMQG2uLR2s6IdklQW+acBEtLw6fvUWhuvXswYqxjHAZZ5HCfHEgRs7RH7qIZCklTLRsKLg==} peerDependencies: vite: ^8.0.7 @@ -7526,13 +7480,13 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - webdriver@10.0.2: - resolution: {integrity: sha512-q2eKiapaOyCH2QfVykBjrYznQiL4gjmGakTYVzQqq3Ycqpd2VPOMSkmbxGHFo8+CpO628QwvpxgKvAxA3hpDaA==} - engines: {node: '>=22.19.0'} + webdriver@10.2.0-alpha.100.sha-b38abd894: + resolution: {integrity: sha512-eia4RTIMdTw7BOXRmXD2t9en633rUdJYxC5ALQ27BrauRzYjJBxYMv0vYxCtrmgpqRDqQjCylvWI56qM89cBrQ==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} - webdriverio@10.0.2: - resolution: {integrity: sha512-o+T+DXwsn2e0niAmz9PWUMDwE/8R06euZ4O85faB6fGG9X/uVOom8sloIH+SYc1tI0fjcI34sU9hptrQj9fDdQ==} - engines: {node: '>=22.19.0'} + webdriverio@10.2.0-alpha.100.sha-b38abd894: + resolution: {integrity: sha512-/NWw3PGa5YSGAGHrFxOboIDqkHbw4adTwFZx5gJccNzAZK12um7+qFCfSNKg/cz/PI0xII/A6bSrigOTOj8Qdg==} + engines: {node: '>=22.23.4 <23 || >=24.22.1 <25 || >=26.12.1'} peerDependencies: puppeteer-core: '>=24 <26' peerDependenciesMeta: @@ -7575,6 +7529,11 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} + which-command@0.1.0: + resolution: {integrity: sha512-XZyoF5/5hZtXitIwzrU4NKK+Wtbb9aB9CezUEw2Q0wlYK8NUYQxC1rRXgNueYLtBAJwXIb+/tFVk4dozciNJMA==} + engines: {node: '>=22'} + hasBin: true + which-typed-array@1.1.21: resolution: {integrity: sha512-zbRA8cVm6io/d5W8uIe2hblzN76/Wm3v/yiythQvr+dpBWeqhPSWIDNj4zOyHi4zKbMK6DN34Xsr9jPHJERAEw==} engines: {node: '>= 0.4'} @@ -7588,11 +7547,6 @@ packages: engines: {node: '>= 8'} hasBin: true - which@6.0.1: - resolution: {integrity: sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==} - engines: {node: ^20.17.0 || >=22.9.0} - hasBin: true - why-is-node-running@3.2.1: resolution: {integrity: sha512-Tb2FUhB4vUsGQlfSquQLYkApkuPAFQXGFzxWKHHumVz2dK+X1RUm/HnID4+TfIGYJ1kTcwOaCk/buYCEJr6YjQ==} engines: {node: '>=20.11'} @@ -7612,10 +7566,6 @@ packages: workerpool@6.5.1: resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -7723,14 +7673,6 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.2.2: - resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} - engines: {node: '>=12.20'} - - yoctocolors-cjs@2.1.3: - resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} - engines: {node: '>=18'} - yoctocolors@2.2.0: resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} engines: {node: '>=18'} @@ -7776,20 +7718,20 @@ snapshots: '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.7(supports-color@11.0.0)': + '@babel/core@7.29.7': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.8 '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@11.0.0))(supports-color@11.0.0) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) '@babel/helpers': 7.29.7 '@babel/parser': 7.29.9 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.8(supports-color@11.0.0) + '@babel/traverse': 7.29.8 '@babel/types': 7.29.8 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3(supports-color@11.0.0) + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -7822,19 +7764,19 @@ snapshots: '@babel/helper-globals@7.29.7': {} - '@babel/helper-module-imports@7.29.7(supports-color@11.0.0)': + '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/traverse': 7.29.8(supports-color@11.0.0) + '@babel/traverse': 7.29.8 '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@11.0.0))(supports-color@11.0.0)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) - '@babel/helper-module-imports': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.8(supports-color@11.0.0) + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color @@ -7855,89 +7797,89 @@ snapshots: dependencies: '@babel/types': 7.29.8 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.7(supports-color@11.0.0))': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.7(supports-color@11.0.0))': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.7(supports-color@11.0.0))': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.7(supports-color@11.0.0))': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.29.7(supports-color@11.0.0))': + '@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.7(supports-color@11.0.0))': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.7(supports-color@11.0.0))': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@11.0.0))': + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.7(supports-color@11.0.0))': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.7(supports-color@11.0.0))': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.7(supports-color@11.0.0))': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.7(supports-color@11.0.0))': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.7(supports-color@11.0.0))': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.7(supports-color@11.0.0))': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.7(supports-color@11.0.0))': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.7(supports-color@11.0.0))': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@11.0.0))': + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 '@babel/template@7.29.7': @@ -7946,7 +7888,7 @@ snapshots: '@babel/parser': 7.29.9 '@babel/types': 7.29.8 - '@babel/traverse@7.29.8(supports-color@11.0.0)': + '@babel/traverse@7.29.8': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.8 @@ -7954,7 +7896,7 @@ snapshots: '@babel/parser': 7.29.9 '@babel/template': 7.29.7 '@babel/types': 7.29.8 - debug: 4.4.3(supports-color@11.0.0) + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -8278,7 +8220,7 @@ snapshots: '@cucumber/gherkin@42.0.0': dependencies: - '@cucumber/messages': 34.2.0 + '@cucumber/messages': 34.2.1 '@cucumber/gherkin@42.0.1': dependencies: @@ -8502,17 +8444,17 @@ snapshots: '@esbuild/win32-x64@0.28.2': optional: true - '@eslint-community/eslint-utils@4.10.1(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))': + '@eslint-community/eslint-utils@4.10.1(eslint@10.12.0(jiti@2.7.0))': dependencies: - eslint: 10.12.0(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.12.0(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.23.5(supports-color@11.0.0)': + '@eslint/config-array@0.23.5': dependencies: '@eslint/object-schema': 3.0.5 - debug: 4.4.3(supports-color@11.0.0) + debug: 4.4.3 minimatch: 10.2.6 transitivePeerDependencies: - supports-color @@ -8530,9 +8472,9 @@ snapshots: mdn-data: 2.35.0 source-map-js: 1.2.2 - '@eslint/js@10.0.1(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))': + '@eslint/js@10.0.1(eslint@10.12.0(jiti@2.7.0))': optionalDependencies: - eslint: 10.12.0(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.12.0(jiti@2.7.0) '@eslint/object-schema@3.0.5': {} @@ -8628,128 +8570,122 @@ snapshots: '@iconify/types': 2.0.0 import-meta-resolve: 4.2.0 - '@inquirer/ansi@1.0.2': {} + '@inquirer/ansi@2.0.10': {} - '@inquirer/checkbox@4.3.2(@types/node@26.6.4)': + '@inquirer/checkbox@5.2.8(@types/node@26.6.4)': dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@26.6.4) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@26.6.4) - yoctocolors-cjs: 2.1.3 + '@inquirer/ansi': 2.0.10 + '@inquirer/core': 12.0.6(@types/node@26.6.4) + '@inquirer/figures': 2.0.10 + '@inquirer/type': 4.2.1(@types/node@26.6.4) optionalDependencies: '@types/node': 26.6.4 - '@inquirer/confirm@5.1.21(@types/node@26.6.4)': + '@inquirer/confirm@6.3.5(@types/node@26.6.4)': dependencies: - '@inquirer/core': 10.3.2(@types/node@26.6.4) - '@inquirer/type': 3.0.10(@types/node@26.6.4) + '@inquirer/core': 12.0.6(@types/node@26.6.4) + '@inquirer/type': 4.2.1(@types/node@26.6.4) optionalDependencies: '@types/node': 26.6.4 - '@inquirer/core@10.3.2(@types/node@26.6.4)': + '@inquirer/core@12.0.6(@types/node@26.6.4)': dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@26.6.4) + '@inquirer/ansi': 2.0.10 + '@inquirer/figures': 2.0.10 + '@inquirer/type': 4.2.1(@types/node@26.6.4) cli-width: 4.1.0 - mute-stream: 2.0.0 + fast-wrap-ansi: 0.2.2 + mute-stream: 3.0.0 signal-exit: 4.1.0 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.3 optionalDependencies: '@types/node': 26.6.4 - '@inquirer/editor@4.2.23(@types/node@26.6.4)': + '@inquirer/editor@5.3.6(@types/node@26.6.4)': dependencies: - '@inquirer/core': 10.3.2(@types/node@26.6.4) - '@inquirer/external-editor': 1.0.3(@types/node@26.6.4) - '@inquirer/type': 3.0.10(@types/node@26.6.4) + '@inquirer/core': 12.0.6(@types/node@26.6.4) + '@inquirer/external-editor': 3.0.7(@types/node@26.6.4) + '@inquirer/type': 4.2.1(@types/node@26.6.4) optionalDependencies: '@types/node': 26.6.4 - '@inquirer/expand@4.0.23(@types/node@26.6.4)': + '@inquirer/expand@5.1.8(@types/node@26.6.4)': dependencies: - '@inquirer/core': 10.3.2(@types/node@26.6.4) - '@inquirer/type': 3.0.10(@types/node@26.6.4) - yoctocolors-cjs: 2.1.3 + '@inquirer/core': 12.0.6(@types/node@26.6.4) + '@inquirer/type': 4.2.1(@types/node@26.6.4) optionalDependencies: '@types/node': 26.6.4 - '@inquirer/external-editor@1.0.3(@types/node@26.6.4)': + '@inquirer/external-editor@3.0.7(@types/node@26.6.4)': dependencies: chardet: 2.2.0 iconv-lite: 0.7.3 optionalDependencies: '@types/node': 26.6.4 - '@inquirer/figures@1.0.15': {} + '@inquirer/figures@2.0.10': {} - '@inquirer/input@4.3.1(@types/node@26.6.4)': + '@inquirer/input@5.1.9(@types/node@26.6.4)': dependencies: - '@inquirer/core': 10.3.2(@types/node@26.6.4) - '@inquirer/type': 3.0.10(@types/node@26.6.4) + '@inquirer/core': 12.0.6(@types/node@26.6.4) + '@inquirer/type': 4.2.1(@types/node@26.6.4) optionalDependencies: '@types/node': 26.6.4 - '@inquirer/number@3.0.23(@types/node@26.6.4)': + '@inquirer/number@4.2.6(@types/node@26.6.4)': dependencies: - '@inquirer/core': 10.3.2(@types/node@26.6.4) - '@inquirer/type': 3.0.10(@types/node@26.6.4) + '@inquirer/core': 12.0.6(@types/node@26.6.4) + '@inquirer/type': 4.2.1(@types/node@26.6.4) optionalDependencies: '@types/node': 26.6.4 - '@inquirer/password@4.0.23(@types/node@26.6.4)': + '@inquirer/password@5.2.5(@types/node@26.6.4)': dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@26.6.4) - '@inquirer/type': 3.0.10(@types/node@26.6.4) + '@inquirer/ansi': 2.0.10 + '@inquirer/core': 12.0.6(@types/node@26.6.4) + '@inquirer/type': 4.2.1(@types/node@26.6.4) optionalDependencies: '@types/node': 26.6.4 - '@inquirer/prompts@7.10.1(@types/node@26.6.4)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@26.6.4) - '@inquirer/confirm': 5.1.21(@types/node@26.6.4) - '@inquirer/editor': 4.2.23(@types/node@26.6.4) - '@inquirer/expand': 4.0.23(@types/node@26.6.4) - '@inquirer/input': 4.3.1(@types/node@26.6.4) - '@inquirer/number': 3.0.23(@types/node@26.6.4) - '@inquirer/password': 4.0.23(@types/node@26.6.4) - '@inquirer/rawlist': 4.1.11(@types/node@26.6.4) - '@inquirer/search': 3.2.2(@types/node@26.6.4) - '@inquirer/select': 4.4.2(@types/node@26.6.4) + '@inquirer/prompts@8.7.5(@types/node@26.6.4)': + dependencies: + '@inquirer/checkbox': 5.2.8(@types/node@26.6.4) + '@inquirer/confirm': 6.3.5(@types/node@26.6.4) + '@inquirer/editor': 5.3.6(@types/node@26.6.4) + '@inquirer/expand': 5.1.8(@types/node@26.6.4) + '@inquirer/input': 5.1.9(@types/node@26.6.4) + '@inquirer/number': 4.2.6(@types/node@26.6.4) + '@inquirer/password': 5.2.5(@types/node@26.6.4) + '@inquirer/rawlist': 5.3.8(@types/node@26.6.4) + '@inquirer/search': 4.3.6(@types/node@26.6.4) + '@inquirer/select': 5.2.8(@types/node@26.6.4) optionalDependencies: '@types/node': 26.6.4 - '@inquirer/rawlist@4.1.11(@types/node@26.6.4)': + '@inquirer/rawlist@5.3.8(@types/node@26.6.4)': dependencies: - '@inquirer/core': 10.3.2(@types/node@26.6.4) - '@inquirer/type': 3.0.10(@types/node@26.6.4) - yoctocolors-cjs: 2.1.3 + '@inquirer/core': 12.0.6(@types/node@26.6.4) + '@inquirer/type': 4.2.1(@types/node@26.6.4) optionalDependencies: '@types/node': 26.6.4 - '@inquirer/search@3.2.2(@types/node@26.6.4)': + '@inquirer/search@4.3.6(@types/node@26.6.4)': dependencies: - '@inquirer/core': 10.3.2(@types/node@26.6.4) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@26.6.4) - yoctocolors-cjs: 2.1.3 + '@inquirer/core': 12.0.6(@types/node@26.6.4) + '@inquirer/figures': 2.0.10 + '@inquirer/type': 4.2.1(@types/node@26.6.4) optionalDependencies: '@types/node': 26.6.4 - '@inquirer/select@4.4.2(@types/node@26.6.4)': + '@inquirer/select@5.2.8(@types/node@26.6.4)': dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@26.6.4) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@26.6.4) - yoctocolors-cjs: 2.1.3 + '@inquirer/ansi': 2.0.10 + '@inquirer/core': 12.0.6(@types/node@26.6.4) + '@inquirer/figures': 2.0.10 + '@inquirer/type': 4.2.1(@types/node@26.6.4) optionalDependencies: '@types/node': 26.6.4 - '@inquirer/type@3.0.10(@types/node@26.6.4)': + '@inquirer/type@4.2.1(@types/node@26.6.4)': optionalDependencies: '@types/node': 26.6.4 @@ -8781,13 +8717,13 @@ snapshots: jest-util: 30.5.1 slash: 3.0.0 - '@jest/core@30.5.2(supports-color@11.0.0)(ts-node@10.9.2(@swc/core@1.16.13)(@swc/wasm@1.16.13)(@types/node@26.6.4)(typescript@6.0.3))': + '@jest/core@30.5.2(ts-node@10.9.2(@swc/core@1.16.13)(@swc/wasm@1.16.13)(@types/node@26.6.4)(typescript@6.0.3))': dependencies: '@jest/console': 30.5.2 '@jest/pattern': 30.5.0 - '@jest/reporters': 30.5.2(supports-color@11.0.0) + '@jest/reporters': 30.5.2 '@jest/test-result': 30.5.2 - '@jest/transform': 30.5.2(supports-color@11.0.0) + '@jest/transform': 30.5.2 '@jest/types': 30.5.1 '@types/node': 26.6.4 ansi-escapes: 4.3.2 @@ -8797,15 +8733,15 @@ snapshots: fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 jest-changed-files: 30.5.1 - jest-config: 30.5.2(@types/node@26.6.4)(supports-color@11.0.0)(ts-node@10.9.2(@swc/core@1.16.13)(@swc/wasm@1.16.13)(@types/node@26.6.4)(typescript@6.0.3)) + jest-config: 30.5.2(@types/node@26.6.4)(ts-node@10.9.2(@swc/core@1.16.13)(@swc/wasm@1.16.13)(@types/node@26.6.4)(typescript@6.0.3)) jest-haste-map: 30.5.1 jest-message-util: 30.5.1 jest-regex-util: 30.5.0 jest-resolve: 30.5.1 - jest-resolve-dependencies: 30.5.2(supports-color@11.0.0) - jest-runner: 30.5.2(supports-color@11.0.0) - jest-runtime: 30.5.2(supports-color@11.0.0) - jest-snapshot: 30.5.2(supports-color@11.0.0) + jest-resolve-dependencies: 30.5.2 + jest-runner: 30.5.2 + jest-runtime: 30.5.2 + jest-snapshot: 30.5.2 jest-util: 30.5.1 jest-validate: 30.5.1 jest-watcher: 30.5.2 @@ -8830,10 +8766,10 @@ snapshots: dependencies: '@jest/get-type': 30.5.0 - '@jest/expect@30.5.2(supports-color@11.0.0)': + '@jest/expect@30.5.2': dependencies: expect: 30.5.2 - jest-snapshot: 30.5.2(supports-color@11.0.0) + jest-snapshot: 30.5.2 transitivePeerDependencies: - supports-color @@ -8848,10 +8784,10 @@ snapshots: '@jest/get-type@30.5.0': {} - '@jest/globals@30.5.2(supports-color@11.0.0)': + '@jest/globals@30.5.2': dependencies: '@jest/environment': 30.5.2 - '@jest/expect': 30.5.2(supports-color@11.0.0) + '@jest/expect': 30.5.2 '@jest/types': 30.5.1 jest-mock: 30.5.2 transitivePeerDependencies: @@ -8862,12 +8798,12 @@ snapshots: '@types/node': 26.6.4 jest-regex-util: 30.5.0 - '@jest/reporters@30.5.2(supports-color@11.0.0)': + '@jest/reporters@30.5.2': dependencies: '@bcoe/v8-coverage': 0.2.3 '@jest/console': 30.5.2 '@jest/test-result': 30.5.2 - '@jest/transform': 30.5.2(supports-color@11.0.0) + '@jest/transform': 30.5.2 '@jest/types': 30.5.1 '@jridgewell/trace-mapping': 0.3.31 '@types/node': 26.6.4 @@ -8877,9 +8813,9 @@ snapshots: glob: 13.0.6 graceful-fs: 4.2.11 istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.3(supports-color@11.0.0) + istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6(supports-color@11.0.0) + istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.2.0 jest-message-util: 30.5.1 jest-util: 30.5.1 @@ -8922,12 +8858,12 @@ snapshots: jest-haste-map: 30.5.1 slash: 3.0.0 - '@jest/transform@30.5.2(supports-color@11.0.0)': + '@jest/transform@30.5.2': dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 '@jest/types': 30.5.1 '@jridgewell/trace-mapping': 0.3.31 - babel-plugin-istanbul: 8.0.0(supports-color@11.0.0) + babel-plugin-istanbul: 8.0.0 chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 @@ -9668,10 +9604,6 @@ snapshots: dependencies: '@babel/types': 7.29.8 - '@types/babel__generator@7.6.8': - dependencies: - '@babel/types': 7.29.8 - '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.29.9 @@ -9727,7 +9659,7 @@ snapshots: '@types/shell-quote@1.7.5': {} - '@types/sinonjs__fake-timers@8.1.5': {} + '@types/sinonjs__fake-timers@15.0.1': {} '@types/split2@4.2.3': dependencies: @@ -9741,8 +9673,6 @@ snapshots: '@types/whatwg-mimetype@3.0.2': {} - '@types/which@2.0.2': {} - '@types/ws@8.18.2': dependencies: '@types/node': 26.6.4 @@ -9757,15 +9687,15 @@ snapshots: dependencies: '@types/node': 26.6.4 - '@typescript-eslint/eslint-plugin@8.71.0(@typescript-eslint/parser@8.71.0(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)(typescript@6.0.3))(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.71.0(@typescript-eslint/parser@8.71.0(eslint@10.12.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.12.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.71.0(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.71.0(eslint@10.12.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.71.0 - '@typescript-eslint/type-utils': 8.71.0(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.71.0(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)(typescript@6.0.3) + '@typescript-eslint/type-utils': 8.71.0(eslint@10.12.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.71.0(eslint@10.12.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.71.0 - eslint: 10.12.0(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.12.0(jiti@2.7.0) ignore: 7.0.11 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -9773,23 +9703,23 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.71.0(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)(typescript@6.0.3)': + '@typescript-eslint/parser@8.71.0(eslint@10.12.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.71.0 '@typescript-eslint/types': 8.71.0 - '@typescript-eslint/typescript-estree': 8.71.0(supports-color@11.0.0)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.71.0(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.71.0 - debug: 4.4.3(supports-color@11.0.0) - eslint: 10.12.0(jiti@2.7.0)(supports-color@11.0.0) + debug: 4.4.3 + eslint: 10.12.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.71.0(supports-color@11.0.0)(typescript@6.0.3)': + '@typescript-eslint/project-service@8.71.0(typescript@6.0.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.71.0(typescript@6.0.3) '@typescript-eslint/types': 8.71.0 - debug: 4.4.3(supports-color@11.0.0) + debug: 4.4.3 typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -9803,13 +9733,13 @@ snapshots: dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.71.0(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.71.0(eslint@10.12.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.71.0 - '@typescript-eslint/typescript-estree': 8.71.0(supports-color@11.0.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.71.0(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)(typescript@6.0.3) - debug: 4.4.3(supports-color@11.0.0) - eslint: 10.12.0(jiti@2.7.0)(supports-color@11.0.0) + '@typescript-eslint/typescript-estree': 8.71.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.71.0(eslint@10.12.0(jiti@2.7.0))(typescript@6.0.3) + debug: 4.4.3 + eslint: 10.12.0(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: @@ -9817,13 +9747,13 @@ snapshots: '@typescript-eslint/types@8.71.0': {} - '@typescript-eslint/typescript-estree@8.71.0(supports-color@11.0.0)(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.71.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.71.0(supports-color@11.0.0)(typescript@6.0.3) + '@typescript-eslint/project-service': 8.71.0(typescript@6.0.3) '@typescript-eslint/tsconfig-utils': 8.71.0(typescript@6.0.3) '@typescript-eslint/types': 8.71.0 '@typescript-eslint/visitor-keys': 8.71.0 - debug: 4.4.3(supports-color@11.0.0) + debug: 4.4.3 minimatch: 10.2.6 semver: 7.8.5 tinyglobby: 0.2.17 @@ -9832,13 +9762,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.71.0(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)(typescript@6.0.3)': + '@typescript-eslint/utils@8.71.0(eslint@10.12.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.12.0(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.71.0 '@typescript-eslint/types': 8.71.0 - '@typescript-eslint/typescript-estree': 8.71.0(supports-color@11.0.0)(typescript@6.0.3) - eslint: 10.12.0(jiti@2.7.0)(supports-color@11.0.0) + '@typescript-eslint/typescript-estree': 8.71.0(typescript@6.0.3) + eslint: 10.12.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -9930,7 +9860,7 @@ snapshots: obug: 2.2.1 std-env: 4.3.0 tinyrainbow: 3.2.0 - vitest: 5.0.3(@types/node@26.6.4)(@vitest/coverage-v8@5.0.3)(happy-dom@20.14.5)(jsdom@24.1.3(supports-color@11.0.0))(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) + vitest: 5.0.3(@types/node@26.6.4)(@vitest/coverage-v8@5.0.3)(happy-dom@20.14.5)(jsdom@24.1.3)(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) '@vitest/istanbul-lib-coverage@1.0.2': {} @@ -9978,11 +9908,12 @@ snapshots: path-browserify: 1.0.1 vscode-uri: 3.2.0 - '@wdio/allure-reporter@10.0.1': + '@wdio/allure-reporter@10.2.0-alpha.100.sha-b38abd894': dependencies: '@types/node': 26.6.4 - '@wdio/reporter': 10.0.1 - '@wdio/types': 10.0.1 + '@wdio/logger': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/reporter': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/types': 10.2.0-alpha.100.sha-b38abd894 allure-js-commons: 3.13.0 csv-stringify: 6.9.0 html-entities: 2.6.0 @@ -9990,37 +9921,37 @@ snapshots: transitivePeerDependencies: - allure-playwright - '@wdio/browser-runner@10.0.2(@types/node@26.6.4)(esbuild@0.14.54)(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)))(jiti@2.7.0)(magicast@0.5.5)(rollup@4.64.0)(supports-color@11.0.0)(tsx@4.23.15)(webdriver@10.0.2(supports-color@11.0.0)(yauzl@2.10.0))(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0))(yaml@2.9.1)(yauzl@2.10.0)': + '@wdio/browser-runner@10.2.0-alpha.100.sha-b38abd894(@types/node@26.6.4)(esbuild@0.28.2)(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(jiti@2.7.0)(magicast@0.5.5)(rollup@4.64.0)(tsx@4.23.15)(webdriver@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0))(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0))(yaml@2.9.1)(yauzl@2.10.0)': dependencies: '@originjs/vite-plugin-commonjs': 1.0.3 '@vitest/spy': 5.0.3 - '@wdio/globals': 10.0.2(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)))(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)) - '@wdio/local-runner': 10.0.2(supports-color@11.0.0)(tsx@4.23.15)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0))(yauzl@2.10.0) - '@wdio/logger': 10.0.0 - '@wdio/mocha-framework': 10.0.1(supports-color@11.0.0)(yauzl@2.10.0) - '@wdio/protocols': 10.0.2 - '@wdio/runner': 10.0.2(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)))(supports-color@11.0.0)(tsx@4.23.15)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0))(yauzl@2.10.0) - '@wdio/types': 10.0.1 - '@wdio/utils': 10.0.1(supports-color@11.0.0)(yauzl@2.10.0) + '@wdio/globals': 10.2.0-alpha.100.sha-b38abd894(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)) + '@wdio/local-runner': 10.2.0-alpha.100.sha-b38abd894(tsx@4.23.15)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0))(yauzl@2.10.0) + '@wdio/logger': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/mocha-framework': 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) + '@wdio/protocols': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/runner': 10.2.0-alpha.100.sha-b38abd894(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(tsx@4.23.15)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0))(yauzl@2.10.0) + '@wdio/types': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/utils': 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) deepmerge-ts: 8.0.2 expect: 30.5.2 - expect-webdriverio: 8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)) + expect-webdriverio: 8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)) get-port: 7.2.0 import-meta-resolve: 4.2.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6(supports-color@11.0.0) + istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.2.0 mlly: 1.8.2 - modern-node-polyfills: 1.0.0(esbuild@0.14.54)(rollup@4.64.0) + modern-node-polyfills: 1.0.0(esbuild@0.28.2)(rollup@4.64.0) recast: 0.24.0 safe-stringify: 1.3.0 source-map-support: 0.5.21 - vite: 8.3.5(@types/node@26.6.4)(esbuild@0.14.54)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) - vite-plugin-istanbul: 7.2.1(supports-color@11.0.0)(vite@8.3.5(@types/node@26.6.4)(esbuild@0.14.54)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) - vite-plugin-top-level-await: 1.6.0(rollup@4.64.0)(vite@8.3.5(@types/node@26.6.4)(esbuild@0.14.54)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) - webdriver: 10.0.2(supports-color@11.0.0)(yauzl@2.10.0) - webdriverio: 10.0.2(supports-color@11.0.0)(yauzl@2.10.0) + vite: 8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) + vite-plugin-istanbul: 9.0.1(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) + vite-plugin-top-level-await: 1.6.0(rollup@4.64.0)(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) + webdriver: 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) + webdriverio: 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) optionalDependencies: '@nuxt/kit': 3.21.11(magicast@0.5.5) '@stencil/core': 4.45.1 @@ -10037,6 +9968,7 @@ snapshots: - bufferutil - esbuild - jiti + - kerberos - less - magicast - proxy-agent @@ -10054,67 +9986,29 @@ snapshots: - yaml - yauzl - '@wdio/cli@10.0.2(@types/node@26.6.4)(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)))(supports-color@11.0.0)(yauzl@2.10.0)': - dependencies: - '@vitest/snapshot': 5.0.3 - '@wdio/config': 10.0.1(supports-color@11.0.0)(yauzl@2.10.0) - '@wdio/globals': 10.0.2(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)))(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)) - '@wdio/logger': 10.0.0 - '@wdio/protocols': 10.0.2 - '@wdio/session': 10.0.2(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)))(supports-color@11.0.0)(tsx@4.23.15)(yauzl@2.10.0) - '@wdio/types': 10.0.1 - '@wdio/utils': 10.0.1(supports-color@11.0.0)(yauzl@2.10.0) - async-exit-hook: 2.0.1 - chalk: 5.6.2 - chokidar: 4.0.3 - create-wdio: 10.0.2(@types/node@26.6.4) - dotenv: 17.4.2 - import-meta-resolve: 4.2.0 - lodash.flattendeep: 4.4.0 - lodash.pickby: 4.6.0 - lodash.union: 4.6.0 - read-pkg-up: 10.1.0 - tsx: 4.23.15 - webdriverio: 10.0.2(supports-color@11.0.0)(yauzl@2.10.0) - yargs: 18.2.0 - transitivePeerDependencies: - - '@types/node' - - '@wdio/electron-service' - - '@wdio/visual-service' - - appium - - bare-abort-controller - - bare-buffer - - bufferutil - - expect-webdriverio - - proxy-agent - - puppeteer-core - - react-native-b4a - - supports-color - - utf-8-validate - - yauzl - - '@wdio/cli@10.0.2(@types/node@26.6.4)(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@5.5.0)(yauzl@2.10.0)))(supports-color@5.5.0)(yauzl@2.10.0)': + '@wdio/cli@10.2.0-alpha.100.sha-b38abd894(@types/node@26.6.4)(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(yauzl@2.10.0)': dependencies: '@vitest/snapshot': 5.0.3 - '@wdio/config': 10.0.1(supports-color@5.5.0)(yauzl@2.10.0) - '@wdio/globals': 10.0.2(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@5.5.0)(yauzl@2.10.0)))(webdriverio@10.0.2(supports-color@5.5.0)(yauzl@2.10.0)) - '@wdio/logger': 10.0.0 - '@wdio/protocols': 10.0.2 - '@wdio/session': 10.0.2(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@5.5.0)(yauzl@2.10.0)))(supports-color@5.5.0)(tsx@4.23.15)(yauzl@2.10.0) - '@wdio/types': 10.0.1 - '@wdio/utils': 10.0.1(supports-color@5.5.0)(yauzl@2.10.0) + '@wdio/config': 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) + '@wdio/globals': 10.2.0-alpha.100.sha-b38abd894(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)) + '@wdio/logger': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/protocols': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/session': 10.2.0-alpha.100.sha-b38abd894(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(tsx@4.23.15)(yauzl@2.10.0) + '@wdio/types': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/utils': 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) async-exit-hook: 2.0.1 - chalk: 5.6.2 - chokidar: 4.0.3 - create-wdio: 10.0.2(@types/node@26.6.4) - dotenv: 17.4.2 + chalk: 6.0.1 + chokidar: 6.0.0 + create-wdio: 10.2.0-alpha.100.sha-b38abd894(@types/node@26.6.4) + dotenv: 18.0.9 import-meta-resolve: 4.2.0 lodash.flattendeep: 4.4.0 lodash.pickby: 4.6.0 lodash.union: 4.6.0 - read-pkg-up: 10.1.0 + minimatch: 10.2.6 + read-package-up: 12.0.0 tsx: 4.23.15 - webdriverio: 10.0.2(supports-color@5.5.0)(yauzl@2.10.0) + webdriverio: 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) yargs: 18.2.0 transitivePeerDependencies: - '@types/node' @@ -10125,6 +10019,7 @@ snapshots: - bare-buffer - bufferutil - expect-webdriverio + - kerberos - proxy-agent - puppeteer-core - react-native-b4a @@ -10132,27 +10027,13 @@ snapshots: - utf-8-validate - yauzl - '@wdio/config@10.0.1(supports-color@11.0.0)(yauzl@2.10.0)': - dependencies: - '@wdio/logger': 10.0.0 - '@wdio/types': 10.0.1 - '@wdio/utils': 10.0.1(supports-color@11.0.0)(yauzl@2.10.0) - deepmerge-ts: 8.0.2 - glob: 10.5.0 - import-meta-resolve: 4.2.0 - jiti: 2.7.0 - transitivePeerDependencies: - - proxy-agent - - supports-color - - yauzl - - '@wdio/config@10.0.1(supports-color@5.5.0)(yauzl@2.10.0)': + '@wdio/config@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)': dependencies: - '@wdio/logger': 10.0.0 - '@wdio/types': 10.0.1 - '@wdio/utils': 10.0.1(supports-color@5.5.0)(yauzl@2.10.0) + '@wdio/logger': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/types': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/utils': 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) deepmerge-ts: 8.0.2 - glob: 10.5.0 + glob: 13.0.6 import-meta-resolve: 4.2.0 jiti: 2.7.0 transitivePeerDependencies: @@ -10160,16 +10041,16 @@ snapshots: - supports-color - yauzl - '@wdio/cucumber-framework@10.0.1(supports-color@11.0.0)(yauzl@2.10.0)': + '@wdio/cucumber-framework@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)': dependencies: '@cucumber/cucumber': 13.2.1 '@cucumber/gherkin': 42.0.1 '@cucumber/messages': 34.2.1 '@types/node': 26.6.4 - '@wdio/logger': 10.0.0 - '@wdio/types': 10.0.1 - '@wdio/utils': 10.0.1(supports-color@11.0.0)(yauzl@2.10.0) - glob: 10.5.0 + '@wdio/logger': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/types': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/utils': 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) + glob: 13.0.6 import-meta-resolve: 4.2.0 is-glob: 4.0.3 transitivePeerDependencies: @@ -10177,38 +10058,33 @@ snapshots: - supports-color - yauzl - '@wdio/display-server@10.0.1': - dependencies: - '@wdio/logger': 10.0.0 - '@wdio/types': 10.0.1 - - '@wdio/dot-reporter@10.0.1': + '@wdio/display-server@10.2.0-alpha.100.sha-b38abd894': dependencies: - '@wdio/reporter': 10.0.1 - '@wdio/types': 10.0.1 - chalk: 5.6.2 + '@wdio/logger': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/types': 10.2.0-alpha.100.sha-b38abd894 - '@wdio/globals@10.0.2(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)))(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0))': + '@wdio/dot-reporter@10.2.0-alpha.100.sha-b38abd894': dependencies: - expect-webdriverio: 8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)) - webdriverio: 10.0.2(supports-color@11.0.0)(yauzl@2.10.0) + '@wdio/reporter': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/types': 10.2.0-alpha.100.sha-b38abd894 + chalk: 6.0.1 - '@wdio/globals@10.0.2(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@5.5.0)(yauzl@2.10.0)))(webdriverio@10.0.2(supports-color@5.5.0)(yauzl@2.10.0))': + '@wdio/globals@10.2.0-alpha.100.sha-b38abd894(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0))': dependencies: - expect-webdriverio: 8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@5.5.0)(yauzl@2.10.0)) - webdriverio: 10.0.2(supports-color@5.5.0)(yauzl@2.10.0) + expect-webdriverio: 8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)) + webdriverio: 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) - '@wdio/local-runner@10.0.2(supports-color@11.0.0)(tsx@4.23.15)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0))(yauzl@2.10.0)': + '@wdio/local-runner@10.2.0-alpha.100.sha-b38abd894(tsx@4.23.15)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0))(yauzl@2.10.0)': dependencies: '@types/node': 26.6.4 '@types/split2': 4.2.3 - '@wdio/display-server': 10.0.1 - '@wdio/logger': 10.0.0 - '@wdio/repl': 10.0.0 - '@wdio/runner': 10.0.2(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)))(supports-color@11.0.0)(tsx@4.23.15)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0))(yauzl@2.10.0) - '@wdio/types': 10.0.1 - exit-hook: 4.0.0 - expect-webdriverio: 8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)) + '@wdio/display-server': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/logger': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/repl': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/runner': 10.2.0-alpha.100.sha-b38abd894(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(tsx@4.23.15)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0))(yauzl@2.10.0) + '@wdio/types': 10.2.0-alpha.100.sha-b38abd894 + exit-hook: 5.1.0 + expect-webdriverio: 8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)) split2: 4.2.0 stream-buffers: 3.0.3 transitivePeerDependencies: @@ -10218,6 +10094,7 @@ snapshots: - bare-abort-controller - bare-buffer - bufferutil + - kerberos - proxy-agent - puppeteer-core - react-native-b4a @@ -10227,62 +10104,54 @@ snapshots: - webdriverio - yauzl - '@wdio/logger@10.0.0': - dependencies: - chalk: 5.6.2 - loglevel: 1.9.2 - loglevel-plugin-prefix: 0.8.4 - safe-regex2: 5.1.1 - strip-ansi: 7.2.0 - - '@wdio/logger@9.29.1': + '@wdio/logger@10.2.0-alpha.100.sha-b38abd894': dependencies: - chalk: 5.6.2 + chalk: 6.0.1 loglevel: 1.9.2 loglevel-plugin-prefix: 0.8.4 safe-regex2: 5.1.1 strip-ansi: 7.2.0 - '@wdio/mocha-framework@10.0.1(supports-color@11.0.0)(yauzl@2.10.0)': + '@wdio/mocha-framework@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)': dependencies: '@types/mocha': 10.0.10 '@types/node': 26.6.4 - '@wdio/logger': 10.0.0 - '@wdio/types': 10.0.1 - '@wdio/utils': 10.0.1(supports-color@11.0.0)(yauzl@2.10.0) + '@wdio/logger': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/types': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/utils': 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) mocha: 12.0.3 transitivePeerDependencies: - proxy-agent - supports-color - yauzl - '@wdio/protocols@10.0.2': {} + '@wdio/protocols@10.2.0-alpha.100.sha-b38abd894': {} - '@wdio/repl@10.0.0': + '@wdio/repl@10.2.0-alpha.100.sha-b38abd894': dependencies: '@types/node': 26.6.4 - '@wdio/reporter@10.0.1': + '@wdio/reporter@10.2.0-alpha.100.sha-b38abd894': dependencies: '@types/node': 26.6.4 - '@wdio/types': 10.0.1 - diff: 8.0.4 + '@wdio/types': 10.2.0-alpha.100.sha-b38abd894 + diff: 9.0.0 object-inspect: 1.13.4 - '@wdio/runner@10.0.2(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)))(supports-color@11.0.0)(tsx@4.23.15)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0))(yauzl@2.10.0)': + '@wdio/runner@10.2.0-alpha.100.sha-b38abd894(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(tsx@4.23.15)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0))(yauzl@2.10.0)': dependencies: '@types/node': 26.6.4 - '@wdio/config': 10.0.1(supports-color@11.0.0)(yauzl@2.10.0) - '@wdio/dot-reporter': 10.0.1 - '@wdio/globals': 10.0.2(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)))(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)) - '@wdio/logger': 10.0.0 - '@wdio/session': 10.0.2(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)))(supports-color@11.0.0)(tsx@4.23.15)(yauzl@2.10.0) - '@wdio/types': 10.0.1 - '@wdio/utils': 10.0.1(supports-color@11.0.0)(yauzl@2.10.0) + '@wdio/config': 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) + '@wdio/dot-reporter': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/globals': 10.2.0-alpha.100.sha-b38abd894(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)) + '@wdio/logger': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/session': 10.2.0-alpha.100.sha-b38abd894(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(tsx@4.23.15)(yauzl@2.10.0) + '@wdio/types': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/utils': 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) deepmerge-ts: 8.0.2 - expect-webdriverio: 8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)) - webdriver: 10.0.2(supports-color@11.0.0)(yauzl@2.10.0) - webdriverio: 10.0.2(supports-color@11.0.0)(yauzl@2.10.0) + expect-webdriverio: 8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)) + webdriver: 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) + webdriverio: 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) transitivePeerDependencies: - '@wdio/electron-service' - '@wdio/visual-service' @@ -10290,6 +10159,7 @@ snapshots: - bare-abort-controller - bare-buffer - bufferutil + - kerberos - proxy-agent - puppeteer-core - react-native-b4a @@ -10298,29 +10168,30 @@ snapshots: - utf-8-validate - yauzl - '@wdio/session@10.0.2(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)))(supports-color@11.0.0)(tsx@4.23.15)(yauzl@2.10.0)': + '@wdio/session@10.2.0-alpha.100.sha-b38abd894(expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)))(tsx@4.23.15)(yauzl@2.10.0)': dependencies: '@types/node': 26.6.4 - '@wdio/config': 10.0.1(supports-color@11.0.0)(yauzl@2.10.0) - '@wdio/display-server': 10.0.1 - '@wdio/logger': 10.0.0 - '@wdio/snapshot': 10.0.2(supports-color@11.0.0)(yauzl@2.10.0) - '@wdio/types': 10.0.1 - '@wdio/utils': 10.0.1(supports-color@11.0.0)(yauzl@2.10.0) + '@wdio/config': 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) + '@wdio/display-server': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/logger': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/snapshot': 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) + '@wdio/types': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/utils': 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) acorn: 8.18.0 get-port: 7.2.0 image-size: 2.0.4 picomatch: 4.0.7 semver: 7.8.5 - webdriverio: 10.0.2(supports-color@11.0.0)(yauzl@2.10.0) + webdriverio: 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) yargs: 18.2.0 optionalDependencies: - expect-webdriverio: 8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)) + expect-webdriverio: 8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)) tsx: 4.23.15 transitivePeerDependencies: - bare-abort-controller - bare-buffer - bufferutil + - kerberos - proxy-agent - puppeteer-core - react-native-b4a @@ -10328,29 +10199,15 @@ snapshots: - utf-8-validate - yauzl - '@wdio/session@10.0.2(expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@5.5.0)(yauzl@2.10.0)))(supports-color@5.5.0)(tsx@4.23.15)(yauzl@2.10.0)': + '@wdio/snapshot@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)': dependencies: - '@types/node': 26.6.4 - '@wdio/config': 10.0.1(supports-color@5.5.0)(yauzl@2.10.0) - '@wdio/display-server': 10.0.1 - '@wdio/logger': 10.0.0 - '@wdio/snapshot': 10.0.2(supports-color@5.5.0)(yauzl@2.10.0) - '@wdio/types': 10.0.1 - '@wdio/utils': 10.0.1(supports-color@5.5.0)(yauzl@2.10.0) - acorn: 8.18.0 - get-port: 7.2.0 - image-size: 2.0.4 - picomatch: 4.0.7 - semver: 7.8.5 - webdriverio: 10.0.2(supports-color@5.5.0)(yauzl@2.10.0) - yargs: 18.2.0 - optionalDependencies: - expect-webdriverio: 8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@5.5.0)(yauzl@2.10.0)) - tsx: 4.23.15 + '@wdio/utils': 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) + webdriverio: 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) transitivePeerDependencies: - bare-abort-controller - bare-buffer - bufferutil + - kerberos - proxy-agent - puppeteer-core - react-native-b4a @@ -10358,91 +10215,37 @@ snapshots: - utf-8-validate - yauzl - '@wdio/snapshot@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)': + '@wdio/spec-reporter@10.2.0-alpha.100.sha-b38abd894': dependencies: - '@wdio/utils': 10.0.1(supports-color@11.0.0)(yauzl@2.10.0) - webdriverio: 10.0.2(supports-color@11.0.0)(yauzl@2.10.0) - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - bufferutil - - proxy-agent - - puppeteer-core - - react-native-b4a - - supports-color - - utf-8-validate - - yauzl - - '@wdio/snapshot@10.0.2(supports-color@5.5.0)(yauzl@2.10.0)': - dependencies: - '@wdio/utils': 10.0.1(supports-color@5.5.0)(yauzl@2.10.0) - webdriverio: 10.0.2(supports-color@5.5.0)(yauzl@2.10.0) - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - bufferutil - - proxy-agent - - puppeteer-core - - react-native-b4a - - supports-color - - utf-8-validate - - yauzl - - '@wdio/spec-reporter@10.0.1': - dependencies: - '@wdio/reporter': 10.0.1 - '@wdio/types': 10.0.1 - chalk: 5.6.2 - easy-table: 1.2.0 - pretty-ms: 9.3.1 - - '@wdio/types@10.0.1': - dependencies: - '@types/node': 26.6.4 - - '@wdio/utils@10.0.1(supports-color@11.0.0)(yauzl@2.10.0)': - dependencies: - '@puppeteer/browsers': 3.2.4(yauzl@2.10.0) - '@types/split2': 4.2.3 - '@wdio/logger': 10.0.0 - '@wdio/types': 10.0.1 - aria-query: 5.3.2 - decamelize: 6.0.1 - deepmerge-ts: 8.0.2 - edgedriver: 7.0.0(supports-color@11.0.0) - electron-to-chromium: 1.5.443 - geckodriver: 7.0.0(supports-color@11.0.0) - get-port: 7.2.0 - import-meta-resolve: 4.2.0 - locate-app: 2.5.0 - mitt: 3.0.1 - safaridriver: 2.0.0 - split2: 4.2.0 - wait-port: 1.1.0(supports-color@11.0.0) - transitivePeerDependencies: - - proxy-agent - - supports-color - - yauzl - - '@wdio/utils@10.0.1(supports-color@5.5.0)(yauzl@2.10.0)': - dependencies: - '@puppeteer/browsers': 3.2.4(yauzl@2.10.0) - '@types/split2': 4.2.3 - '@wdio/logger': 10.0.0 - '@wdio/types': 10.0.1 - aria-query: 5.3.2 - decamelize: 6.0.1 - deepmerge-ts: 8.0.2 - edgedriver: 7.0.0(supports-color@5.5.0) - electron-to-chromium: 1.5.443 - geckodriver: 7.0.0(supports-color@5.5.0) - get-port: 7.2.0 - import-meta-resolve: 4.2.0 - locate-app: 2.5.0 - mitt: 3.0.1 - safaridriver: 2.0.0 - split2: 4.2.0 - wait-port: 1.1.0(supports-color@5.5.0) + '@wdio/reporter': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/types': 10.2.0-alpha.100.sha-b38abd894 + chalk: 6.0.1 + easy-table: 1.2.0 + pretty-ms: 10.0.0 + + '@wdio/types@10.2.0-alpha.100.sha-b38abd894': + dependencies: + '@types/node': 26.6.4 + + '@wdio/utils@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)': + dependencies: + '@puppeteer/browsers': 3.2.4(yauzl@2.10.0) + '@types/split2': 4.2.3 + '@wdio/logger': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/types': 10.2.0-alpha.100.sha-b38abd894 + aria-query: 5.3.2 + decamelize: 7.0.0 + deepmerge-ts: 8.0.2 + edgedriver: 8.0.0(@wdio/logger@10.2.0-alpha.100.sha-b38abd894) + electron-to-chromium: 1.5.443 + geckodriver: 8.0.0(@wdio/logger@10.2.0-alpha.100.sha-b38abd894) + get-port: 7.2.0 + import-meta-resolve: 4.2.0 + locate-app: 2.5.0 + mitt: 3.0.1 + safaridriver: 3.0.0 + split2: 4.2.0 + wait-port: 1.1.0 transitivePeerDependencies: - proxy-agent - supports-color @@ -10450,7 +10253,7 @@ snapshots: '@xmldom/xmldom@0.9.12': {} - '@zip.js/zip.js@2.20.0': {} + '@zip.js/zip.js@2.24.0': {} abort-controller@3.0.0: dependencies: @@ -10472,6 +10275,8 @@ snapshots: agent-base@7.1.4: {} + agent-base@9.0.0: {} + ajv-draft-04@1.0.0(ajv@8.20.0): optionalDependencies: ajv: 8.20.0 @@ -10712,25 +10517,25 @@ snapshots: b4a@1.9.0: {} - babel-jest@30.5.2(@babel/core@7.29.7(supports-color@11.0.0))(supports-color@11.0.0): + babel-jest@30.5.2(@babel/core@7.29.7): dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) - '@jest/transform': 30.5.2(supports-color@11.0.0) + '@babel/core': 7.29.7 + '@jest/transform': 30.5.2 '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 8.0.0(supports-color@11.0.0) - babel-preset-jest: 30.5.0(@babel/core@7.29.7(supports-color@11.0.0)) + babel-plugin-istanbul: 8.0.0 + babel-preset-jest: 30.5.0(@babel/core@7.29.7) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - babel-plugin-istanbul@8.0.0(supports-color@11.0.0): + babel-plugin-istanbul@8.0.0: dependencies: '@babel/helper-plugin-utils': 7.29.7 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.6 - istanbul-lib-instrument: 6.0.3(supports-color@11.0.0) + istanbul-lib-instrument: 6.0.3 test-exclude: 7.0.2 transitivePeerDependencies: - supports-color @@ -10739,30 +10544,30 @@ snapshots: dependencies: '@types/babel__core': 7.20.5 - babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.7(supports-color@11.0.0)): - dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.7(supports-color@11.0.0)) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.7(supports-color@11.0.0)) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.7(supports-color@11.0.0)) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.7(supports-color@11.0.0)) - '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.7(supports-color@11.0.0)) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.7(supports-color@11.0.0)) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.7(supports-color@11.0.0)) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.7(supports-color@11.0.0)) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7(supports-color@11.0.0)) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.7(supports-color@11.0.0)) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.7(supports-color@11.0.0)) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.7(supports-color@11.0.0)) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7(supports-color@11.0.0)) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.7(supports-color@11.0.0)) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.7(supports-color@11.0.0)) - - babel-preset-jest@30.5.0(@babel/core@7.29.7(supports-color@11.0.0)): - dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.7) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.7) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.7) + '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.7) + + babel-preset-jest@30.5.0(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 babel-plugin-jest-hoist: 30.5.0 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7(supports-color@11.0.0)) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) balanced-match@1.0.2: {} @@ -10956,7 +10761,7 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.6.2: {} + chalk@6.0.1: {} change-case@5.4.4: {} @@ -11011,6 +10816,10 @@ snapshots: dependencies: readdirp: 5.1.1 + chokidar@6.0.0: + dependencies: + readdirp: 5.1.1 + ci-info@3.3.0: {} ci-info@4.4.0: {} @@ -11090,8 +10899,6 @@ snapshots: dependencies: delayed-stream: 1.0.0 - commander@14.0.3: {} - commander@15.0.0: {} commander@4.1.1: {} @@ -11161,19 +10968,19 @@ snapshots: create-require@1.1.1: {} - create-wdio@10.0.2(@types/node@26.6.4): + create-wdio@10.2.0-alpha.100.sha-b38abd894(@types/node@26.6.4): dependencies: - chalk: 5.6.2 - commander: 14.0.3 + chalk: 6.0.1 + commander: 15.0.0 cross-spawn: 7.0.6 - ejs: 3.1.10 - execa: 9.6.1 + ejs: 7.0.2 + execa: 10.2.1 import-meta-resolve: 4.2.0 - inquirer: 12.11.1(@types/node@26.6.4) - normalize-package-data: 7.0.1 - read-pkg-up: 10.1.0 + inquirer: 14.2.5(@types/node@26.6.4) + normalize-package-data: 9.0.0 + read-package-up: 12.0.0 semver: 7.8.5 - type-fest: 4.41.0 + type-fest: 5.10.0 yargs: 18.2.0 transitivePeerDependencies: - '@types/node' @@ -11251,11 +11058,13 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - debug@3.2.7(supports-color@11.0.0): + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.4.3: dependencies: ms: 2.1.3 - optionalDependencies: - supports-color: 11.0.0 debug@4.4.3(supports-color@11.0.0): dependencies: @@ -11279,6 +11088,8 @@ snapshots: decamelize@6.0.1: {} + decamelize@7.0.0: {} + decimal.js@10.6.0: {} dedent@1.7.2: {} @@ -11386,7 +11197,10 @@ snapshots: dotenv@16.3.1: {} - dotenv@17.4.2: {} + dotenv@17.4.2: + optional: true + + dotenv@18.0.9: {} dunder-proto@1.0.1: dependencies: @@ -11409,39 +11223,19 @@ snapshots: optionalDependencies: wcwidth: 1.0.1 - edge-paths@3.0.5: - dependencies: - '@types/which': 2.0.2 - which: 2.0.2 - - edgedriver@7.0.0(supports-color@11.0.0): - dependencies: - '@wdio/logger': 9.29.1 - '@zip.js/zip.js': 2.20.0 - decamelize: 6.0.1 - edge-paths: 3.0.5 - http-proxy-agent: 7.0.2(supports-color@11.0.0) - https-proxy-agent: 7.0.6(supports-color@11.0.0) - which: 6.0.1 - transitivePeerDependencies: - - supports-color - - edgedriver@7.0.0(supports-color@5.5.0): + edgedriver@8.0.0(@wdio/logger@10.2.0-alpha.100.sha-b38abd894): dependencies: - '@wdio/logger': 9.29.1 - '@zip.js/zip.js': 2.20.0 + '@wdio/logger': 10.2.0-alpha.100.sha-b38abd894 + '@zip.js/zip.js': 2.24.0 decamelize: 6.0.1 - edge-paths: 3.0.5 - http-proxy-agent: 7.0.2(supports-color@5.5.0) - https-proxy-agent: 7.0.6(supports-color@5.5.0) - which: 6.0.1 - transitivePeerDependencies: - - supports-color + undici: 8.11.2 ejs@3.1.10: dependencies: jake: 10.9.4 + ejs@7.0.2: {} + electron-to-chromium@1.5.443: {} emittery@0.13.1: {} @@ -11742,40 +11536,40 @@ snapshots: escape-string-regexp@5.0.0: optional: true - eslint-config-prettier@10.1.8(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0)): + eslint-config-prettier@10.1.8(eslint@10.12.0(jiti@2.7.0)): dependencies: - eslint: 10.12.0(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.12.0(jiti@2.7.0) - eslint-import-resolver-node@0.3.10(supports-color@11.0.0): + eslint-import-resolver-node@0.3.10: dependencies: - debug: 3.2.7(supports-color@11.0.0) + debug: 3.2.7 is-core-module: 2.16.2 resolve: 2.0.0-next.7 transitivePeerDependencies: - supports-color - eslint-module-utils@2.13.0(@typescript-eslint/parser@8.71.0(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10(supports-color@11.0.0))(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): + eslint-module-utils@2.13.0(@typescript-eslint/parser@8.71.0(eslint@10.12.0(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.12.0(jiti@2.7.0)): dependencies: - debug: 3.2.7(supports-color@11.0.0) + debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.71.0(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)(typescript@6.0.3) - eslint: 10.12.0(jiti@2.7.0)(supports-color@11.0.0) - eslint-import-resolver-node: 0.3.10(supports-color@11.0.0) + '@typescript-eslint/parser': 8.71.0(eslint@10.12.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.12.0(jiti@2.7.0) + eslint-import-resolver-node: 0.3.10 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.71.0(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)(typescript@6.0.3))(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.71.0(eslint@10.12.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.12.0(jiti@2.7.0)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 - debug: 3.2.7(supports-color@11.0.0) + debug: 3.2.7 doctrine: 2.1.0 - eslint: 10.12.0(jiti@2.7.0)(supports-color@11.0.0) - eslint-import-resolver-node: 0.3.10(supports-color@11.0.0) - eslint-module-utils: 2.13.0(@typescript-eslint/parser@8.71.0(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10(supports-color@11.0.0))(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + eslint: 10.12.0(jiti@2.7.0) + eslint-import-resolver-node: 0.3.10 + eslint-module-utils: 2.13.0(@typescript-eslint/parser@8.71.0(eslint@10.12.0(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.12.0(jiti@2.7.0)) hasown: 2.0.4 is-core-module: 2.16.2 is-glob: 4.0.3 @@ -11787,28 +11581,28 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.71.0(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.71.0(eslint@10.12.0(jiti@2.7.0))(typescript@6.0.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0)))(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0))(prettier@3.9.9): + eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@10.12.0(jiti@2.7.0)))(eslint@10.12.0(jiti@2.7.0))(prettier@3.9.9): dependencies: - eslint: 10.12.0(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.12.0(jiti@2.7.0) prettier: 3.9.9 prettier-linter-helpers: 1.0.1 synckit: 0.11.13 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0)) + eslint-config-prettier: 10.1.8(eslint@10.12.0(jiti@2.7.0)) eslint-plugin-security@4.2.0: dependencies: safe-regex: 2.1.1 - eslint-plugin-unicorn@76.0.0(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0)): + eslint-plugin-unicorn@76.0.0(eslint@10.12.0(jiti@2.7.0)): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.12.0(jiti@2.7.0)) '@eslint/css-tree': 4.1.1 browserslist: 4.29.3 change-case: 5.4.4 @@ -11816,7 +11610,7 @@ snapshots: core-js-compat: 3.50.0 detect-indent: 7.0.2 entities: 8.1.0 - eslint: 10.12.0(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.12.0(jiti@2.7.0) find-up-simple: 1.0.1 globals: 17.12.0 identifier-regex: 1.1.0 @@ -11839,15 +11633,13 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.1: {} - eslint-visitor-keys@5.0.1: {} - eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0): + eslint@10.12.0(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.12.0(jiti@2.7.0)(supports-color@11.0.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.12.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.5(supports-color@11.0.0) + '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.7.0 '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.3 @@ -11857,7 +11649,7 @@ snapshots: '@types/estree': 1.0.9 ajv: 6.15.0 cross-spawn: 7.0.6 - debug: 4.4.3(supports-color@11.0.0) + debug: 4.4.3 escape-string-regexp: 4.0.0 eslint-scope: 9.1.2 eslint-visitor-keys: 5.0.1 @@ -11880,12 +11672,6 @@ snapshots: transitivePeerDependencies: - supports-color - espree@10.4.0: - dependencies: - acorn: 8.18.0 - acorn-jsx: 5.3.2(acorn@8.18.0) - eslint-visitor-keys: 4.2.1 - espree@11.2.0: dependencies: acorn: 8.18.0 @@ -11922,22 +11708,9 @@ snapshots: events@3.3.0: {} - execa@5.1.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - execa@9.6.1: + execa@10.2.1: dependencies: '@sindresorhus/merge-streams': 4.0.0 - cross-spawn: 7.0.6 figures: 6.1.0 get-stream: 9.0.1 human-signals: 8.0.1 @@ -11947,29 +11720,34 @@ snapshots: pretty-ms: 9.3.1 signal-exit: 4.1.0 strip-final-newline: 4.0.0 + which-command: 0.1.0 yoctocolors: 2.2.0 - exit-hook@4.0.0: {} + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + exit-hook@5.1.0: {} exit-x@0.2.2: {} expect-type@1.4.0: {} - expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0)): - dependencies: - '@vitest/snapshot': 5.0.3 - '@wdio/types': 10.0.1 - expect: 30.5.2 - jest-matcher-utils: 30.5.2 - webdriverio: 10.0.2(supports-color@11.0.0)(yauzl@2.10.0) - - expect-webdriverio@8.0.0(@wdio/types@10.0.1)(webdriverio@10.0.2(supports-color@5.5.0)(yauzl@2.10.0)): + expect-webdriverio@8.0.0(@wdio/types@10.2.0-alpha.100.sha-b38abd894)(webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0)): dependencies: '@vitest/snapshot': 5.0.3 - '@wdio/types': 10.0.1 + '@wdio/types': 10.2.0-alpha.100.sha-b38abd894 expect: 30.5.2 jest-matcher-utils: 30.5.2 - webdriverio: 10.0.2(supports-color@5.5.0)(yauzl@2.10.0) + webdriverio: 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) expect@30.5.2: dependencies: @@ -12104,11 +11882,6 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - find-up@6.3.0: - dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - fix-dts-default-cjs-exports@1.0.1: dependencies: magic-string: 0.30.21 @@ -12173,39 +11946,13 @@ snapshots: functions-have-names@1.2.3: {} - geckodriver@7.0.0(supports-color@11.0.0): - dependencies: - '@wdio/logger': 9.29.1 - '@zip.js/zip.js': 2.20.0 - decamelize: 6.0.1 - http-proxy-agent: 7.0.2(supports-color@11.0.0) - https-proxy-agent: 7.0.6(supports-color@11.0.0) - modern-tar: 0.8.5 - transitivePeerDependencies: - - supports-color - - geckodriver@7.0.0(supports-color@5.5.0): - dependencies: - '@wdio/logger': 9.29.1 - '@zip.js/zip.js': 2.20.0 - decamelize: 6.0.1 - http-proxy-agent: 7.0.2(supports-color@5.5.0) - https-proxy-agent: 7.0.6(supports-color@5.5.0) - modern-tar: 0.8.5 - transitivePeerDependencies: - - supports-color - - geckodriver@7.0.0(supports-color@8.1.1): + geckodriver@8.0.0(@wdio/logger@10.2.0-alpha.100.sha-b38abd894): dependencies: - '@wdio/logger': 9.29.1 - '@zip.js/zip.js': 2.20.0 + '@wdio/logger': 10.2.0-alpha.100.sha-b38abd894 + '@zip.js/zip.js': 2.24.0 decamelize: 6.0.1 - http-proxy-agent: 7.0.2(supports-color@8.1.1) - https-proxy-agent: 7.0.6(supports-color@8.1.1) modern-tar: 0.8.5 - transitivePeerDependencies: - - supports-color - optional: true + undici: 8.11.2 generator-function@2.0.1: {} @@ -12389,15 +12136,11 @@ snapshots: hookified@2.2.0: {} - hosted-git-info@2.8.9: {} - - hosted-git-info@7.0.2: + hosted-git-info@10.1.1: dependencies: - lru-cache: 10.4.3 + lru-cache: 11.5.3 - hosted-git-info@8.1.0: - dependencies: - lru-cache: 10.4.3 + hosted-git-info@2.8.9: {} hosted-git-info@9.0.3: dependencies: @@ -12430,46 +12173,27 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 - http-proxy-agent@7.0.2(supports-color@11.0.0): - dependencies: - agent-base: 7.1.4 - debug: 4.4.3(supports-color@11.0.0) - transitivePeerDependencies: - - supports-color - - http-proxy-agent@7.0.2(supports-color@5.5.0): - dependencies: - agent-base: 7.1.4 - debug: 4.4.3(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - - http-proxy-agent@7.0.2(supports-color@8.1.1): - dependencies: - agent-base: 7.1.4 - debug: 4.4.3(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - https-proxy-agent@7.0.6(supports-color@11.0.0): + http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 - debug: 4.4.3(supports-color@11.0.0) + debug: 4.4.3 transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.6(supports-color@5.5.0): + https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3 transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.6(supports-color@8.1.1): + https-proxy-agent@9.1.0: dependencies: - agent-base: 7.1.4 - debug: 4.4.3(supports-color@8.1.1) + agent-base: 9.0.0 + debug: 4.4.3 + proxy-agent-negotiate: 1.1.0 transitivePeerDependencies: + - kerberos - supports-color human-id@4.2.1: {} @@ -12536,15 +12260,14 @@ snapshots: ini@4.1.1: {} - inquirer@12.11.1(@types/node@26.6.4): + inquirer@14.2.5(@types/node@26.6.4): dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@26.6.4) - '@inquirer/prompts': 7.10.1(@types/node@26.6.4) - '@inquirer/type': 3.0.10(@types/node@26.6.4) - mute-stream: 2.0.0 + '@inquirer/ansi': 2.0.10 + '@inquirer/core': 12.0.6(@types/node@26.6.4) + '@inquirer/prompts': 8.7.5(@types/node@26.6.4) + '@inquirer/type': 4.2.1(@types/node@26.6.4) + mute-stream: 3.0.0 run-async: 4.0.6 - rxjs: 7.8.2 optionalDependencies: '@types/node': 26.6.4 @@ -12726,13 +12449,11 @@ snapshots: isexe@2.0.0: {} - isexe@4.0.0: {} - istanbul-lib-coverage@3.2.2: {} - istanbul-lib-instrument@6.0.3(supports-color@11.0.0): + istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 '@babel/parser': 7.29.9 '@istanbuljs/schema': 0.1.6 istanbul-lib-coverage: 3.2.2 @@ -12746,10 +12467,10 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@5.0.6(supports-color@11.0.0): + istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.31 - debug: 4.4.3(supports-color@11.0.0) + debug: 4.4.3 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -12777,10 +12498,10 @@ snapshots: jest-util: 30.5.1 p-limit: 3.1.0 - jest-circus@30.5.2(supports-color@11.0.0): + jest-circus@30.5.2: dependencies: '@jest/environment': 30.5.2 - '@jest/expect': 30.5.2(supports-color@11.0.0) + '@jest/expect': 30.5.2 '@jest/test-result': 30.5.2 '@jest/types': 30.5.1 '@types/node': 26.6.4 @@ -12791,8 +12512,8 @@ snapshots: jest-each: 30.5.2 jest-matcher-utils: 30.5.2 jest-message-util: 30.5.1 - jest-runtime: 30.5.2(supports-color@11.0.0) - jest-snapshot: 30.5.2(supports-color@11.0.0) + jest-runtime: 30.5.2 + jest-snapshot: 30.5.2 jest-util: 30.5.1 p-limit: 3.1.0 pretty-format: 30.5.1 @@ -12803,15 +12524,15 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.5.2(@types/node@26.6.4)(supports-color@11.0.0)(ts-node@10.9.2(@swc/core@1.16.13)(@swc/wasm@1.16.13)(@types/node@26.6.4)(typescript@6.0.3)): + jest-cli@30.5.2(@types/node@26.6.4)(ts-node@10.9.2(@swc/core@1.16.13)(@swc/wasm@1.16.13)(@types/node@26.6.4)(typescript@6.0.3)): dependencies: - '@jest/core': 30.5.2(supports-color@11.0.0)(ts-node@10.9.2(@swc/core@1.16.13)(@swc/wasm@1.16.13)(@types/node@26.6.4)(typescript@6.0.3)) + '@jest/core': 30.5.2(ts-node@10.9.2(@swc/core@1.16.13)(@swc/wasm@1.16.13)(@types/node@26.6.4)(typescript@6.0.3)) '@jest/test-result': 30.5.2 '@jest/types': 30.5.1 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.5.2(@types/node@26.6.4)(supports-color@11.0.0)(ts-node@10.9.2(@swc/core@1.16.13)(@swc/wasm@1.16.13)(@types/node@26.6.4)(typescript@6.0.3)) + jest-config: 30.5.2(@types/node@26.6.4)(ts-node@10.9.2(@swc/core@1.16.13)(@swc/wasm@1.16.13)(@types/node@26.6.4)(typescript@6.0.3)) jest-util: 30.5.1 jest-validate: 30.5.1 yargs: 17.7.3 @@ -12822,25 +12543,25 @@ snapshots: - supports-color - ts-node - jest-config@30.5.2(@types/node@26.6.4)(supports-color@11.0.0)(ts-node@10.9.2(@swc/core@1.16.13)(@swc/wasm@1.16.13)(@types/node@26.6.4)(typescript@6.0.3)): + jest-config@30.5.2(@types/node@26.6.4)(ts-node@10.9.2(@swc/core@1.16.13)(@swc/wasm@1.16.13)(@types/node@26.6.4)(typescript@6.0.3)): dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 '@jest/get-type': 30.5.0 '@jest/pattern': 30.5.0 '@jest/test-sequencer': 30.5.2 '@jest/types': 30.5.1 - babel-jest: 30.5.2(@babel/core@7.29.7(supports-color@11.0.0))(supports-color@11.0.0) + babel-jest: 30.5.2(@babel/core@7.29.7) chalk: 4.1.2 ci-info: 4.4.0 deepmerge: 4.3.1 glob: 13.0.6 graceful-fs: 4.2.11 - jest-circus: 30.5.2(supports-color@11.0.0) + jest-circus: 30.5.2 jest-docblock: 30.5.0 jest-environment-node: 30.5.2 jest-regex-util: 30.5.0 jest-resolve: 30.5.1 - jest-runner: 30.5.2(supports-color@11.0.0) + jest-runner: 30.5.2 jest-util: 30.5.1 jest-validate: 30.5.1 parse-json: 5.2.0 @@ -12932,10 +12653,10 @@ snapshots: jest-regex-util@30.5.0: {} - jest-resolve-dependencies@30.5.2(supports-color@11.0.0): + jest-resolve-dependencies@30.5.2: dependencies: jest-regex-util: 30.5.0 - jest-snapshot: 30.5.2(supports-color@11.0.0) + jest-snapshot: 30.5.2 transitivePeerDependencies: - supports-color @@ -12949,13 +12670,13 @@ snapshots: slash: 3.0.0 unrs-resolver: 1.12.2 - jest-runner@30.5.2(supports-color@11.0.0): + jest-runner@30.5.2: dependencies: '@jest/console': 30.5.2 '@jest/environment': 30.5.2 '@jest/source-map': 30.5.2 '@jest/test-result': 30.5.2 - '@jest/transform': 30.5.2(supports-color@11.0.0) + '@jest/transform': 30.5.2 '@jest/types': 30.5.1 '@types/node': 26.6.4 chalk: 4.1.2 @@ -12968,7 +12689,7 @@ snapshots: jest-leak-detector: 30.5.1 jest-message-util: 30.5.1 jest-resolve: 30.5.1 - jest-runtime: 30.5.2(supports-color@11.0.0) + jest-runtime: 30.5.2 jest-util: 30.5.1 jest-watcher: 30.5.2 jest-worker: 30.5.1 @@ -12976,14 +12697,14 @@ snapshots: transitivePeerDependencies: - supports-color - jest-runtime@30.5.2(supports-color@11.0.0): + jest-runtime@30.5.2: dependencies: '@jest/environment': 30.5.2 '@jest/fake-timers': 30.5.2 - '@jest/globals': 30.5.2(supports-color@11.0.0) + '@jest/globals': 30.5.2 '@jest/source-map': 30.5.2 '@jest/test-result': 30.5.2 - '@jest/transform': 30.5.2(supports-color@11.0.0) + '@jest/transform': 30.5.2 '@jest/types': 30.5.1 '@types/node': 26.6.4 chalk: 4.1.2 @@ -12997,26 +12718,26 @@ snapshots: jest-mock: 30.5.2 jest-regex-util: 30.5.0 jest-resolve: 30.5.1 - jest-snapshot: 30.5.2(supports-color@11.0.0) + jest-snapshot: 30.5.2 jest-util: 30.5.1 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - jest-snapshot@30.5.2(supports-color@11.0.0): + jest-snapshot@30.5.2: dependencies: - '@babel/core': 7.29.7(supports-color@11.0.0) + '@babel/core': 7.29.7 '@babel/generator': 7.29.8 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@11.0.0)) - '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7(supports-color@11.0.0)) + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) '@babel/types': 7.29.8 '@jest/expect-utils': 30.5.2 '@jest/get-type': 30.5.0 '@jest/snapshot-utils': 30.5.1 - '@jest/transform': 30.5.2(supports-color@11.0.0) + '@jest/transform': 30.5.2 '@jest/types': 30.5.1 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7(supports-color@11.0.0)) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) chalk: 4.1.2 expect: 30.5.2 graceful-fs: 4.2.11 @@ -13067,12 +12788,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.5.2(@types/node@26.6.4)(supports-color@11.0.0)(ts-node@10.9.2(@swc/core@1.16.13)(@swc/wasm@1.16.13)(@types/node@26.6.4)(typescript@6.0.3)): + jest@30.5.2(@types/node@26.6.4)(ts-node@10.9.2(@swc/core@1.16.13)(@swc/wasm@1.16.13)(@types/node@26.6.4)(typescript@6.0.3)): dependencies: - '@jest/core': 30.5.2(supports-color@11.0.0)(ts-node@10.9.2(@swc/core@1.16.13)(@swc/wasm@1.16.13)(@types/node@26.6.4)(typescript@6.0.3)) + '@jest/core': 30.5.2(ts-node@10.9.2(@swc/core@1.16.13)(@swc/wasm@1.16.13)(@types/node@26.6.4)(typescript@6.0.3)) '@jest/types': 30.5.1 import-local: 3.2.0 - jest-cli: 30.5.2(@types/node@26.6.4)(supports-color@11.0.0)(ts-node@10.9.2(@swc/core@1.16.13)(@swc/wasm@1.16.13)(@types/node@26.6.4)(typescript@6.0.3)) + jest-cli: 30.5.2(@types/node@26.6.4)(ts-node@10.9.2(@swc/core@1.16.13)(@swc/wasm@1.16.13)(@types/node@26.6.4)(typescript@6.0.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -13106,43 +12827,15 @@ snapshots: dependencies: argparse: 2.0.1 - jsdom@24.1.3(supports-color@11.0.0): - dependencies: - cssstyle: 4.6.0 - data-urls: 5.0.0 - decimal.js: 10.6.0 - form-data: 4.0.5 - html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2(supports-color@11.0.0) - https-proxy-agent: 7.0.6(supports-color@11.0.0) - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.23 - parse5: 7.3.0 - rrweb-cssom: 0.7.1 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.4 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 3.1.1 - whatwg-mimetype: 4.0.0 - whatwg-url: 14.2.0 - ws: 8.22.0 - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - jsdom@24.1.3(supports-color@8.1.1): + jsdom@24.1.3: dependencies: cssstyle: 4.6.0 data-urls: 5.0.0 decimal.js: 10.6.0 form-data: 4.0.5 html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2(supports-color@8.1.1) - https-proxy-agent: 7.0.6(supports-color@8.1.1) + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 nwsapi: 2.2.23 parse5: 7.3.0 @@ -13168,8 +12861,6 @@ snapshots: json-parse-even-better-errors@2.3.1: {} - json-parse-even-better-errors@3.0.2: {} - json-schema-ref-resolver@3.0.0: dependencies: dequal: 2.0.3 @@ -13347,8 +13038,6 @@ snapshots: lines-and-columns@1.2.4: {} - lines-and-columns@2.0.4: {} - lit-element@4.2.2: dependencies: '@lit-labs/ssr-dom-shim': 1.6.0 @@ -13396,10 +13085,6 @@ snapshots: dependencies: p-locate: 5.0.0 - locate-path@7.2.0: - dependencies: - p-locate: 6.0.0 - lodash.clonedeep@4.5.0: {} lodash.defaults@4.2.0: {} @@ -13593,11 +13278,11 @@ snapshots: supports-color: 8.1.1 workerpool: 10.0.3 - modern-node-polyfills@1.0.0(esbuild@0.14.54)(rollup@4.64.0): + modern-node-polyfills@1.0.0(esbuild@0.28.2)(rollup@4.64.0): dependencies: '@jspm/core': 2.1.0 '@rollup/pluginutils': 5.4.0(rollup@4.64.0) - esbuild: 0.14.54 + esbuild: 0.28.2 local-pkg: 0.4.3 transitivePeerDependencies: - rollup @@ -13606,7 +13291,7 @@ snapshots: ms@2.1.3: {} - mute-stream@2.0.0: {} + mute-stream@3.0.0: {} mz@2.7.0: dependencies: @@ -13628,52 +13313,7 @@ snapshots: dependencies: axe-core: 4.12.0 - nightwatch@3.16.0(@cucumber/cucumber@13.2.1)(geckodriver@7.0.0(supports-color@11.0.0))(supports-color@11.0.0): - dependencies: - '@nightwatch/chai': 5.0.3 - '@nightwatch/html-reporter-template': 0.3.0 - '@nightwatch/nightwatch-inspector': 1.0.1 - '@types/chai': 4.3.20 - '@types/selenium-webdriver': 4.35.6 - ansi-to-html: 0.7.2 - aria-query: 5.1.3 - assertion-error: 1.1.0 - boxen: 5.1.2 - chai-nightwatch: 0.5.3 - chalk: 4.1.2 - ci-info: 3.3.0 - cli-table3: 0.6.5 - devtools-protocol: 0.0.1140464 - didyoumean: 1.2.2 - dotenv: 16.3.1 - ejs: 3.1.10 - envinfo: 7.11.0 - glob: 7.2.3 - jsdom: 24.1.3(supports-color@11.0.0) - lodash: 4.18.1 - minimatch: 3.1.5 - minimist: 1.2.6 - mocha: 10.8.2 - nightwatch-axe-verbose: 2.5.1 - open: 8.4.2 - ora: 5.4.1 - piscina: 4.9.2 - selenium-webdriver: 4.27.0 - semver: 7.5.4 - stacktrace-parser: 0.1.10 - strip-ansi: 6.0.1 - untildify: 4.0.0 - uuid: 8.3.2 - optionalDependencies: - '@cucumber/cucumber': 13.2.1 - geckodriver: 7.0.0(supports-color@11.0.0) - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - - nightwatch@3.16.0(@cucumber/cucumber@13.2.1)(geckodriver@7.0.0(supports-color@8.1.1))(supports-color@8.1.1): + nightwatch@3.16.0(@cucumber/cucumber@13.2.1): dependencies: '@nightwatch/chai': 5.0.3 '@nightwatch/html-reporter-template': 0.3.0 @@ -13694,7 +13334,7 @@ snapshots: ejs: 3.1.10 envinfo: 7.11.0 glob: 7.2.3 - jsdom: 24.1.3(supports-color@8.1.1) + jsdom: 24.1.3 lodash: 4.18.1 minimatch: 3.1.5 minimist: 1.2.6 @@ -13711,7 +13351,6 @@ snapshots: uuid: 8.3.2 optionalDependencies: '@cucumber/cucumber': 13.2.1 - geckodriver: 7.0.0(supports-color@8.1.1) transitivePeerDependencies: - bufferutil - canvas @@ -13744,6 +13383,8 @@ snapshots: touch: 3.1.1 undefsafe: 2.0.5 + non-error@0.1.0: {} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 @@ -13751,21 +13392,15 @@ snapshots: semver: 5.7.2 validate-npm-package-license: 3.0.4 - normalize-package-data@6.0.2: - dependencies: - hosted-git-info: 7.0.2 - semver: 7.8.5 - validate-npm-package-license: 3.0.4 - - normalize-package-data@7.0.1: + normalize-package-data@8.0.0: dependencies: - hosted-git-info: 8.1.0 + hosted-git-info: 9.0.3 semver: 7.8.5 validate-npm-package-license: 3.0.4 - normalize-package-data@8.0.0: + normalize-package-data@9.0.0: dependencies: - hosted-git-info: 9.0.3 + hosted-git-info: 10.1.1 semver: 7.8.5 validate-npm-package-license: 3.0.4 @@ -13901,10 +13536,6 @@ snapshots: dependencies: yocto-queue: 0.1.0 - p-limit@4.0.0: - dependencies: - yocto-queue: 1.2.2 - p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -13913,10 +13544,6 @@ snapshots: dependencies: p-limit: 3.1.0 - p-locate@6.0.0: - dependencies: - p-limit: 4.0.0 - p-try@2.2.0: {} package-json-from-dist@1.0.1: {} @@ -13945,14 +13572,6 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse-json@7.1.1: - dependencies: - '@babel/code-frame': 7.29.7 - error-ex: 1.3.4 - json-parse-even-better-errors: 3.0.2 - lines-and-columns: 2.0.4 - type-fest: 3.13.1 - parse-json@8.3.0: dependencies: '@babel/code-frame': 7.29.7 @@ -13978,8 +13597,6 @@ snapshots: path-exists@4.0.0: {} - path-exists@5.0.0: {} - path-is-absolute@1.0.1: {} path-key@2.0.1: {} @@ -14088,11 +13705,11 @@ snapshots: read-cache: 1.0.2 resolve: 1.22.12 - postcss-lit@1.4.1(jiti@2.7.0)(postcss@8.5.28)(supports-color@11.0.0)(tsx@4.23.15)(yaml@2.9.1): + postcss-lit@1.4.1(jiti@2.7.0)(postcss@8.5.28)(tsx@4.23.15)(yaml@2.9.1): dependencies: '@babel/generator': 7.29.7 '@babel/parser': 7.29.9 - '@babel/traverse': 7.29.8(supports-color@11.0.0) + '@babel/traverse': 7.29.8 lilconfig: 3.1.3 postcss: 8.5.28 postcss-load-config: 6.0.1(jiti@2.7.0)(postcss@8.5.28)(tsx@4.23.15)(yaml@2.9.1) @@ -14111,6 +13728,15 @@ snapshots: tsx: 4.23.15 yaml: 2.9.1 + postcss-load-config@6.0.1(jiti@2.7.0)(postcss@8.5.32)(tsx@4.23.15)(yaml@2.9.1): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 2.7.0 + postcss: 8.5.32 + tsx: 4.23.15 + yaml: 2.9.1 + postcss-safe-parser@7.1.0(postcss@8.5.28): dependencies: postcss: 8.5.28 @@ -14151,6 +13777,8 @@ snapshots: '@jest/schemas': 30.5.0 ansi-styles: 5.2.0 + pretty-ms@10.0.0: {} + pretty-ms@9.3.1: dependencies: parse-ms: 4.0.0 @@ -14165,6 +13793,8 @@ snapshots: property-expr@2.0.6: {} + proxy-agent-negotiate@1.1.0: {} + psl@1.15.0: dependencies: punycode: 2.3.1 @@ -14213,12 +13843,6 @@ snapshots: read-pkg: 10.1.0 type-fest: 5.8.0 - read-pkg-up@10.1.0: - dependencies: - find-up: 6.3.0 - read-pkg: 8.1.0 - type-fest: 4.41.0 - read-pkg@10.1.0: dependencies: '@types/normalize-package-data': 2.4.4 @@ -14233,13 +13857,6 @@ snapshots: normalize-package-data: 2.5.0 path-type: 3.0.0 - read-pkg@8.1.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 6.0.2 - parse-json: 7.1.1 - type-fest: 4.41.0 - readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -14432,11 +14049,7 @@ snapshots: dependencies: queue-microtask: 1.2.3 - rxjs@7.8.2: - dependencies: - tslib: 2.8.1 - - safaridriver@2.0.0: {} + safaridriver@3.0.0: {} safe-array-concat@1.1.4: dependencies: @@ -14520,9 +14133,10 @@ snapshots: semver@7.8.5: {} - serialize-error@12.0.0: + serialize-error@13.0.2: dependencies: - type-fest: 4.41.0 + non-error: 0.1.0 + type-fest: 5.10.0 serialize-javascript@6.0.2: dependencies: @@ -14792,16 +14406,16 @@ snapshots: style-mod@4.1.4: {} - stylelint-config-recommended@18.0.0(stylelint@17.16.0(supports-color@11.0.0)(typescript@6.0.3)): + stylelint-config-recommended@18.0.0(stylelint@17.16.0(typescript@6.0.3)): dependencies: - stylelint: 17.16.0(supports-color@11.0.0)(typescript@6.0.3) + stylelint: 17.16.0(typescript@6.0.3) - stylelint-config-tailwindcss@1.0.1(stylelint@17.16.0(supports-color@11.0.0)(typescript@6.0.3))(tailwindcss@4.3.3): + stylelint-config-tailwindcss@1.0.1(stylelint@17.16.0(typescript@6.0.3))(tailwindcss@4.3.3): dependencies: - stylelint: 17.16.0(supports-color@11.0.0)(typescript@6.0.3) + stylelint: 17.16.0(typescript@6.0.3) tailwindcss: 4.3.3 - stylelint@17.16.0(supports-color@11.0.0)(typescript@6.0.3): + stylelint@17.16.0(typescript@6.0.3): dependencies: '@csstools/css-calc': 3.4.2(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) '@csstools/css-parser-algorithms': 4.0.2(@csstools/css-tokenizer@4.0.2) @@ -14814,7 +14428,7 @@ snapshots: cosmiconfig: 9.0.2(typescript@6.0.3) css-functions-list: 3.3.3 css-tree: 3.2.1 - debug: 4.4.3(supports-color@11.0.0) + debug: 4.4.3 fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 file-entry-cache: 11.1.5 @@ -14929,6 +14543,12 @@ snapshots: glob: 10.5.0 minimatch: 10.2.6 + test-exclude@8.0.0: + dependencies: + '@istanbuljs/schema': 0.1.6 + glob: 13.0.6 + minimatch: 10.2.6 + text-decoder@1.2.7: dependencies: b4a: 1.9.0 @@ -15033,18 +14653,18 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.1(@microsoft/api-extractor@7.59.3(@types/node@26.6.4))(@swc/core@1.16.13)(jiti@2.7.0)(postcss@8.5.28)(supports-color@11.0.0)(tsx@4.23.15)(typescript@6.0.3)(yaml@2.9.1): + tsup@8.5.1(@microsoft/api-extractor@7.59.3(@types/node@26.6.4))(@swc/core@1.16.13)(jiti@2.7.0)(postcss@8.5.32)(tsx@4.23.15)(typescript@6.0.3)(yaml@2.9.1): dependencies: bundle-require: 5.1.0(esbuild@0.27.7) cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.2 - debug: 4.4.3(supports-color@11.0.0) + debug: 4.4.3 esbuild: 0.27.7 fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.7.0)(postcss@8.5.28)(tsx@4.23.15)(yaml@2.9.1) + postcss-load-config: 6.0.1(jiti@2.7.0)(postcss@8.5.32)(tsx@4.23.15)(yaml@2.9.1) resolve-from: 5.0.0 rollup: 4.64.0 source-map: 0.7.6 @@ -15055,37 +14675,7 @@ snapshots: optionalDependencies: '@microsoft/api-extractor': 7.59.3(@types/node@26.6.4) '@swc/core': 1.16.13 - postcss: 8.5.28 - typescript: 6.0.3 - transitivePeerDependencies: - - jiti - - supports-color - - tsx - - yaml - - tsup@8.5.1(@microsoft/api-extractor@7.59.3(@types/node@26.6.4))(@swc/core@1.16.13)(jiti@2.7.0)(postcss@8.5.28)(supports-color@5.5.0)(tsx@4.23.15)(typescript@6.0.3)(yaml@2.9.1): - dependencies: - bundle-require: 5.1.0(esbuild@0.27.7) - cac: 6.7.14 - chokidar: 4.0.3 - consola: 3.4.2 - debug: 4.4.3(supports-color@5.5.0) - esbuild: 0.27.7 - fix-dts-default-cjs-exports: 1.0.1 - joycon: 3.1.1 - picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.7.0)(postcss@8.5.28)(tsx@4.23.15)(yaml@2.9.1) - resolve-from: 5.0.0 - rollup: 4.64.0 - source-map: 0.7.6 - sucrase: 3.35.1 - tinyexec: 0.3.2 - tinyglobby: 0.2.17 - tree-kill: 1.2.2 - optionalDependencies: - '@microsoft/api-extractor': 7.59.3(@types/node@26.6.4) - '@swc/core': 1.16.13 - postcss: 8.5.28 + postcss: 8.5.32 typescript: 6.0.3 transitivePeerDependencies: - jiti @@ -15113,12 +14703,14 @@ snapshots: type-fest@2.19.0: {} - type-fest@3.13.1: {} - type-fest@4.26.0: {} type-fest@4.41.0: {} + type-fest@5.10.0: + dependencies: + tagged-tag: 1.0.0 + type-fest@5.8.0: dependencies: tagged-tag: 1.0.0 @@ -15185,6 +14777,8 @@ snapshots: undici@8.11.2: {} + undici@8.12.3: {} + unicorn-magic@0.3.0: {} unicorn-magic@0.4.1: {} @@ -15213,12 +14807,12 @@ snapshots: universalify@2.0.1: {} - unplugin-dts@1.1.2(@microsoft/api-extractor@7.59.3(@types/node@26.6.4))(esbuild@0.28.2)(rolldown@1.2.16)(rollup@4.64.0)(supports-color@11.0.0)(typescript@6.0.3)(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): + unplugin-dts@1.1.2(@microsoft/api-extractor@7.59.3(@types/node@26.6.4))(esbuild@0.28.2)(rolldown@1.2.16)(rollup@4.64.0)(typescript@6.0.3)(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): dependencies: '@rollup/pluginutils': 5.4.0(rollup@4.64.0) '@volar/typescript': 2.4.28 compare-versions: 6.1.1 - debug: 4.4.3(supports-color@11.0.0) + debug: 4.4.3 glob-to-regexp: 0.4.1 kolorist: 1.8.0 local-pkg: 1.2.1 @@ -15355,9 +14949,9 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vite-plugin-dts@5.1.2(@microsoft/api-extractor@7.59.3(@types/node@26.6.4))(esbuild@0.28.2)(rolldown@1.2.16)(rollup@4.64.0)(supports-color@11.0.0)(typescript@6.0.3)(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): + vite-plugin-dts@5.1.2(@microsoft/api-extractor@7.59.3(@types/node@26.6.4))(esbuild@0.28.2)(rolldown@1.2.16)(rollup@4.64.0)(typescript@6.0.3)(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): dependencies: - unplugin-dts: 1.1.2(@microsoft/api-extractor@7.59.3(@types/node@26.6.4))(esbuild@0.28.2)(rolldown@1.2.16)(rollup@4.64.0)(supports-color@11.0.0)(typescript@6.0.3)(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) + unplugin-dts: 1.1.2(@microsoft/api-extractor@7.59.3(@types/node@26.6.4))(esbuild@0.28.2)(rolldown@1.2.16)(rollup@4.64.0)(typescript@6.0.3)(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) optionalDependencies: '@microsoft/api-extractor': 7.59.3(@types/node@26.6.4) rollup: 4.64.0 @@ -15371,17 +14965,17 @@ snapshots: - typescript - webpack - vite-plugin-istanbul@7.2.1(supports-color@11.0.0)(vite@8.3.5(@types/node@26.6.4)(esbuild@0.14.54)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): + vite-plugin-istanbul@9.0.1(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): dependencies: '@babel/generator': 7.29.8 '@istanbuljs/load-nyc-config': 1.1.0 - '@types/babel__generator': 7.6.8 - espree: 10.4.0 - istanbul-lib-instrument: 6.0.3(supports-color@11.0.0) + '@types/babel__generator': 7.27.0 + espree: 11.2.0 + istanbul-lib-instrument: 6.0.3 picocolors: 1.1.1 source-map: 0.7.6 - test-exclude: 7.0.2 - vite: 8.3.5(@types/node@26.6.4)(esbuild@0.14.54)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) + test-exclude: 8.0.0 + vite: 8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) transitivePeerDependencies: - supports-color @@ -15392,32 +14986,17 @@ snapshots: optionalDependencies: rollup: 4.64.0 - vite-plugin-top-level-await@1.6.0(rollup@4.64.0)(vite@8.3.5(@types/node@26.6.4)(esbuild@0.14.54)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): + vite-plugin-top-level-await@1.6.0(rollup@4.64.0)(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): dependencies: '@rollup/plugin-virtual': 3.0.2(rollup@4.64.0) '@swc/core': 1.16.13 '@swc/wasm': 1.16.13 uuid: 10.0.0 - vite: 8.3.5(@types/node@26.6.4)(esbuild@0.14.54)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) + vite: 8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1) transitivePeerDependencies: - '@swc/helpers' - rollup - vite@8.3.5(@types/node@26.6.4)(esbuild@0.14.54)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1): - dependencies: - lightningcss: 1.33.0 - picomatch: 4.0.7 - postcss: 8.5.32 - rolldown: 1.2.16 - tinyglobby: 0.2.17 - optionalDependencies: - '@types/node': 26.6.4 - esbuild: 0.14.54 - fsevents: 2.3.3 - jiti: 2.7.0 - tsx: 4.23.15 - yaml: 2.9.1 - vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1): dependencies: lightningcss: 1.33.0 @@ -15433,7 +15012,7 @@ snapshots: tsx: 4.23.15 yaml: 2.9.1 - vitest@5.0.3(@types/node@26.6.4)(@vitest/coverage-v8@5.0.3)(happy-dom@20.14.5)(jsdom@24.1.3(supports-color@11.0.0))(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): + vitest@5.0.3(@types/node@26.6.4)(@vitest/coverage-v8@5.0.3)(happy-dom@20.14.5)(jsdom@24.1.3)(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)): dependencies: '@types/chai': 5.2.3 '@vitest/mocker': 5.0.3(vite@8.3.5(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)(yaml@2.9.1)) @@ -15453,7 +15032,7 @@ snapshots: '@types/node': 26.6.4 '@vitest/coverage-v8': 5.0.3(vitest@5.0.3) happy-dom: 20.14.5 - jsdom: 24.1.3(supports-color@11.0.0) + jsdom: 24.1.3 transitivePeerDependencies: - msw @@ -15465,19 +15044,11 @@ snapshots: dependencies: xml-name-validator: 5.0.0 - wait-port@1.1.0(supports-color@11.0.0): - dependencies: - chalk: 4.1.2 - commander: 9.5.0 - debug: 4.4.3(supports-color@11.0.0) - transitivePeerDependencies: - - supports-color - - wait-port@1.1.0(supports-color@5.5.0): + wait-port@1.1.0: dependencies: chalk: 4.1.2 commander: 9.5.0 - debug: 4.4.3(supports-color@5.5.0) + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -15485,56 +15056,37 @@ snapshots: dependencies: defaults: 1.0.4 - webdriver@10.0.2(supports-color@11.0.0)(yauzl@2.10.0): - dependencies: - '@types/node': 26.6.4 - '@types/ws': 8.18.2 - '@wdio/config': 10.0.1(supports-color@11.0.0)(yauzl@2.10.0) - '@wdio/logger': 10.0.0 - '@wdio/protocols': 10.0.2 - '@wdio/types': 10.0.1 - '@wdio/utils': 10.0.1(supports-color@11.0.0)(yauzl@2.10.0) - deepmerge-ts: 8.0.2 - https-proxy-agent: 7.0.6(supports-color@11.0.0) - undici: 8.11.2 - ws: 8.22.0 - transitivePeerDependencies: - - bufferutil - - proxy-agent - - supports-color - - utf-8-validate - - yauzl - - webdriver@10.0.2(supports-color@5.5.0)(yauzl@2.10.0): + webdriver@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0): dependencies: '@types/node': 26.6.4 '@types/ws': 8.18.2 - '@wdio/config': 10.0.1(supports-color@5.5.0)(yauzl@2.10.0) - '@wdio/logger': 10.0.0 - '@wdio/protocols': 10.0.2 - '@wdio/types': 10.0.1 - '@wdio/utils': 10.0.1(supports-color@5.5.0)(yauzl@2.10.0) + '@wdio/config': 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) + '@wdio/logger': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/protocols': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/types': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/utils': 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) deepmerge-ts: 8.0.2 - https-proxy-agent: 7.0.6(supports-color@5.5.0) - undici: 8.11.2 + https-proxy-agent: 9.1.0 + undici: 8.12.3 ws: 8.22.0 transitivePeerDependencies: - bufferutil + - kerberos - proxy-agent - supports-color - utf-8-validate - yauzl - webdriverio@10.0.2(supports-color@11.0.0)(yauzl@2.10.0): + webdriverio@10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0): dependencies: '@types/node': 26.6.4 - '@types/sinonjs__fake-timers': 8.1.5 - '@wdio/config': 10.0.1(supports-color@11.0.0)(yauzl@2.10.0) - '@wdio/logger': 10.0.0 - '@wdio/protocols': 10.0.2 - '@wdio/repl': 10.0.0 - '@wdio/types': 10.0.1 - '@wdio/utils': 10.0.1(supports-color@11.0.0)(yauzl@2.10.0) + '@types/sinonjs__fake-timers': 15.0.1 + '@wdio/config': 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) + '@wdio/logger': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/protocols': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/repl': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/types': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/utils': 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) archiver: 8.0.0 aria-query: 5.3.2 cheerio: 1.2.0 @@ -15547,48 +15099,14 @@ snapshots: lodash.clonedeep: 4.5.0 query-selector-shadow-dom: 1.0.1 rgb2hex: 0.2.5 - serialize-error: 12.0.0 + serialize-error: 13.0.2 urlpattern-polyfill: 10.1.0 - webdriver: 10.0.2(supports-color@11.0.0)(yauzl@2.10.0) - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - bufferutil - - proxy-agent - - react-native-b4a - - supports-color - - utf-8-validate - - yauzl - - webdriverio@10.0.2(supports-color@5.5.0)(yauzl@2.10.0): - dependencies: - '@types/node': 26.6.4 - '@types/sinonjs__fake-timers': 8.1.5 - '@wdio/config': 10.0.1(supports-color@5.5.0)(yauzl@2.10.0) - '@wdio/logger': 10.0.0 - '@wdio/protocols': 10.0.2 - '@wdio/repl': 10.0.0 - '@wdio/types': 10.0.1 - '@wdio/utils': 10.0.1(supports-color@5.5.0)(yauzl@2.10.0) - archiver: 8.0.0 - aria-query: 5.3.2 - cheerio: 1.2.0 - css-shorthand-properties: 1.1.2 - css-value: 0.0.1 - grapheme-splitter: 1.0.4 - htmlfy: 0.8.1 - is-plain-obj: 4.1.0 - jszip: 3.10.2 - lodash.clonedeep: 4.5.0 - query-selector-shadow-dom: 1.0.1 - rgb2hex: 0.2.5 - serialize-error: 12.0.0 - urlpattern-polyfill: 10.1.0 - webdriver: 10.0.2(supports-color@5.5.0)(yauzl@2.10.0) + webdriver: 10.2.0-alpha.100.sha-b38abd894(yauzl@2.10.0) transitivePeerDependencies: - bare-abort-controller - bare-buffer - bufferutil + - kerberos - proxy-agent - react-native-b4a - supports-color @@ -15643,6 +15161,8 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 + which-command@0.1.0: {} + which-typed-array@1.1.21: dependencies: available-typed-arrays: 1.0.7 @@ -15661,10 +15181,6 @@ snapshots: dependencies: isexe: 2.0.0 - which@6.0.1: - dependencies: - isexe: 4.0.0 - why-is-node-running@3.2.1: {} widest-line@3.1.0: @@ -15677,12 +15193,6 @@ snapshots: workerpool@6.5.1: {} - wrap-ansi@6.2.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -15786,10 +15296,6 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.2.2: {} - - yoctocolors-cjs@2.1.3: {} - yoctocolors@2.2.0: {} yup@1.7.1: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8c6a5084..c20428d3 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -21,3 +21,25 @@ overrides: vite: ^8.0.7 '@types/node': 26.6.4 '@codemirror/state': 6.5.4 + webdriverio: 10.2.0-alpha.100.sha-b38abd894 + webdriver: 10.2.0-alpha.100.sha-b38abd894 + '@wdio/allure-reporter': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/browser-runner': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/cli': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/config': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/cucumber-framework': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/display-server': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/dot-reporter': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/globals': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/local-runner': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/logger': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/mocha-framework': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/protocols': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/repl': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/reporter': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/runner': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/session': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/snapshot': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/spec-reporter': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/types': 10.2.0-alpha.100.sha-b38abd894 + '@wdio/utils': 10.2.0-alpha.100.sha-b38abd894